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

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.

--=-=-=--