From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 40F225D5 for ; Tue, 29 Mar 2022 07:43:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=lUfYXV95ZcWYPlNhk0i4jas3VD7abJspU0RetC0M3Io=; b=jyiELZglpPUIv8kb7yglhIPf0nPwFIliwAqxA2jHJBcXOhAjsVU0FJsJ MvrL+lTouPx8Ht61nzIxQPqDWJurnd83efS07cT54cUSz2k1KSglNJ6LW Zx2cBQ4yNO0qj5cPRlwifyY4ETJiH8cqejwNkdaR1y2tRBdsvzP2bgOHO U=; 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@sympa.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.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 ip4:192.134.164.0/24 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="5.90,219,1643670000"; d="scan'208,217";a="28817452" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Mar 2022 09:43:05 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id F1FE3E4373; Tue, 29 Mar 2022 09:43:04 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6E700E436E for ; Tue, 29 Mar 2022 09:43:01 +0200 (CEST) IronPort-SDR: db9HOE3fLL2ByGjKQzCJIog5krdV4YECjveBiI8oT5mcj0sKiqwNlVhiPm25tfYvv7OgRma7OH ARHN6j/h07XteWjw1td+dzs4vgibpMPRSqe55vGFHTmsFf9RkQ/UG4HFduHW8CSNLHzBmpCWcF 2L5FgSJxfIEQVuWWPQvIa+9y5EiuUrWJqNtXh75DGZqtGOxJZqkf95zlxsglp5YBtQ0elrcfmw Z6ra5MGMKYlwVQq9oGUNaknGQdqt12SF21j/6xEj50Q8p6WZc1FunMyvpjM7FV/n1TCiqUT5CB TGAgBNJ5h3JAAJFVrhxPVLHG X-IPAS-Result: =?us-ascii?q?A0CWAQCPt0JimCIeaIFagRWCb1kGKBkBXgZXKwcIRIRUi?= =?us-ascii?q?QYJiAmBFoIVhiKGeIw2gREDTxABAwENLAEOBQECBAEBghKCbwQCAhcGNAmDd?= =?us-ascii?q?gIeBgEFMxMBAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBA?= =?us-ascii?q?QEJCwkHBgwFEA4FPGRkBIFLBIF0CwcBByUNgjUMDAMDAYNwBAIBGAEIBAY+J?= =?us-ascii?q?xQPAxQBBgMCBA0BFwEUCgMUARIUBoJqAYJ1IQQBCpJemkMaJRB6fzKBAYNPA?= =?us-ascii?q?QMCAQILAwEOCSaDc4ESUw0CFIEZhhQUQ0sBgwIJgRSCcgIHIBCBVUSBFYIpS?= =?us-ascii?q?gdugVABcAMIFwEBAQEBgR8BGwEBEUWCZIJlBJd9Jg4gEQcFAREwDRMBEwcEB?= =?us-ascii?q?QsHIgEBFA4sAgYCIQIKCwEKBRQcDgYEGwEBIgUGBQMDBwYtkXcCEA4DGg0CA?= =?us-ascii?q?Y1BgUGJIoJdkUAZYTQHg0yBOwYMh0BmgR2Mdogig3SBT4pmhl2QUHAhljwIG?= =?us-ascii?q?IIphXV8gRAJgX9ElA8bDQgYhRiBTiprYgEbAgwHMxowQ4I1ATMJRQEDAg0BA?= =?us-ascii?q?gIDAQIBAgkBAQJUdYZVhggDFoEEAQhIgXuBPoEmgSRRO4RkaD80AQEBAQEzA?= =?us-ascii?q?gYBCgEBAwmFYwEBBRMLAYkRLYIZAQE?= IronPort-PHdr: A9a23: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 IUDcI4XU5jVEqRZPpOcuDsz5qypzWXWqWlUjQ== IronPort-Data: A9a23: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 28JSw+/Lw== IronPort-HdrOrdr: A9a23:b6yc86GpbbVAxnV9pLqE78eALOsnbusQ8zAXPiFKKSC9Hfb2qy nDpp4mPHzP6Qr5OktPpTnoAsDpKk80nqQY3WB+B9qfdTijkFTtBoBv54nvzlTbak7D398Y87 xvN4x3CNiYNykesS8W2njbL+od X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,219,1643670000"; d="scan'208,217";a="28817404" X-MGA-submission: =?us-ascii?q?MDHZFMwZn2cK09fufnMz9BWkgWTcr+ANaepn0r?= =?us-ascii?q?rJSPOv32NCD259CW5/Y5wbJ8FRY8x/qZFZXGzRjxt4L9yzo5qm1SOHK5?= =?us-ascii?q?WiCViisab+UZXBcjsDrQne3h9+OGISwNOkCP/qMv4vqT/7Lwu8l4Z7Zj?= =?us-ascii?q?JmIUGjMVWceJXBRFWVcBVT9w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Mar 2022 09:43:00 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1EE695605C5; Tue, 29 Mar 2022 09:42:59 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 29 Mar 2022 09:42:58 +0200 Message-ID: <87r16l5hml.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 29 09:42:59 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.045321, queueID=9867F5605C6 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18735 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/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMjIgdG8gMjksDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnB5bWxfYmlu ZGdlbjogYSBDTEkgYXBwIHRvIGdlbmVyYXRlIFB5dGhvbiBiaW5kaW5ncyBkaXJlY3RseSBmcm9t IE9DYW1sIHZhbHVlIHNwZWNpZmljYXRpb25zDQpUYXJpZGVzIGlzIGhpcmluZyENCkZvciBEaXZl cnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJlYWNoeSBTdW1tZXIgMjAyMg0KQ2Fx dGkgMS44LjAgYW5kIHJlbGF0ZWQgbmV3cw0KRmlyc3QgcmVsZWFzZSBvZiBwcmJubWNuLWRhZ2dl cg0KTWlyYWdlT1MgNC4wDQpPQ2FtbCA0LjE0LjAgaXMgcmVsZWFzZWQNCm9jYW1sLWluLXB5dGhv bi4wLjEuMDogRWZmb3J0bGVzcyBQeXRob24gYmluZGluZ3MgZm9yIE9DYW1sIG1vZHVsZXMNCk9s ZCBDV04NCg0KDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0byBnZW5lcmF0ZSBQeXRob24gYmlu ZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVjaWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHltbC1iaW5kZ2VuLWEtY2xpLWFwcC10 by1nZW5lcmF0ZS1weXRob24tYmluZGluZ3MtZGlyZWN0bHktZnJvbS1vY2FtbC12YWx1ZS1zcGVj aWZpY2F0aW9ucy84Nzg2LzY+DQoNCg0KUnlhbiBNb29yZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpOZXcg cmVsZWFzZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFZlcnNp b24gMC4zLjAgYW5kIDAuMy4xIGFyZSBub3cgYXZhaWxhYmxlIG9uIFtHaXRIdWJdLiAgMC4zLjAg aGFzIGJlZW4NCiAgbWVyZ2VkIGludG8gb3BhbSwgYW5kIGEgUFIgZm9yIDAuMy4xIGhhcyBiZWVu IG9wZW5lZC4gIFRoZSBbY2hhbmdlDQogIGxvZ10gaGFzIG1vcmUgZGV0YWlscyBhYm91dCB0aGUg Y2hhbmdlcy4NCg0KDQpbR2l0SHViXSA8aHR0cHM6Ly9naXRodWIuY29tL21vb3Jlcnlhbi9vY2Ft bF9weXRob25fYmluZGdlbi90YWdzPg0KDQpbY2hhbmdlIGxvZ10NCjxodHRwczovL2dpdGh1Yi5j b20vbW9vcmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuL2Jsb2IvbWFpbi9DSEFOR0VMT0cubWQ+ DQoNCg0KQmluZGluZyB0dXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFlvdSBjYW4gbm93IGJpbmQgdHVwbGVzIGRpcmVjdGx5LiAgSGVyZSdzIGEg UHl0aG9uIGZ1bmN0aW9uIHRoYXQgdGFrZXMNCiAgdHdvIGxpc3RzIG9mIHBvaW50cyAod2hlcmUg ZWFjaCAicG9pbnQiIGlzIGEgdHVwbGUgbGlrZSBgKHgsIHkpJykgYW5kDQogIGFkZHMgdGhlbSB0 b2dldGhlcg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZGVmIGFkZChwb2ludHMxLCBwb2lu dHMyKToNCiAg4pSCICAgICByZXR1cm4gWyh4MSArIHkxLCB4MiArIHkyKSBmb3IgKHgxLCB4Miks ICh5MSwgeTIpIGluIHppcChwb2ludHMxLCBwb2ludHMyKV0NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgQW5kIHlvdSBjb3VsZCBiaW5kIGl0IHVzaW5nIHR1cGxlcyBmcm9tIHRoZSBPQ2FtbCBzaWRl IGFzIHdlbGwuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2YWwgYWRkIDogcG9pbnRzMToo aW50ICogaW50KSBsaXN0IC0+IHBvaW50czI6KGludCAqIGludCkgbGlzdCAtPiB1bml0IC0+IChp bnQgKiBpbnQpIGxpc3QNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTm90ZSB0aGVyZSBhcmUgc29t ZSByZXN0cmljdGlvbnMgcmVnYXJkaW5nIHR1cGxlcywgd2hpY2ggeW91IGNhbiByZWFkDQogIGFi b3V0IFtoZXJlXSwgW2hlcmVdLCBvciBbaGVyZV0uDQoNCg0KW2hlcmVdIDxodHRwczovL21vb3Jl cnlhbi5naXRodWIuaW8vb2NhbWxfcHl0aG9uX2JpbmRnZW4vdHVwbGVzLz4NCg0KW2hlcmVdDQo8 aHR0cHM6Ly9naXRodWIuY29tL21vb3Jlcnlhbi9vY2FtbF9weXRob25fYmluZGdlbi9ibG9iL21h aW4vZXhhbXBsZXMvUkVBRE1FLm1kPg0KDQpbaGVyZV0NCjxodHRwczovL2dpdGh1Yi5jb20vbW9v cmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuL2Jsb2IvbWFpbi9DSEFOR0VMT0cubWQjMDMwLTIw MjItMDMtMTg+DQoNCg0KQXR0cmlidXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgWW91IGNhbiB1c2UgYXR0cmlidXRlcyBvbiB2YWx1ZSBzcGVjaWZpY2F0aW9ucy4gIEN1 cnJlbnRseSB0aGUgb25seQ0KICBvbmUgc3VwcG9ydGVkIGlzIGBweV9mdW5fbmFtZScsIHdoaWNo IGFsbG93cyB5b3UgdG8gZGVjb3VwbGUgdGhlDQogIFB5dGhvbiBtZXRob2QgbmFtZSBhbmQgdGhl IGdlbmVyYXRlZCBPQ2FtbCBmdW5jdGlvbiBuYW1lLg0KDQogIEFzIGFuIGV4YW1wbGUsIHRha2Ug dGhlIGZvbGxvd2luZyBQeXRob24gZnVuY3Rpb24sIHdoaWNoIGFkZHMgdG8NCiAgInRoaW5ncyIu DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBkZWYgYWRkKHgsIHkpOg0KICDilIIgICAgIHJl dHVybiB4ICsgeQ0KICDilJTilIDilIDilIDilIANCg0KICBZb3UgY291bGQgYmluZCBtdWx0aXBs ZSBPQ2FtbCBmdW5jdGlvbnMgdG8gdGhpcyBzaW5nbGUgZnVuY3Rpb24gbm93Lg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdmFsIGFkZF9pbnQgOiB4OmludCAtPiB5OmludCAtPiB1bml0IC0+ IGludA0KICDilIIgW0BAcHlfZnVuX25hbWUgYWRkXQ0KICDilIIgDQogIOKUgiB2YWwgYWRkX2Zs b2F0IDogeDpmbG9hdCAtPiB5OmZsb2F0IC0+IHVuaXQgLT4gZmxvYXQNCiAg4pSCIFtAQHB5X2Z1 bl9uYW1lIGFkZF0NCiAg4pSCIA0KICDilIIgdmFsIGFkZF9zdHJpbmcgOiB4OnN0cmluZyAtPiB5 OnN0cmluZyAtPiB1bml0IC0+IHN0cmluZw0KICDilIIgW0BAcHlfZnVuX25hbWUgYWRkXQ0KICDi lJTilIDilIDilIDilIANCg0KDQpQeXRob24gbWFnaWMgbWV0aG9kcw0K4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgVGhpcyBp cyBhbHNvIG5pY2UgZm9yIGJpbmRpbmcgUHl0aG9uIFttYWdpYyBtZXRob2RzXS4gRm9yIGV4YW1w bGUsIHlvdQ0KICBkb24ndCBoYXZlIHRvIHVzZSBgX19pbml0X18nIGFzIHRoZSBuYW1lIG9mIHRo ZSBPQ2FtbCBmdW5jdGlvbiB5b3UgdXNlDQogIHRvIG1ha2UgaW5zdGFuY2VzIG9mIGEgUHl0aG9u IGNsYXNzLiAgWW91IGNhbiBiaW5kIGl0IHRvIGEgbW9yZQ0KICBuYXR1cmFsIG5hbWUgbGlrZSBg Y3JlYXRlJyBvciBgbWFrZScuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2YWwgY3JlYXRl IDogbmFtZTpzdHJpbmcgLT4gYWdlOmludCAtPiB1bml0IC0+IHQNCiAg4pSCIFtAQHB5X2Z1bl9u YW1lIF9faW5pdF9fXQ0KICDilJTilIDilIDilIDilIANCg0KDQpbbWFnaWMgbWV0aG9kc10NCjxo dHRwczovL2RvY3MucHl0aG9uLm9yZy8zL3JlZmVyZW5jZS9kYXRhbW9kZWwuaHRtbCNzcGVjaWFs bmFtZXM+DQoNCg0KVXNpbmcgUHl0eXBlcy5weW9iamVjdCBkaXJlY3RseQ0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgU29tZXRpbWVzIHlvdSBtYXkgbm90IHdhbnQg dG8gYm90aGVyIGNvbnZlcnRpbmcgUHl0aG9uIHR5cGVzIHRvIG5vcm1hbA0KICBPQ2FtbCB0eXBl cyBhdCBhbGwuICBZb3UgY2FuIGRvIHRoYXQgbm93IGluIHZhbHVlIHNwZWNpZmljYXRpb25zIGJ5 DQogIHVzaW5nIHRoZSBgUHl0eXBlcy5weW9iamVjdCcgYW5kIGBQeS5PYmplY3QudCcgdHlwZXMg ZGlyZWN0bHkuDQoNCg0KRmV3ZXIgZGVwZW5kZW5jaWVzDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBgcmUnIGlzIG5vdyB1c2VkIGlu c3RlYWQgb2YgYHJlMicsIHdoaWNoIGRyb3BzIHRoZSBudW1iZXIgb2YNCiAgZGVwZW5kZW5jaWVz IHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQgYnkgYWJvdXQgaGFsZi4gIEFkZGl0aW9uYWxseSwN CiAgYGNvcmUnLCBgY29yZV9iZW5jaCcsIGFuZCBgYmlzZWN0X3BweCcgZG9uJ3QgbmVlZCB0byBi ZSBpbnN0YWxsZWQgaWYNCiAgeW91IHdhbnQgdG8gaW5zdGFsbCBgcHltbF9iaW5kZ2VuJyBkaXJl Y3RseSBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSwNCiAgd2hpY2ggZ3JlYXRseSBjdXRzIHRoZSBy ZXF1aXJlZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBjYXNlLg0KDQogIFRoYW5rcyBhZ2FpbiB0byBV bml4SnVua2llIGZvciBzcHVycmluZyBtYW55IG9mIHRoZXNlIHVwZGF0ZXMhDQoNCg0KVGFyaWRl cyBpcyBoaXJpbmchDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Rh cmlkZXMtaXMtaGlyaW5nLzk1NTMvMT4NCg0KDQpUaG9tYXMgR2F6YWduYWlyZSBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvbGxvd2luZyB0aGUgcmVjZW50IGFubm91 bmNlbWVudCBhYm91dCBUYXJpZGVzIChqb2luaW5nIGZvcmNlcyB3aXRoDQogIFtPQ2FtbCBMYWJz XSBhbmQgW1NlZ2ZhdWx0IFN5c3RlbV0pLCB3ZSBhcmUgbm93IGxvb2tpbmcgdG8gZXhwYW5kIG91 cg0KICB0ZWFtIHdpdGggZXhwZXJpZW5jZWQgc29mdHdhcmUgZW5naW5lZXJzLCBjb21wYXNzaW9u YXRlIHRlYW0gbGVhZHMgYW5kDQogIGV4cGVydHMgaW4gc29mdHdhcmUgY29uc3VsdGluZyBzZXJ2 aWNlcy4gT3VyIGFtYml0aW9uIGlzIHRvIGJyaW5nDQogIE9DYW1sIHRvIGEgdmFzdCBzZXQgb2Yg bmV3IGRldmVsb3BlcnMgYW5kIGluZHVzdHJpZXMuIFdlIHdhbnQgdG8gbWFrZQ0KICBkZXZlbG9w ZXJzIG1vcmUgcHJvZHVjdGl2ZSBieSBzcGVuZGluZyBsZXNzIHRpbWUgb24gZml4aW5nIGJ1Z3Mg YW5kDQogIG1vcmUgb24gd3JpdGluZyBuZXcgZmVhdHVyZXMuIEFuZCB3ZSB3YW50IHRoZSBzb2Z0 d2FyZSBpbmR1c3RyeSB0bw0KICBidWlsZCBtb3JlIHJvYnVzdCBhbmQgcGVyZm9ybWFudCBzeXN0 ZW1zIHRoYXQgY2FuIGxhc3QgZm9yIGRlY2FkZXMuDQoNCiAgV2UgYXJlIGxvb2tpbmcgZm9yOg0K DQogIOKAoiBFeHBlcmllbmNlZCBbU29mdHdhcmUgRW5naW5lZXIocyldIHRvIHRha2UgcGFydCBp biB0aGUgZGV2ZWxvcG1lbnQNCiAgICBvZiBJcm1pbi4gWW91IHdpbGwgYmUgcGFydCBvZiB0aGUg dGVhbSB0aGF0IGRlc2lnbnMsIGJ1aWxkcyBhbmQNCiAgICBzaGlwcyBJcm1pbiBsaWJyYXJpZXMg YW5kIGFwcGxpY2F0aW9ucyB0byBvdXIgY29tbXVuaXR5IGFuZA0KICAgIGN1c3RvbWVycy4NCiAg 4oCiIFtUZWFtIExlYWQocyldIHdobyBjYXJlcyBhYm91dCBtb3RpdmF0aW5nIHRoZWlyIHRlYW0g bWVtYmVycywNCiAgICBzdXBwb3J0aW5nIHRoZWlyIGdyb3d0aCBhbmQgZGV2ZWxvcG1lbnQgYW5k IHN1Y2Nlc3NmdWxseSBkZWxpdmVyaW5nDQogICAgdGhlIHRlYW0ncyBvYmplY3RpdmVzIG9uIHRp bWUuDQogIOKAoiBBIFtIZWFkIG9mIENvbnN1bHRpbmcgU2VydmljZXNdIHRvIGRpdmVyc2lmeSBv dXIgdGVjaG5pY2FsIHRlYW1zIGFuZA0KICAgIGNvbW1lcmNpYWwgc2VydmljZXMgcG9ydGZvbGlv LiBZb3UnbGwgYmUgdGhlIGZpcnN0IGhpcmUgZm9yIHRoaXMNCiAgICBicmFuZCBuZXcgZGVwYXJ0 bWVudCBhbmQgd2lsbCBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBoZWxwIHVzIGJ1aWxkDQogICAg b3VyIHNlcnZpY2VzIHN0cnVjdHVyZSBmcm9tIHNjcmF0Y2gsIGluY2x1ZGluZyBvdXIgc3RyYXRl Z3ksDQogICAgcHJvY2Vzc2VzLCB0b29scywgYW5kIHRlYW0uDQoNCiAgV2UgYXJlIGFsd2F5cyBs b29raW5nIGZvciBncmVhdCBPQ2FtbCBlbnRodXNpYXN0cyB0byBqb2luIG91ciB0ZWFtLCBzbw0K ICBldmVuIGlmIHRoZXNlIGpvYiBkZXNjcmlwdGlvbnMgZG8gbm90IGZpdCB5b3VyIHByb2ZpbGUg cHJlY2lzZWx5LCB5b3UNCiAgYXJlIHdlbGNvbWUgdG8gc2VuZCB1cyBbYSBzcG9udGFuZW91cyBh cHBsaWNhdGlvbl0hDQoNCg0KW09DYW1sIExhYnNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9n LzIwMjItMDEtMjctb2NhbWwtbGFicy1qb2lucy10YXJpZGVzPg0KDQpbU2VnZmF1bHQgU3lzdGVt XQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIyLTAzLTAxLXNlZ2ZhdWx0LXN5c3RlbXMt am9pbnMtdGFyaWRlcz4NCg0KW1NvZnR3YXJlIEVuZ2luZWVyKHMpXQ0KPGh0dHBzOi8vdGFyaWRl cy5jb20vam9icy9zZW5pb3Itc29mdHdhcmUtZW5naW5lZXI+DQoNCltUZWFtIExlYWQocyldIDxo dHRwczovL3RhcmlkZXMuY29tL2pvYnMvdGVhbS1sZWFkLWVuZ2luZWVyaW5nPg0KDQpbSGVhZCBv ZiBDb25zdWx0aW5nIFNlcnZpY2VzXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vam9icy9oZWFkLW9m LWNvbnN1bHRpbmctc2VydmljZXM+DQoNClthIHNwb250YW5lb3VzIGFwcGxpY2F0aW9uXQ0KPGh0 dHBzOi8vdGFyaWRlcy5jb20vam9icy9zcG9udGFuZW91cy1hcHBsaWNhdGlvbj4NCg0KDQpGb3Ig RGl2ZXJzaXR5IGFuZCB0aGUgT0NhbWwgQ29tbXVuaXR5OiBPdXRyZWFjaHkgU3VtbWVyIDIwMjIN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv Zm9yLWRpdmVyc2l0eS1hbmQtdGhlLW9jYW1sLWNvbW11bml0eS1vdXRyZWFjaHktc3VtbWVyLTIw MjIvOTIzNC82Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIEF5YSBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEBwaXRhZyBhbmQg SSBoYXZlIHJlc3VibWl0dGVkIHRoZSBQUFggZGVyaXZlcnMgcHJvamVjdCBmb3IgdGhpcyBTdW1t ZXINCiAgMjAyMiByb3VuZDogKkV4cGFuZCBPQ2FtbCdzIGxpYnJhcnkgb2Ygc3RhbmRhcmQgZGVy aXZlcnMqISBUaGlzIGlzIHRoZQ0KICBzYW1lIHByb2plY3QgSSB3YXMgdGhlIGludGVybiBmb3Ig dGhpcyBwYXN0IFdpbnRlciAyMDIyIHJvdW5kLCB3aGVyZQ0KICB0aGUgZ29hbCBpcyB0byBidWls ZCB1cCBhIFtzdGFuZGFyZCBkZXJpdmVyc10gbGlicmFyeSwgbGlrZQ0KICBgcHB4X2Rlcml2aW5n JywgdXNpbmcgdGhlIHVwZGF0ZWQgYHBweGxpYicgQVBJLg0KDQogIEknbSBleGNpdGVkIHRvIGJl IHN1cHBvcnRpbmcgQHBpdGFnIHdpdGggbWVudG9yaW5nLCBhbmQgZm9yIHRoZQ0KICBvcHBvcnR1 bml0eSB0byBzdGF5IGludm9sdmVkIG5vdyB0aGF0IG15IGludGVybnNoaXAgaGFzIGVuZGVkIDpz bWlsZXk6DQoNCg0KW3N0YW5kYXJkIGRlcml2ZXJzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LXBweC9zdGFuZGFyZF9kZXJpdmVycz4NCg0KDQpDYXF0aSAxLjguMCBhbmQgcmVsYXRlZCBuZXdz DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jYXF0aS0xLTgtMC1hbmQtcmVsYXRlZC1uZXdzLzk1NjEv MT4NCg0KDQoiUGV0dGVyIEEuIFVya2VkYWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGFtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBzZWNvbmQgcmVsZWFzZSBv ZiBbQ2FxdGldIHRoaXMgeWVhci4gVGhlDQogIHJlYXNvbiBmb3IgdGhlIHF1aWNrIHN1Y2Nlc3Np b24gaXMgcGFydGx5IGFuIGFkanVzdG1lbnQgdG8gdGhlIFtuZXcNCiAgQVBJIGZvciByZXF1ZXN0 IGNvbnN0cnVjdGlvbl0gYW5kIHBhcnRseSB0aGF0IFttYXRjaGFibGUgZXJyb3INCiAgY29uZGl0 aW9uc10gZGlkIG5vdCBtYWtlIGl0IGludG8gdGhlIHByZXZpb3VzIHJlbGVhc2UuICBZb3UgY2Fu IHNlZQ0KICB0aGUgZnVsbCByZWxlYXNlIG5vdGVzIGJlbG93Lg0KDQogIEkgd291bGQgYWxzbyBs aWtlIHRvIHRoYW5rIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSBmb3Igc3BvbnNvcmluZw0K ICBteSBlZmZvcnRzIG9uIHRoZSBDYXF0aSBwcm9qZWN0IHRoaXMgeWVhciwgYWxzbyBpbmNsdWRp bmcgbW9zdCBvZiB0aGUNCiAgd29yayB0aGF0IHdlbnQgaW50byB0aGUgcHJldmlvdXMgcmVsZWFz ZS4NCg0KICBPbmUgW2ZlYXR1cmUgaW4gcHJvZ3Jlc3NdIGlzIGEgbmV3IGRyaXZlciBiYXNlZCBv biB0aGUgcHVyZS1PQ2FtbA0KICBbcGd4XSB3aGljaCBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSwg d2l0aCBzb21lIGFkZGl0aW9uYWwgY2hhbmdlcyB0bw0KICB0aGUgd2F5IGRyaXZlcnMgYXJlIGxv YWRlZCwgdG8gdGFyZ2V0IE1pcmFnZU9TLiBJIGFtIG5vdGUgc3VyZSBpZiB0aGlzDQogIGNhbiBi ZSBkb25lIGluIGEgbWlub3IgcmVsZWFzZSBvciB3aWxsIHJlcXVpcmUgYSBDYXF0aSAyIGJyYW5j aC4NCg0KDQpbQ2FxdGldIDxodHRwczovL2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWNhcXRp Pg0KDQpbbmV3IEFQSSBmb3IgcmVxdWVzdCBjb25zdHJ1Y3Rpb25dDQo8aHR0cHM6Ly9wYXVya2Vk YWwuZ2l0aHViLmlvL29jYW1sLWNhcXRpL2NhcXRpL0NhcXRpX3JlcXVlc3QvSW5maXgvaW5kZXgu aHRtbD4NCg0KW21hdGNoYWJsZSBlcnJvciBjb25kaXRpb25zXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9wYXVya2VkYWwvb2NhbWwtY2FxdGkvaXNzdWVzLzcyPg0KDQpbT0NhbWwgU29mdHdhcmUgRm91 bmRhdGlvbl0gPGh0dHBzOi8vb2NhbWwtc2Yub3JnPg0KDQpbZmVhdHVyZSBpbiBwcm9ncmVzc10N CjxodHRwczovL2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWNhcXRpL2lzc3Vlcy8zOD4NCg0K W3BneF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hcmVuYWRvdGlvL3BneD4NCg0KUmVsZWFzZSBOb3Rl cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTmV3IGZlYXR1 cmVzOg0KDQogIOKAoiBBIG1hdGNoYWJsZSByZXByZXNlbnRhdGlvbiBvZiBjb21tb24gY2F1c2Vz IG9mIGVycm9ycyBvbiB0aGUNCiAgICBkYXRhYmFzZSBzaWRlIGlzIG5vdyBhdmFpbGFibGUsIHdp dGggbGltaXRhdGlvbnMuICBJdCBmb2N1c2VzIG9uDQogICAgY29uZGl0aW9ucyB3aGljaCBzZWVt IG1vc3QgbGlrZWx5IHVzZWZ1bCB0byBoYW5kbGUuICBBdCB0aGUgbW9tZW50DQogICAgd2UgbGFj ayBleHRlbmRlZCBlcnJvciBjb2RlcyBmcm9tIFNRTGl0ZTMgbmVlZGVkIHRvIG1ha2UgdGhlIGNh dXNlDQogICAgZnVsbHkgcHJlY2lzZS4NCg0KICDigKIgRXhwb3NlIHRoZSB1bmRlcmx5aW5nIGVy cm9yIGRldGFpbHMgZnJvbSBkYXRhYmFzZSBjbGllbnQgbGlicmFyaWVzLg0KICAgIFRoaXMgaXMg bWVhbnQgdG8gYmUgdXNlIGFzIGEgbGFzdCByZXNvcnQsIGFuZCByZXF1aXJlcyBkaXJlY3RseQ0K ICAgIGxpbmtpbmcgd2l0aCB0aGUgcmVsZXZhbnQgZHJpdmVycy4NCg0KICDigKIgQSBzZWNvbmQg c2V0IG9mIHJlcXVlc3QgY29uc3RydWN0aW9uIG9wZXJhdG9ycyBgLT4uJywgYC0+PycsIGAtPiEn LA0KICAgIGFuZCBgLT4qJyB3ZXJlIGludHJvZHVjZWQgYWZ0ZXIgZXhwZXJpZW5jZSB3aXRoIGNv bnZlcnRpbmcgZXhpc3RpbmcNCiAgICBjb2RlLiAgR2l2ZW4gdGhlIHBhcmFtZXRlciBhbmQgcmVz dWx0IHR5cGUgdGhleSByZXR1cm4gYSBmdW5jdGlvbg0KICAgIHdoaWNoIGNvbnN0cnVjdHMgYSBy ZXF1ZXN0IGRpcmVjdGx5IGZyb20gYSBxdWVyeSBzdHJpbmcuICBBdm9pZGluZw0KICAgIHRoZSBu ZWVkIHRvIGNvbXBvc2Ugd2l0aCBgQDotJyBzaW1wbGlmaWVzIGxvY2FsIG9wZW5zIGFuZCB1c2Fn ZSB3aXRoDQogICAgYExpc3QubWFwJyBldGMuDQoNCiAg4oCiIEVudmlyb25tZW50IHZhcmlhYmxl cyBhcmUgbm93IGV4cGFuZGVkIGluIHRoZSBkZWJ1ZyBsb2cgd2hlbiB1c2luZw0KICAgIHRoZSBu ZXcgcmVxdWVzdCBjb25zdHJ1Y3RvcnMgaW50cm9kdWNlZCBpbiAxLjcuMC4NCg0KICDigKIgQSBu ZXcgYD90d2Vha3NfdmVyc2lvbicgY29ubmVjdGlvbiBwYXJhbWV0ZXIgaGFzIGJlZW4gYWRkZWQg dG8NCiAgICBjb250cm9sIHdoZW4gdGhlIGNsaWVudCBpcyByZWFkeSB0byBhZGFwdCB0byBjaGFu Z2VzIGluIGRhdGFiYXNlDQogICAgc2Vzc2lvbiBwYXJhbWV0ZXJzIG9yIG90aGVyIGFkanVzdG1l bnRzIG9mIHRoZSBpbnRlcmFjdGlvbiB3aXRoDQogICAgc3BlY2lmaWMgZGF0YWJhc2Ugc3lzdGVt cy4gW1tNb3JlIGRldGFpbHMgYXZhaWxhYmxlIGluIHRoZQ0KICAgIGRvY3VtZW50YXRpb24uXV0N Cg0KICDigKIgRW5hYmxlIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgY2hlY2tzIGZvciBTUUxpdGUz IHN0YXJ0aW5nIGF0IHR3ZWFrcw0KICAgIHZlcnNpb24gMS43Lg0KDQogIEZpeGVzOg0KDQogIOKA oiBGaXhlZCBkZWJ1ZyBsb2dnaW5nIHRvIHBhc3MgdGhlIGNvcnJlY3QgZHJpdmVyIGluZm8gdG8g dGhlIHF1ZXJ5DQogICAgY2FsbGJhY2sgaW5zdGVhZCBvZiBhIGR1bW15IGRyaXZlciBpbmZvIHdo aWNoIHdvdWxkIGNhdXNlIGEgZmFpbHVyZQ0KICAgIGlmIHVuc3VwcG9ydGVkLg0KDQogIERlcHJl Y2F0aW9uczoNCg0KICDigKIgVGhlIGAtLT4nIG9wZXJhdG9yIHdhcyByZW5hbWVkIHRvIGAtLT4h Jywgd2l0aCBhIGRlcHJlY2F0ZWQgYWxpYXMsDQogICAgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhl IG5ldyBgLT4hJyBvcGVyYXRvci4NCg0KICDigKIgVGhlIG9sZCBjb252ZW5pZW5jZSBpbnRlcmZh Y2UgZm9yIGNyZWF0aW5nIHJlcXVlc3RzIGhhcyBiZWVuDQogICAgZGVwcmVjYXRlZCBpbiBmYXZv dXIgb2YgdGhlIG5ldyBpbmZpeCBvcGVyYXRvcnMgYW5kIHRoZSBuZXcgcXVlcnkNCiAgICB0ZW1w bGF0ZSBwYXJzZXIuDQoNCiAg4oCiIERvY3VtZW50ZWQtb25seSBkZXByZWNhdGlvbnMgb2YgYENh cXRpX3NxbF9pbycsIGBDYXF0aV9sd3Rfc3FsX2lvJywNCiAgICBhbmQgYENhcXRpX2FzeW5jX3Nx bF9pbycgaGF2ZSBiZWVuIGFubm90YXRlZC4NCg0KDQpbTW9yZSBkZXRhaWxzIGF2YWlsYWJsZSBp biB0aGUgZG9jdW1lbnRhdGlvbi5dDQo8aHR0cHM6Ly9wYXVya2VkYWwuZ2l0aHViLmlvL29jYW1s LWNhcXRpL2NhcXRpL3R3ZWFrcy5odG1sPg0KDQoNCkZpcnN0IHJlbGVhc2Ugb2YgcHJibm1jbi1k YWdnZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtcHJi bm1jbi1kYWdnZXIvOTMxMS8yPg0KDQoNCklnYXJuaWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHByb3Vk IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHZlcnNpb24gMC4wLjIgb2YNCiAgW3ByYm5tY24t ZGFnZ2VyXS4NCg0KICBUaGlzIHZlcnNpb24gYWRkcyBTZXF1ZW50aWFsIE1vbnRlLUNhcmxvLCBh LmsuYS4gW3BhcnRpY2xlDQogIGZpbHRlcnNdLWJhc2VkIGluZmVyZW5jZSB0byB0aGUgbGlicmFy eS4NCg0KICBIZXJlJ3MgdGhlIGZ1bGwgY2hhbmdlbG9nOg0KICDigKIgRGVwZW5kZW5jeTogYHBy Ym5tY24tc3RhdHMuMC4wLjMnIC0+IGBwcmJubWNuLXN0YXRzLjAuMC40Jw0KICDigKIgQWRkIGJl dGEgZGlzdHJpYnV0aW9uIHRvIEdzbCBzYW1wbGVycw0KICDigKIgUmVmYWN0b3IgQ3BzIG1vbmFk DQogIOKAoiBBZGQgU01DIGluZmVyZW5jZQ0KICDigKIgU2ltcGxpZnkgaGFuZGxlciB0eXBlLCBt b2R1bGFyaXplIGVmZmVjdCBkZWZpbml0aW9ucyBhd2F5IGZyb20NCiAgICBDcHNfbW9uYWQNCiAg 4oCiIEZpeCB0eXBvOiBiZXJub3VpbGxpIC0+IGJlcm5vdWxsaSAocmVwb3J0IGJ5IEBuaWxzYmVj a2VyKQ0KDQogIEkgYWxzbyB3cm90ZSB0aGUgZm9sbG93aW5nIGFydGljbGU6IFtBcHBseWluZyBT ZXF1ZW50aWFsIE1vbnRlLUNhcmxvDQogIHRvIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nXSBJdCBj b250YWlucyBzb21lIHVzZSBjYXNlcyBmb3IgdGhlDQogIGxpYnJhcnksIEkgaG9wZSBzb21lIGZp bmQgaXQgZnVuIDopDQoNCiAgVG8gY29uY2x1ZGUgdGhpcyBwb3N0LCBhbmQgYXMgYSBwYXJ0aWFs IGFuc3dlciB0byBAZ2FzY2hlICdzDQogIFtxdWVzdGlvbl0gaW4gYW4gb2xkZXIgdGhyZWFkLCBJ IGJlbGlldmUgdGhhdCB1bmxpa2Ugc29tZSBvdGhlcg0KICBpbmZlcmVuY2UgdGVjaG5pcXVlcywg c2luZ2xlLXNob3QgY29udGludWF0aW9ucyBhcmUgZW5vdWdoIHRvDQogIGltcGxlbWVudCBTTUMu IFdpdGhvdXQgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzLCB0aGUgaW1wbGVtZW50YXRpb24gaXMN CiAgdmVyeSByZW1pbmlzY2VudCBvZiB0aGF0IG9mIGxpZ2h0d2VpZ2h0IHRocmVhZGluZyBsaWJy YXJpZXMuIEkgbG9vaw0KICBmb3J3YXJkIHRvIGV4cGVyaW1lbnQgd2l0aCBhIGZpYnJlLWJhc2Vk IGltcGxlbWVudGF0aW9uIQ0KDQoNCltwcmJubWNuLWRhZ2dlcl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9pZ2Fybmllci9wcmJubWNuLWRhZ2dlcj4NCg0KW3BhcnRpY2xlIGZpbHRlcnNdIDxodHRwczov L2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWNsZV9maWx0ZXI+DQoNCltBcHBseWluZyBTZXF1 ZW50aWFsIE1vbnRlLUNhcmxvIHRvIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nXQ0KPGh0dHA6Ly9w cm9iYW5vbWljb24ueHl6L2Jsb2cvd2luZF9wb3dlcl9mb3JlY2FzdC5odG1sPg0KDQpbcXVlc3Rp b25dDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRpLXNob3QtY29udGludWF0aW9u cy1nb25lLWZvcmV2ZXIvOTA3Mi81Pg0KDQoNCk1pcmFnZU9TIDQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tbWlyYWdlb3MtNC0wLzk1OTgvMT4NCg0KDQpUaG9tYXMgR2F6YWduYWlyZSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICpPbiBiZWhhbGYgb2YgdGhl IE1pcmFnZU9TIHRlYW0sIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZQ0KICByZWxlYXNl IG9mIE1pcmFnZU9TIDQuMC4wISogSSdkIGxpa2UgdG8gc2VuZCBzcGVjaWFsIHRoYW5rcyB0bw0K ICBAZGlub3NhdXJlIGFuZCBATG9ydGV4IHdobyBkcm92ZSB0aGF0IHJlbGVhc2UgZm9yd2FyZCBm b3IgbXVsdGlwbGUNCiAgeWVhcnMuDQoNCiAgU2luY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgMjAx MywgTWlyYWdlT1MgaGFzIG1hZGUgc3RlYWR5IHByb2dyZXNzDQogIHRvd2FyZCBkZXBsb3lpbmcg YSBzZWxmLW1hbmFnZWQgaW50ZXJuZXQgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBwcm9qZWN04oCZcw0K ICBpbml0aWFsIGFpbSB3YXMgdG8gc2VsZi1ob3N0IGFzIG1hbnkgc2VydmljZXMgYXMgcG9zc2li bGUgYWltZWQgYXQNCiAgZW1wb3dlcmluZyBpbnRlcm5ldCB1c2VycyB0byBzZWN1cmVseSBkZXBs b3kgaW5mcmFzdHJ1Y3R1cmUgdG8gb3duDQogIHRoZWlyIGRhdGEgYW5kIHRha2UgYmFjayBjb250 cm9sIG9mIHRoZWlyIHByaXZhY3kuIE1pcmFnZU9TIGNhbg0KICBzZWN1cmVseSBkZXBsb3kgW3N0 YXRpYyB3ZWJzaXRlIGhvc3RpbmddIHdpdGgg4oCcTGV04oCZcyBFbmNyeXB04oCdDQogIGNlcnRp ZmljYXRlIHByb3Zpc2lvbmluZyBhbmQgYSBbc2VjdXJlIFNNVFBzdGFja10gd2l0aCBzZWN1cml0 eQ0KICBleHRlbnNpb25zLiBNaXJhZ2VPUyBjYW4gYWxzbyBkZXBsb3kgZGVjZW50cmFsaXNlZCBj b21tdW5pY2F0aW9uDQogIGluZnJhc3RydWN0dXJlIGxpa2UgW01hdHJpeF0sIFtPcGVuVlBOIHNl cnZlcnNdLCBhbmQgW1RMUyB0dW5uZWxzXSB0bw0KICBlbnN1cmUgZGF0YSBwcml2YWN5IG9yIFtE TlMoU0VDKSBzZXJ2ZXJzXSBmb3IgYmV0dGVyIGF1dGhlbnRpY2F0aW9uLg0KDQogIFRoZSBwcm90 b2NvbCBlY29zeXN0ZW0gbm93IGNvbnRhaW5zIFtodW5kcmVkcyBvZiBsaWJyYXJpZXNdIGFuZA0K ICBzZXJ2aWNlcyBtaWxsaW9ucyBvZiBkYWlseSB1c2Vycy4gT3ZlciB0aGVzZSB5ZWFycywgbWFq b3IgY29tbWVyY2lhbA0KICB1c2VycyBoYXZlIGpvaW5lZCB0aGUgcHJvamVjdHMuIFRoZXkgcmVs eSBvbiBNaXJhZ2VPUyBsaWJyYXJpZXMgdG8NCiAga2VlcCB0aGVpciBwcm9kdWN0cyBzZWN1cmUu IEZvciBpbnN0YW5jZSwgdGhlIE1pcmFnZU9TIG5ldHdvcmtpbmcgY29kZQ0KICBwb3dlcnMgW0Rv Y2tlciBEZXNrdG9w4oCZcyBWUE5LaXRdLCB3aGljaCBzZXJ2ZXMgdGhlIHRyYWZmaWMgb2YgbWls bGlvbnMNCiAgb2YgY29udGFpbmVycyBkYWlseS4gW0NpdHJpeCBIeXBlcnZpc29yXSB1c2VzIE1p cmFnZU9TIHRvIGludGVyYWN0DQogIHdpdGggWGVuLCB0aGUgaHlwZXJ2aXNvciB0aGF0IHBvd2Vy cyBtb3N0IG9mIHRvZGF54oCZcyBwdWJsaWMNCiAgY2xvdWQuIFtOaXRyb2tleV0gaXMgZGV2ZWxv cGluZyBhIG5ldyBoYXJkd2FyZSBzZWN1cml0eSBtb2R1bGUgYmFzZWQNCiAgb24gTWlyYWdlT1Mu IFtSb2J1cl0gZGV2ZWxvcHMgYSB1bmlrZXJuZWwgb3JjaGVzdHJhdGlvbiBzeXN0ZW0gZm9yDQog IGZsZWV0cyBvZiBNaXJhZ2VPUyB1bmlrZXJuZWxzLiBbVGFyaWRlc10gdXNlcyBNaXJhZ2VPUyB0 byBpbXByb3ZlIHRoZQ0KICBbVGV6b3NdIGJsb2NrY2hhaW4sIGFuZCBbSHlwZXJdIHVzZXMgTWly YWdlT1MgdG8gYnVpbGQgc2Vuc29yDQogIGFuYWx5dGljcyBhbmQgYW4gYXV0b21hdGlvbiBwbGF0 Zm9ybSBmb3Igc3VzdGFpbmFibGUgYWdyaWN1bHR1cmUuDQoNCiAgSW4gdGhlIGNvbWluZyB3ZWVr cywgb3VyIGJsb2cgd2lsbCBmZWF0dXJlIGluLWRlcHRoIHRlY2huaWNhbCBjb250ZW50DQogIGZv ciB0aGUgbmV3IGZlYXR1cmVzIHRoYXQgTWlyYWdlT1MgYnJpbmdzLCBhcyB3ZWxsIGFzIGEgdG91 ciBvZiB0aGUNCiAgZXhpc3RpbmcgY29tbXVuaXR5IGFuZCBjb21tZXJjaWFsIHVzZXJzIG9mIE1p cmFnZU9TLiBQbGVhc2UgcmVhY2ggb3V0DQogIGlmIHlvdeKAmWQgbGlrZSB0byB0ZWxsIHVzIGFi b3V0IHlvdXIgc3RvcnkuDQoNCg0KW3N0YXRpYyB3ZWJzaXRlIGhvc3RpbmddIDxodHRwczovL2dp dGh1Yi5jb20vcm9idXJpby91bmlwaT4NCg0KW3NlY3VyZSBTTVRQc3RhY2tdIDxodHRwczovL2dp dGh1Yi5jb20vbWlyYWdlL3B0dD4NCg0KW01hdHJpeF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJh Z2Uvb2NhbWwtbWF0cml4Pg0KDQpbT3BlblZQTiBzZXJ2ZXJzXSA8aHR0cHM6Ly9naXRodWIuY29t L3JvYnVyaW8vb3BlbnZwbj4NCg0KW1RMUyB0dW5uZWxzXSA8aHR0cHM6Ly9naXRodWIuY29tL3Jv YnVyaW8vdGxzdHVubmVsPg0KDQpbRE5TKFNFQykgc2VydmVyc10gPGh0dHBzOi8vZ2l0aHViLmNv bS9taXJhZ2Uvb2NhbWwtZG5zPg0KDQpbaHVuZHJlZHMgb2YgbGlicmFyaWVzXSA8aHR0cHM6Ly9n aXRodWIuY29tL21pcmFnZS8+DQoNCltEb2NrZXIgRGVza3RvcOKAmXMgVlBOS2l0XQ0KPGh0dHBz Oi8vd3d3LmRvY2tlci5jb20vYmxvZy9ob3ctZG9ja2VyLWRlc2t0b3AtbmV0d29ya2luZy13b3Jr cy11bmRlci10aGUtaG9vZC8+DQoNCltDaXRyaXggSHlwZXJ2aXNvcl0NCjxodHRwczovL3d3dy5j aXRyaXguY29tL2ZyLWZyL3Byb2R1Y3RzL2NpdHJpeC1oeXBlcnZpc29yLz4NCg0KW05pdHJva2V5 XSA8aHR0cHM6Ly93d3cubml0cm9rZXkuY29tL3Byb2R1Y3RzL25ldGhzbT4NCg0KW1JvYnVyXSA8 aHR0cHM6Ly9yb2J1ci5pby8+DQoNCltUYXJpZGVzXSA8aHR0cHM6Ly90YXJpZGVzLmNvbS8+DQoN CltUZXpvc10gPGh0dHBzOi8vdGV6b3MuY29tLz4NCg0KW0h5cGVyXSA8aHR0cHM6Ly9oeXBlci5h Zy8+DQoNCkluc3RhbGwgTWlyYWdlT1MgNA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGVhc2llc3Qgd2F5IHRvIGluc3RhbGwg TWlyYWdlT1MgNCBpcyBieSB1c2luZyB0aGUgb3BhbSB2ZXJzaW9uIDIuMQ0KICBhbmQgYG9jYW1s Pj00LjEyLjFgLiBGb2xsb3cgdGhlIFtpbnN0YWxsYXRpb24gZ3VpZGVdIGZvciBtb3JlIGRldGFp bHMuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gdXBkYXRlDQogIOKUgiAkIG9w YW0gaW5zdGFsbCAnbWlyYWdlPjQnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIC9Ob3RlLzogaWYg eW91IHVwZ3JhZGUgZnJvbSBNaXJhZ2VPUyAzIHlvdSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgY2xl YW4NCiAgdGhlIHByZXZpb3VzIGdlbmVyYXRlZCBmaWxlcyAob3IgY2FsbCBgbWlyYWdlIGNsZWFu JyBiZWZvcmUNCiAgdXBncmFkaW5nKS4gWW91IHdvdWxkIGFsc28gd2FudCB0byByZWFkIFt0aGUg ZnVsbCBsaXN0IG9mIEFQSQ0KICBjaGFuZ2VzXS4gIFlvdSBjYW4gc2VlIHVuaWtlcm5lbCBleGFt cGxlcyBpbiBbbWlyYWdlL21pcmFnZS1za2VsZXRvbl0sDQogIFtyb2J1cmlvL3VuaWtlcm5lbHNd IG9yIFt0YXJpZGVzL3VuaWtlcm5lbHNdLg0KDQoNCltpbnN0YWxsYXRpb24gZ3VpZGVdIDxodHRw czovL21pcmFnZS5pby9kb2NzL2luc3RhbGw+DQoNClt0aGUgZnVsbCBsaXN0IG9mIEFQSSBjaGFu Z2VzXSA8aHR0cHM6Ly9taXJhZ2UuaW8vZG9jcy9icmVha2luZy1jaGFuZ2VzPg0KDQpbbWlyYWdl L21pcmFnZS1za2VsZXRvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLXNrZWxl dG9uPg0KDQpbcm9idXJpby91bmlrZXJuZWxzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyaW8v dW5pa2VybmVscz4NCg0KW3RhcmlkZXMvdW5pa2VybmVsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS90 YXJpZGVzL3VuaWtlcm5lbHM+DQoNCg0KQWJvdXQgTWlyYWdlT1MNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE1pcmFnZU9TIGlzIGEgbGlicmFyeSBvcGVy YXRpbmcgc3lzdGVtIHRoYXQgY29uc3RydWN0cyB1bmlrZXJuZWxzIGZvcg0KICBzZWN1cmUsIGhp Z2gtcGVyZm9ybWFuY2UsIGxvdy1lbmVyZ3kgZm9vdHByaW50IGFwcGxpY2F0aW9ucyBhY3Jvc3MN CiAgdmFyaW91cyBoeXBlcnZpc29yIGFuZCBlbWJlZGRlZCBwbGF0Zm9ybXMuIEl0IGlzIGF2YWls YWJsZSBhcyBhbg0KICBvcGVuLXNvdXJjZSBwcm9qZWN0IGNyZWF0ZWQgYW5kIG1haW50YWluZWQg YnkgdGhlIFtNaXJhZ2VPUyBDb3JlDQogIFRlYW1dLiBBIHVuaWtlcm5lbCBjYW4gYmUgY3VzdG9t aXNlZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQ0KICBieSBwaWNraW5nIHRoZSBy ZWxldmFudCBNaXJhZ2VPUyBsaWJyYXJpZXMgYW5kIGNvbXBpbGluZyB0aGVtIGludG8gYQ0KICBz dGFuZGFsb25lIG9wZXJhdGluZyBzeXN0ZW0sIHdoaWNoIGNvbnRhaW5zIHN0cmljdGx5IHRoZSBm dW5jdGlvbmFsaXR5DQogIG5lY2Vzc2FyeSBmb3IgdGhlIHRhcmdldC4gVGhpcyBtaW5pbWlzZXMg dGhlIHVuaWtlcm5lbOKAmXMgZm9vdHByaW50LA0KICBpbmNyZWFzaW5nIHRoZSBzZWN1cml0eSBv ZiB0aGUgZGVwbG95ZWQgb3BlcmF0aW5nIHN5c3RlbS4NCg0KICBUaGUgTWlyYWdlT1MgYXJjaGl0 ZWN0dXJlIGNhbiBiZSBkaXZpZGVkIGludG8gb3BlcmF0aW5nIHN5c3RlbQ0KICBsaWJyYXJpZXMs IHR5cGVkIHNpZ25hdHVyZXMsIGFuZCBhIG1ldGFwcm9ncmFtbWluZyBjb21waWxlci4gVGhlDQog IG9wZXJhdGluZyBzeXN0ZW0gbGlicmFyaWVzIGltcGxlbWVudCB2YXJpb3VzIGZ1bmN0aW9uYWxp dGllcywgcmFuZ2luZw0KICBmcm9tIGxvdy1sZXZlbCBuZXR3b3JrIGNhcmQgZHJpdmVycywgdG8g ZnVsbCByZWltcGxlbWVudGF0aW9ucyBvZiB0aGUNCiAgVExTIHByb3RvY29sLCBhcyB3ZWxsIGFz IHRoZSBHaXQgcHJvdG9jb2wgdG8gc3RvcmUgdmVyc2lvbmVkIGRhdGEuIEENCiAgc2V0IG9mIHR5 cGVkIHNpZ25hdHVyZXMgZW5zdXJlcyB0aGF0IHRoZSBPUyBsaWJyYXJpZXMgYXJlIGNvbnNpc3Rl bnQNCiAgYW5kIHdvcmsgd2VsbCBpbiBjb25qdW5jdGlvbiB3aXRoIGVhY2ggb3RoZXIuIE1vc3Qg aW1wb3J0YW50bHksDQogIE1pcmFnZU9TIGlzIGFsc28gYSBtZXRhcHJvZ3JhbW1pbmcgY29tcGls ZXIgdGhhdCBjYW4gaW5wdXQgT0NhbWwNCiAgc291cmNlIGNvZGUgYWxvbmcgd2l0aCBpdHMgZGVw ZW5kZW5jaWVzLCBhbmQgYSBkZXBsb3ltZW50IHRhcmdldA0KICBkZXNjcmlwdGlvbiBpbiBvcmRl ciB0byBnZW5lcmF0ZSBhbiBleGVjdXRhYmxlIHVuaWtlcm5lbCwgaS5lLiwgYQ0KICBzcGVjaWFs aXNlZCBiaW5hcnkgYXJ0ZWZhY3QgY29udGFpbmluZyBvbmx5IHRoZSBjb2RlIG5lZWRlZCB0byBy dW4gb24NCiAgdGhlIHRhcmdldCBwbGF0Zm9ybS4gT3ZlcmFsbCwgTWlyYWdlT1MgZm9jdXNlcyBv biBwcm92aWRpbmcgYSBzbWFsbCwNCiAgd2VsbC1kZWZpbmVkLCB0eXBlZCBpbnRlcmZhY2Ugd2l0 aCB0aGUgc3lzdGVtIGNvbXBvbmVudHMgb2YgdGhlIHRhcmdldA0KICBhcmNoaXRlY3R1cmUuDQoN CiAgUmVhZCB0aGUgZnVsbCBhbm5vdW5jZW1lbnQgb24gW21pcmFnZS5pbydzIGJsb2ddLg0KDQoN CltNaXJhZ2VPUyBDb3JlIFRlYW1dIDxodHRwczovL2dpdGh1Yi5jb20vb3Jncy9taXJhZ2UvdGVh bXMvY29yZS9tZW1iZXJzPg0KDQpbbWlyYWdlLmlvJ3MgYmxvZ10gPGh0dHBzOi8vbWlyYWdlLmlv L2Jsb2cvYW5ub3VuY2luZy1taXJhZ2UtNDA+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgdGhlbiBh ZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRm9yIHRob3NlIGN1cmlvdXMg YWJvdXQgd2hhdCBzb21lIG9mIHRoZSBNaXJhZ2VPUyBsaWJyYXJpZXMgX2FyZV8sDQogIHRoZXJl IGlzIGEgcmF3IFlhbWwgbGlzdCBvdmVyIGF0IFttaXJhZ2UvbWlyYWdlLXJlcG9zaXRvcmllc10g bGlzdGluZw0KICBtb3N0IG9mIHRoZW0uICBDb252ZXJzaW9uIG9mIHRoaXMgWWFtbCB0byBIVE1M IGZvciB0aGUgbWFpbiBtaXJhZ2UuaW8NCiAgd2Vic2l0ZSB3b3VsZCBiZSBhIHdlbGNvbWUgY29u dHJpYnV0aW9uISA6c2xpZ2h0X3NtaWxlOg0KDQoNClttaXJhZ2UvbWlyYWdlLXJlcG9zaXRvcmll c10NCjxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1yZXBvc2l0b3JpZXMvYmxvYi9t YWluL3JlcG9zLnltbD4NCg0KDQpPQ2FtbCA0LjE0LjAgaXMgcmVsZWFzZWQNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0x NC0wLWlzLXJlbGVhc2VkLzk2MDAvMT4NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgT0NhbWwgdGVhbSBoYXMgdGhlIHBsZWFzdXJlIG9mIGNlbGVicmF0aW5nIHRoZSBiaXJ0aGRh eSBvZg0KICBBbGV4YW5kZXIgR3JvdGhlbmRpZWNrIGJ5IGFubm91bmNpbmcgdGhlIHJlbGVhc2Ug b2YgT0NhbWwgdmVyc2lvbg0KICA0LjE0LjAuDQoNCiAgU29tZSBvZiB0aGUgaGlnaGxpZ2h0cyBp biB0aGUgNC4xNC4wIHJlbGVhc2UgYXJlOg0KDQogIOKAoiBJbnRlZ3JhdGVkIHN1cHBvcnQgZm9y ICJnbyB0byBkZWZpbml0aW9ucyIgaW4gTWVybGluLg0KICDigKIgU3RhbmRhcmQgbGlicmFyeTog bmV3IG1vZHVsZXMgYEluX2NoYW5uZWwnIGFuZCBgT3V0X2NoYW5uZWwnLCBtYW55DQogICAgbmV3 IGZ1bmN0aW9ucyBpbiBTZXEgbW9kdWxlLCBVVEYgZGVjb2RpbmcgYW5kIHZhbGlkYXRpb24gc3Vw cG9ydCBmb3INCiAgICBzdHJpbmdzIGFuZCBieXRlcy4NCiAg4oCiIFJ1bnRpbWUgb3B0aW1pc2F0 aW9uOiBHQyBwcmVmZXRjaGluZy4gQmVuY2htYXJrcyBzaG93IGEgc3BlZWR1cCBvZg0KICAgIGFy b3VuZCAyMCUgaW4gR0MtaGVhdnkgcHJvZ3JhbXMuDQogIOKAoiBJbXByb3ZlZCBlcnJvciBtZXNz YWdlcyBpbiBwYXJ0aWN1bGFyIGZvciBtb2R1bGUtbGV2ZWwgZXJyb3IuDQogIOKAoiBEZXByZWNh dGVkIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcyBpbiBwcmVwYXJhdGlvbiBmb3IgT0NhbWwgNS4gIElu DQogICAgcGFydGljdWxhciwgdGhlIFN0cmVhbSBhbmQgR2VubGV4IG1vZHVsZXMgYXJlIG5vdyBk ZXByZWNhdGVkLg0KICDigKIgVHlwZSB2YXJpYWJsZXMgY2FuIGJlIGV4cGxpY2l0bHkgaW50cm9k dWNlZCBpbiB2YWx1ZSBhbmQgdmFyaWFudA0KICAgIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucy4g Rm9yIGluc3RhbmNlLA0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiB2YWwgZm9sZDogKCdh Y2MgLT4gJ2VsdCAtPiAnYWNjKSAtPiAnYWNjIC0+ICdlbHQgbGlzdCAtPiAnYWNjDQogICAg4pSC IHR5cGUgc2hvd2FibGUgPSBTaG93OiAnYSAqICgnYSAtPiBzdHJpbmcpIC0+IHNob3dhYmxlDQog ICAg4pSU4pSA4pSA4pSA4pSADQogICAgY2FuIG5vdyBiZSB3cml0dGVuIGFzDQogICAg4pSM4pSA 4pSA4pSA4pSADQogICAg4pSCIHZhbCBmb2xkOiAnYWNjICdlbHQuICgnYWNjIC0+ICdlbHQgLT4g J2FjYykgLT4gJ2FjYyAtPiAnZWx0IGxpc3QgLT4gJ2FjYw0KICAgIOKUgiB0eXBlIHNob3dhYmxl ID0gU2hvdzogJ2EuICdhICogKCdhIC0+IHN0cmluZykgLT4gc2hvd2FibGUNCiAgICDilJTilIDi lIDilIDilIANCiAg4oCiIFRhaWwtY2FsbCB3aXRoIHVwIHRvIDY0IGFyZ3VtZW50cyBhcmUgbm93 IGd1YXJhbnRlZWQgdG8gYmUgb3B0aW1pemVkDQogICAgZm9yIGFsbCBhcmNoaXRlY3R1cmVzLg0K ICDigKIgRXhwZXJpbWVudGFsIHRhaWwgbW9kdWxvIGNvbnMgKFRNQykgdHJhbnNmb3JtYXRpb24N Cg0KICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBjaGFuZ2Vs b2cNCiAgYmVsb3cuICgvZWRpdG9y4oCZcyBub3RlOiBwbGVhc2UgZm9sbG93IHRoZSBhcmNoaXZl IGxpbmsgZm9yIHRoZSBmdWxsDQogIGNoYW5nZWxvZy8pDQoNCiAgVGhvc2UgcmVsZWFzZXMgYXJl IGF2YWlsYWJsZSBhcyBPUEFNIHN3aXRjaGVzLCBhbmQgYXMgYSBzb3VyY2UNCiAgZG93bmxvYWQg aGVyZToNCg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQu MTQuMC50YXIuZ3o+DQogIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29j YW1sLTQuMTQvb2NhbWwtNC4xNC4wLnRhci5nej4NCg0KDQpvY2FtbC1pbi1weXRob24uMC4xLjA6 IEVmZm9ydGxlc3MgUHl0aG9uIGJpbmRpbmdzIGZvciBPQ2FtbCBtb2R1bGVzDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1vY2FtbC1pbi1weXRob24tMC0xLTAtZWZmb3J0bGVzcy1weXRob24tYmlu ZGluZ3MtZm9yLW9jYW1sLW1vZHVsZXMvOTYwMy8xPg0KDQoNClRoaWVycnkgTWFydGluZXogYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIGhhcHB5IHRvIGFubm91bmNl IHRoZSBmaXJzdCByZWxlYXNlIG9mIGBvY2FtbC1pbi1weXRob24nOiB0aGlzIGlzDQogIGEgUHl0 aG9uIHBhY2thZ2UgdGhhdCBleHBvc2VzIGFsbCBPQ2FtbCBtb2R1bGVzIGFzIFB5dGhvbiBsaWJy YXJpZXMsDQogIGdlbmVyYXRpbmcgYmluZGluZ3Mgb24gdGhlIGZseS4gVGhpcyBjYW4gYmUgc2Vl biBhcyBhIGR1YWwgb2YNCiAgW2BweW1sX2JpbmRnZW4nXTogYHB5bWxfYmluZGdlbicgYmluZHMg UHl0aG9uIGxpYnJhcmllcyBpbiBPQ2FtbCwNCiAgd2hpbGUgYG9jYW1sLWluLXB5dGhvbicgYmlu ZHMgT0NhbWwgbW9kdWxlcyBpbiBQeXRob24uDQoNCiAgSXQgaXMgYXZhaWxhYmxlIGZyb20gW0dp dEh1Yl0gb3IgKnZpYSogYG9wYW0nOiBgb3BhbSBpbnN0YWxsDQogIG9jYW1sLWluLXB5dGhvbicN Cg0KICBSZXF1aXJlbWVudHM6IGBPQ2FtbCcgPj0gNC4xMywgYFB5dGhvbicgPj0gMy43Lg0KDQog IE9uY2UgaW5zdGFsbGVkICp2aWEqIGBvcGFtJywgdGhlIHBhY2thZ2Ugc2hvdWxkIGJlIHJlZ2lz dGVyZWQgaW4gdGhlDQogIFB5dGhvbiBlbnZpcm9ubWVudDoNCg0KICDigKIgZWl0aGVyIGJ5IHJl Z2lzdGVyaW5nIHRoZSBwYWNrYWdlIHdpdGggYHBpcCcgdXNpbmcgdGhlIGZvbGxvd2luZw0KICAg IGNvbW1hbmQgKHJlcXVpcmVzIFB5dGhvbiA+PTMuOCk6DQogICAg4pSM4pSA4pSA4pSA4pSADQog ICAg4pSCIHBpcCBpbnN0YWxsIC0tZWRpdGFibGUgImBvcGFtIHZhciBvY2FtbC1pbi1weXRob246 bGliYCINCiAgICDilJTilIDilIDilIDilIANCiAg4oCiIG9yIGJ5IGFkZGluZyB0aGUgZm9sbG93 aW5nIGRlZmluaXRpb24gdG8gdGhlIGVudmlyb25tZW50Og0KICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgIOKUgiBleHBvcnQgUFlUSE9OUEFUSD0iYG9wYW0gdmFyIHNoYXJlYC9weXRob24vOiRQWVRI T05QQVRIIg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZW4sIHdlIGNhbiBgaW1wb3J0IG9j YW1sJyBpbiBQeXRob24gYW5kIHVzZSBPQ2FtbCBtb2R1bGVzOg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIFB5dGhvbiAzLjEwLjAgKGRlZmF1bHQsIE5vdiAxMCAyMDIxLCAxOToxNjoxNCkgW0dD QyA3LjUuMF0gb24gbGludXgNCiAg4pSCIFR5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRp dHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCiAg4pSCID4+PiBpbXBvcnQg b2NhbWwNCiAg4pSCID4+PiBwcmludChvY2FtbC5MaXN0Lm1hcCgobGFtYmRhIHggOiB4ICsgMSks IFsxLCAyLCAzXSkpDQogIOKUgiBbMjszOzRdDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFdlIGNh biBmb3IgaW5zdGFuY2UgY29tcGlsZSBhbiBPQ2FtbCBtb2R1bGUgb24gdGhlIGZseSBmcm9tIFB5 dGhvbi4NCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiA+Pj4gbSA9IG9jYW1sLmNvbXBpbGUoJ2xl dCBoZWxsbyB4ID0gUHJpbnRmLnByaW50ZiAiSGVsbG8sICVzIVxuJSEiIHgnKQ0KICDilIIgPj4+ IG0uaGVsbG8oJ3dvcmxkJykNCiAg4pSCIEhlbGxvLCB3b3JsZCENCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgQW5kIHdlIGNhbiByZXF1aXJlIGFuZCB1c2UgcGFja2FnZXMgL3ZpYS8gYGZpbmRsaWIn Lg0KICDilIzilIDilIDilIDilIANCiAg4pSCID4+PiBvY2FtbC5yZXF1aXJlKCJwYXJtYXAiKQ0K ICDilIIgPj4+IGZyb20gb2NhbWwgaW1wb3J0IFBhcm1hcA0KICDilIIgPj4+IHByaW50KFBhcm1h cC5wYXJtYXAoDQogIOKUgiAuLi4gICAobGFtYmRhIHggOiB4ICsgMSksIFBhcm1hcC5BKFsxLCAy LCAzXSksIG5jb3Jlcz0yKSkNCiAg4pSCIFsyOzM7NF0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg RGV0YWlscyBhYm91dCB0aGUgY29udmVyc2lvbnMgYXJlIGdpdmVuIGluIFtgUkVBRE1FLm1kJ10u DQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpbYHB5bWxfYmluZGdlbiddDQo8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1weW1sLWJpbmRnZW4tYS1jbGktYXBwLXRvLWdlbmVyYXRlLXB5 dGhvbi1iaW5kaW5ncy1kaXJlY3RseS1mcm9tLW9jYW1sLXZhbHVlLXNwZWNpZmljYXRpb25zLzg3 ODY+DQoNCltHaXRIdWJdIDxodHRwczovL2dpdGh1Yi5jb20vdGhpZXJyeS1tYXJ0aW5lei9vY2Ft bC1pbi1weXRob24+DQoNCltgUkVBRE1FLm1kJ10NCjxodHRwczovL2dpdGh1Yi5jb20vdGhpZXJy eS1tYXJ0aW5lei9vY2FtbC1pbi1weXRob24vYmxvYi9tYWluL1JFQURNRS5tZD4NCg0KDQpPbGQg Q1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBD V04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlv dSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9m IHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2 ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0Fs YW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0 QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3Rz LmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 22 to 29, 2022.

