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----- --===-=-=--