pyml_bindgen: a CLI app to generate Python bindings directly f= rom OCaml value specifications

Archive:

Ryan Moore announced

New releases

Version 0.3.0 and 0.3.1 are now available on GitHub. 0.3.0 has been merged into opam, and a PR for 0.3.1 has been opened. The change log has more details about the changes.

Binding tuples

You can now bind tuples directly. Here's a Python function that takes two = lists of points (where each "point" is a tuple like (x, y)) and adds them together

def add(points1, points2):
    return [(x1 + y1, x2 + y2) for (x1, x2), (y1, y2) in zip(points1,=
 points2)]

And you could bind it using tuples from the OCaml side as well.

val add : points1:(int * int) list -> points2:(int * int) list -> unit -> (int * int) l=
ist

Note there are some restrictions regarding tuples, which you can read about here, here, or here.

Attributes

You can use attributes on value specifications. Currently the only one sup= ported is py_fun_name, which allows you to decouple the Python method name and the generated OCaml function name.

As an example, take the following Python function, which adds to "things".

def add(x, y):
    return x + y

You could bind multiple OCaml functions to this single function now.

val add_int : x:int -> y<=
/span>:int -> unit -> int
[@@py_fun_name add]

val add_float : x:float -> y:float -> unit=
 -> float
[@@py_fun_name add]

val add_string : x<=
/span>:string -> y:string -> u=
nit -> string
[@@py_fun_name add]
Python magic methods

This is also nice for binding Python magic methods. For example, you don't have to use __init__ as the name of the OCaml function you use to make ins= tances of a Python class. You can bind it to a more natural name like create or make.

val create : name:string -> age:int -> unit -> t
[@@py_fun_name __init__]

Using Pytypes.pyobject directly

Sometimes you may not want to bother converting Python types to normal OCam= l types at all. You can do that now in value specifications by using the Pytypes.pyobject and P= y.Object.t types directly.

Fewer dependencies

re is now used instead of re2, which drops the nu= mber of dependencies that need to be installed by about half. Additionally, core, core_bench, and bisect_= ppx don't need to be installed if you want to install pyml_bin= dgen directly from the git repository, which greatly cuts the required dependenc= ies in this case.

Thanks again to UnixJunkie for spurring many of these updates!

Tarides is hiring!

Thomas Gazagnaire announced

Following the recent announcement about Tarides (joining forces with OCaml Labs and Segfault System), we are now looking to expand our team with experienced software engineers, compassionate team leads and experts i= n software consulting services. Our ambition is to bring OCaml to a vast set of new developers and industries. = We want to make developers more productive by spending less time on fixing bugs and more on writing new features. And = we want the software industry to build more robust and performant systems that can last for decades.

We are looking for:

  • Experienced Software Engineer(s) to take part in the development of Irmin. You w= ill be part of the team that designs, builds and ships Irmin libraries and = applications to our community and customers.
  • Team Lead(s)= who cares about motivating their team members, supporting their growth= and development and successfully delivering the team's objectives on time.=
  • A Head= of Consulting Services to diversify our technical teams and commercial= services portfolio. You'll be the first hire for this brand new department= and will have the opportunity to help us build our services structure from= scratch, including our strategy, processes, tools, and team.

We are always looking for great OCaml enthusiasts to join our team, so even= if these job descriptions do not fit your profile precisely, you are welcome to send us a spontaneous application!

For Diversity and the OCaml Community: Outreachy Summer 2022

Deep in this thread, Aya announced

@pitag and I have resubmitted the PPX derivers project for this Summer 2022= round: Expand OCaml's library of standard derivers! This is the same project I was the intern for this p= ast Winter 2022 round, where the goal is to build up a stand= ard derivers library, like ppx_deriving, using the updated ppxlib API.

I'm excited to be supporting @pitag with mentoring, and for the opportunity= to stay involved now that my internship has ended :smiley:

Caqti 1.8.0 and related news

"Petter A. Urkedal announced

I am happy to announce the second release of Caqti this year. The reason for the quick succession is partly an adjustment to the new A= PI for request construction and partly that matchable er= ror conditions did not make it into the previous release. You can see the full release notes below.

I would also like to thank OCaml Software = Foundation for sponsoring my efforts on the Caqti project this year, also including most of the work that went into the previ= ous release.

One feature = in progress is a new driver based on the pure-OCaml pgx which should make it = possible, with some additional changes to the way drivers are loaded, to target MirageOS. I am note sure if this can be done = in a minor release or will require a Caqti 2 branch.

Release Notes

New features:

  • A matchable representation of common causes of errors on the database side is now available, with limitations. It focuses on conditions which seem most likely useful to handle. At the moment we lack extended error codes from SQLite3 needed to make the cause fully precise.
  • Expose the underlying error details from database client libraries. This is meant to be use as a last resort, and requires directly linking with the relevant drivers.
  • A second set of request construction operators ->., ->?, ->!, and ->* were introduced after experience with converting existi= ng code. Given the parameter and result type they return a function which constructs a request directly from a query string. Avoiding the need to compose with @:- simplifies local opens and usage with L= ist.map etc.
  • Environment variables are now expanded in the debug log when using the new request constructors introduced in 1.7.0.
  • A new ?tweaks_version connection parameter has been added = to control when the client is ready to adapt to changes in database session parameters or other adjustments of the interaction with specific database systems. [More details available in the documentation.]
  • Enable foreign key constraint checks for SQLite3 starting at tweaks version 1.7.

Fixes:

  • Fixed debug logging to pass the correct driver info to the query callback instead of a dummy driver info which would cause a failure if unsupported.

Deprecations:

  • The --> operator was renamed to -->!, w= ith a deprecated alias, for consistency with the new ->! operator.
  • The old convenience interface for creating requests has been deprecated in favour of the new infix operators and the new query template parser.
  • Documented-only deprecations of Caqti_sql_io, Caqti_= lwt_sql_io, and Caqti_async_sql_io have been annotated.

First release of prbnmcn-dagger

Igarnier announced

I'm proud to announce the release of version 0.0.2 of prbnmcn-dagger.

This version adds Sequential Monte-Carlo, a.k.a. particle filters-based inference to the library.

Here's the full changelog:

  • Dependency: prbnmcn-stats.0.0.3 -> prbnmcn-stats.= 0.0.4
  • Add beta distribution to Gsl samplers
  • Refactor Cps monad
  • Add SMC inference
  • Simplify handler type, modularize effect definitions away from Cps_mona= d
  • Fix typo: bernouilli -> bernoulli (report by @nilsbecker)

I also wrote the following article: Applying Sequential Monte-Carlo to time series forecasting It contains some use cases for the library, I hope some find it fun :)

To conclude this post, and as a partial answer to @gasche 's question in an older thread, I believe that unlike some other inference techniques, single-shot continuations are = enough to implement SMC. Without getting into the details, the implementation is very reminiscent of that of lightwe= ight threading libraries. I look forward to experiment with a fibre-based implementation!

MirageOS 4.0

Thomas Gazagnaire announced

On behalf of the MirageOS team, I am delighted to announce the release o= f MirageOS 4.0.0! I'd like to send special thanks to @dinosaure and @Lortex who drove that release forward for= multiple years.

Since the first release of 2013, MirageOS has made steady progress toward d= eploying a self-managed internet infrastructure. The project=E2=80=99s initial aim was to self-host as many = services as possible aimed at empowering internet users to securely deploy infrastructure to own= their data and take back control of their privacy. MirageOS can securely deploy static website hosting with =E2=80=9CLet=E2=80=99s Encrypt=E2= =80=9D certificate provisioning and a se= cure SMTPstack with security extensions. MirageOS can also deploy decentralised communication infrastructure like Matrix, OpenVPN servers, and TLS tunnels to ensure data privacy or DNS(= SEC) servers for better authentication.

The protocol ecosystem now contains = hundreds of libraries and services millions of daily users. Over these years, major commercial users have join= ed the projects. They rely on MirageOS libraries to keep their products secure. For instance, the MirageOS network= ing code powers Docker Desktop=E2=80=99s VPNKit, which serves the traffic of millions of containers daily. Citrix Hypervisor uses MirageOS to interact with Xen, the hypervisor that powers most of today=E2=80=99s public cloud. Nitrokey is developing a new hardware security module based on MirageOS. Robur develops a unikernel orchestration system for fleets of MirageOS unikernels. Tarides uses MirageOS to improve the Tezos blockchain, and Hyper uses MirageOS to build sensor analytics and an automation platform for sustainable agriculture.

In the coming weeks, our blog will feature in-depth technical content for t= he new features that MirageOS brings, as well as a tour of the existing community and commercial users of MirageOS. = Please reach out if you=E2=80=99d like to tell us about your story.

Install MirageOS 4

The easiest way to install MirageOS 4 is by using the opam version 2.1 and = `ocaml>=3D4.12.1`. Follow the installation guide for more details.

$ opam update
$ opam install 'mirage>4'

Note: if you upgrade from MirageOS 3 you will need to manually clean= the previous generated files (or call mirage clean before upgrading). You would also want to read the full list of API changes. You can see unikernel examples in mirage/mirage-skeleto= n, roburio/unikernels or tarides/unikernels.

About MirageOS

MirageOS is a library operating system that constructs unikernels for secur= e, high-performance, low-energy footprint applications across various hypervisor and embedded platforms. It is availa= ble as an open-source project created and maintained by the MirageOS Core Team. A unikernel can be customised based on the target architecture by picking the relevant MirageOS libraries and compiling them = into a standalone operating system, which contains strictly the functionality necessary for the target. This minimise= s the unikernel=E2=80=99s footprint, increasing the security of the deployed operating system.

The MirageOS architecture can be divided into operating system libraries, t= yped signatures, and a metaprogramming compiler. The operating system libraries implement various functionalities,= ranging from low-level network card drivers, to full reimplementations of the TLS p= rotocol, as well as the Git protocol to store versioned data. A set of typed signatures ensures that the OS librari= es are consistent and work well in conjunction with each other. Most importantly, MirageOS is= also a metaprogramming compiler that can input OCaml source code along with its dependencies, and a deployment target description in order to generate an executable unikernel, i.e., a specialis= ed binary artefact containing only the code needed to run on the target platform. Overall, MirageOS focuses on pro= viding a small, well-defined, typed interface with the system components of the target architecture.

Read the full announcement on mirage.io's blog.

Anil Madhavapeddy then added

For those curious about what some of the MirageOS libraries are, there is a raw Yaml list over at mirage/mirage-repositories listing most of them. Conversion of this Yaml to HTML for the main mirage.io website would be a w= elcome contribution! :slight_smile:

OCaml 4.14.0 is released

octachron announced

The OCaml team has the pleasure of celebrating the birthday of Alexander Gr= othendieck by announcing the release of OCaml version 4.14.0.

Some of the highlights in the 4.14.0 release are:

  • Integrated support for "go to definitions" in Merlin.
  • Standard library: new modules In_channel and Out_cha= nnel, many new functions in Seq module, UTF decoding and validation support for strings and bytes.
  • Runtime optimisation: GC prefetching. Benchmarks show a speedup of arou= nd 20% in GC-heavy programs.
  • Improved error messages in particular for module-level error.
  • Deprecated functions and modules in preparation for OCaml 5. In particular, the Stream and Genlex modules are now deprecated.
  • Type variables can be explicitly introduced in value and variant constructor declarations. For instance,

    val fold: ('acc -> 'e=
    lt -> 'acc) -> 'acc -> 'elt list -> 'acc
    type showable =3D Show: 'a * ('a -> string) -> showable
    

    can now be written as

    val fold: 'acc 'elt. ('a=
    cc -> 'elt -> 'acc) -> 'acc -> 'elt list -> 'acc
    type showable =3D Show: 'a. 'a * ('a -> string) -> show=
    able
    
  • Tail-call with up to 64 arguments are now guaranteed to be optimized for all architectures.
  • Experimental tail modulo cons (TMC) transformation

The full list of changes can be found in the changelog below. (editor=E2= =80=99s note: please follow the archive link for the full changelog)

Those releases are available as OPAM switches, and as a source download her= e:

ocaml-in-python.0.1.0: Effortless Python bindings for OCaml mo= dules

Thierry Martinez announced

I am happy to announce the first release of ocaml-in-python: t= his is a Python package that exposes all OCaml modules as Python libraries, generating bindings on the fly. This can be se= en as a dual of pym= l_bindgen: pyml_bindgen binds Python libraries in OCaml, while ocam= l-in-python binds OCaml modules in Python.

It is available from GitHub or via opam: opam install ocaml-in-python

Requirements: OCaml >=3D 4.13, Python >=3D = 3.7.

Once installed via opam, the package should be register= ed in the Python environment:

  • either by registering the package with pip using the following= command (requires Python >=3D3.8):

    pip install --editable "`opam var ocaml-in-python:lib`"
    
  • or by adding the following definition to the environment:

    export =
    PYTHONPATH=3D"`opam var share`/python/:$PYTHONPATH"
    

Then, we can import ocaml in Python and use OCaml modules:

Python 3.10.0 (default, Nov 10 2021, 19:16:14=
) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or  for more informat=
ion.
>>> import ocaml
>>> print(ocaml.List.map((lambd=
a x : x + 1), [1, 2, 3]))
[2;3;4]

We can for instance compile an OCaml module on the fly from Python.

>>> =
m =3D ocaml.compile('let hello x =3D Printf.printf "Hello, %s!\n%!" x')
>>> m.hello('world')
Hello, world!

And we can require and use packages via findlib.

>>> ocaml.require("parmap")
>>> from ocaml import Parmap
>>> print(Parmap.parmap(
...   (lambda x : x + 1), Parmap.A([=
1, 2, 3]), ncores=3D2))
[2;3;4]

Details about the conversions are given in README.md.

Happy hacking!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

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

--==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=--