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 84BD85D4 for ; Tue, 21 Apr 2020 08:58:26 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.72,409,1580770800"; d="scan'208,217";a="446104259" Received: from sympa.inria.fr ([193.51.193.213]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Apr 2020 10:58:25 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 294667EEA4; Tue, 21 Apr 2020 10:58:25 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C1C647EEA4 for ; Tue, 21 Apr 2020 10:58:22 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3AgS5B+BE9KCv1kXfqaQq0s51GYnF86YWxBRYc798d?= =?us-ascii?q?s5kLTJ76os+9bnLW6fgltlLVR4KTs6sC17OL9fy9EjRRqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjWwba5yIRmsogjctsYajZdmJ60s1hbHv3xEdv?= =?us-ascii?q?hMy2h1P1yThRH85smx/J5n7Stdvu8q+tBDX6vnYak2VKRUAzs6PW874s3rrgTD?= =?us-ascii?q?QhCU5nQASGUWkwFHDBbD4RrnQ5r+qCr6tu562CmHIc37SK0/VDq+46t3ThLjlS?= =?us-ascii?q?AIOSMk8GHMksx/kr5UoA6vqRx4xo7beoCVNPxjda/Zct4XQW9NU8BRWyJCBIO8?= =?us-ascii?q?cYoPD/EAPelDq4nyuUYFrBW5BQm2Gezv0SJDinv40KEm1ugsFxzN0g49ENIUqH?= =?us-ascii?q?narMv7OrocX+62w6bH0S7OYOlK1Trn8oXEbgwtrPOKULltccTR004vFwbdg1iM?= =?us-ascii?q?rYzqJTWV3fkQvWeH7+pgUOOvi3I7qwpspTWg3MMshZPPho4P0VDL6SV5wIM0Jd?= =?us-ascii?q?2kVE52esakEJxUtyCaK4t5XN8tQ2FuuCY7070GpIC0cDINyJQ9yB7ScvqKeJWG?= =?us-ascii?q?7BLkUeaeOzZ4hHR9dbKnmRmy7UmgyvHiWcms11ZKqy9FncfWunALyRPT9tCLSv?= =?us-ascii?q?xh8Ui73DaP0xrf6uZeIUA7jabbJJ8hwqIwlpoOqkvPBDP5mELzjKOOaEok4PKo?= =?us-ascii?q?5P77YrXnv5+cKpF7hhviPaQugsCwHeE4MhUUU2eF5Ou8yaXv/VblQLpQkvI2ka?= =?us-ascii?q?7ZsI7EKsQBqK65BwhV04g55xmjCDem1cwUnWMALFJeZB2HjpXmO0zVIPziEfi/?= =?us-ascii?q?hFGsnC9kx/DHIr3hAojNIWPZnLfgerZx81VcxxYyzdBc5pJUFqgNIPbtVUDrrt?= =?us-ascii?q?zYCAU1Mwuuw+boENlyy4QeVn6MAqCHKqPeq0OH5uUqI+WUY48apCv9K+I/5/Hw?= =?us-ascii?q?i385hUURfa6z3ZsYcHy4GehpLF+cYXromtcBC2AKshAiQ+ztjV2OSSZTZ22sUK?= =?us-ascii?q?I44jE7D5mmAZ3fSYCqhbyNxCm7HodMaWBDEF+ACGvne5+YVPcLbSKeOs1hnSYC?= =?us-ascii?q?Vbe/UI8hyQuuuxHkxLp7NObb5ioYtZf72NRp/OLTjws99TpoAMSdyW2CU2Z0nm?= =?us-ascii?q?YQSz8z3aB/u1Zyylid3qRigvxYEsRf5/VQUgchLpHQ1e16C9fqVgLAeNeJUlem?= =?us-ascii?q?Tc+8DTE/VNI928UBY0BgFNW4kB/D3TCmDKMSl7yOHJA07rjT32LwJ8lg1XnGz7?= =?us-ascii?q?MtgEUhQstKLWGmh7Nw9gjXB47NiUmZkLyqdasa0SXQ92mD1XKDsFxGXAN0S6nJ?= =?us-ascii?q?QGwTa0TModn3+k/OVbGjBLs/PgZDysOOMLVGZ9L3gVlcWfvuN87Sb3++lmusAx?= =?us-ascii?q?uD26mCY5Dwe2oH2SXQEEgEnB4X/XaBLQU+Ayigr3/EADx2ElLvZ0Pt8fVgp3yn?= =?us-ascii?q?Tk80yQCKb1R817Wr4BIVguacS/wL0rIFvicutSl0EU6g097ID9eMvRdtcLlTbN?= =?us-ascii?q?8n7lpLyXjVugJyM5C4KqBtnF8ecwB5v0P00BV3D51Nn9U2on030AZ/MayW31Jf?= =?us-ascii?q?ezKWxZ39O73ZJ3Hq/BCob67X2k3e38iK9acP7vQ4qkzjvBy3GUY49HVnydZV3m?= =?us-ascii?q?OG6ZXOFgUSV4j9Ul0r+Bh6orHaYzU955/P2HJ3Nqm0rznC1M43C+s+0BqgethS?= =?us-ascii?q?MayeGA/1Cc0aCNCiKPY2lFixchIEIOdS+bYoMMy8cvuG3LenPOJhnDK9kWRK+5?= =?us-ascii?q?t900KJ9ypkUOHExZcFw/eC3guGTTjwllmhstqk0bxDMHsWAWz1gXzgG4h5YrJ0?= =?us-ascii?q?O4AGFTHqa4e82dM0z9a5UGFe3FqiHE8dns6laB6WKVvn0lsUnU8epHjinSqj0x?= =?us-ascii?q?R1lSsop+yRxmiGyOPnbDIDO3VXXy9ll13tPYGwgdcKGkW1PCYzkx7wzELzweBg?= =?us-ascii?q?r6R6LnXPCRNBeyHwaXppUq6xqqaqe8lL+Y8luiVRUf2hbBadULGr8EhS6D/qA2?= =?us-ascii?q?YLnGNzTDqtoJiswE0j1DCtaU1rpX+cQvlegA/F7YWNF+ZW2isaSSJ4jzjOG1X6?= =?us-ascii?q?OMOmr4zNysXz99umXmfkbaV9NCnmyYTa73m+9TQsGRq7juy+kd3hEBEn3Gn8zd?= =?us-ascii?q?Y4DHyZ/ia5WZHi0uGBCcwie0BpAFHm7M8jRdN0lZY2j5wLn31GltOS53VVyGo?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyK?= =?us-ascii?q?oQeiQKFfIUfAoUojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGP?= =?us-ascii?q?gIlIwMUAQYDAgQNARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwI?= =?us-ascii?q?JBQEOCSaELYFADQITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABA?= =?us-ascii?q?QYLRYJcgl8Ei2mCKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4F?= =?us-ascii?q?VhUkHa4EvhUqODYE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoK?= =?us-ascii?q?GpUgSaBdTuFQz8zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IPAS-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyKoQeiQKFfIUfAoU?= =?us-ascii?q?ojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGPgIlIwMUAQYDAgQ?= =?us-ascii?q?NARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwIJBQEOCSaELYFAD?= =?us-ascii?q?QITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABAQYLRYJcgl8Ei2m?= =?us-ascii?q?CKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4FVhUkHa4EvhUqOD?= =?us-ascii?q?YE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoKGpUgSaBdTuFQz8?= =?us-ascii?q?zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IronPort-AV: E=Sophos;i="5.72,409,1580770800"; d="scan'208,217";a="346515106" X-MGA-submission: =?us-ascii?q?MDFz1NCLecIov2QbFf/rwv+2m+sCBDcVEyuphg?= =?us-ascii?q?EGG+g6rIZTGGs8ZYkVeXgDFKNwfNGhYgpVXq+qJ1fm+lstmloz5OiRlL?= =?us-ascii?q?uZmrJCkdQh+Oxong5B64wiQukGqXHz1fqnxtJKBLcJz8q310So1PEuXy?= =?us-ascii?q?qQJxFHPahzfzKX03dRCpsU3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 10:58:20 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 415915613BD; Tue, 21 Apr 2020 10:58:16 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 21 Apr 2020 10:58:15 +0200 Message-ID: <87h7xdnrko.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 21 10:58:17 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.086842, queueID=E39BF5613BF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18110 Errors-to: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMTQgdG8gMjEsDQoyMDIwLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkN1cnJlbnRf aW5jcjogYSBzbWFsbCBpbmNyZW1lbnRhbCBsaWJyYXJ5IHdpdGggbm8gZGVwZW5kZW5jaWVzDQpT Y2lraXQtbGVhcm4gZm9yIE9DYW1sDQpPQ2FtbCBhbmQgb3BhbSBjb250YWluZXIgaW1hZ2VzIHVw ZGF0ZWQ6IG5ldyBGZWRvcmEvQWxwaW5lL1VidW50dSBpbWFnZXMNCk9DYW1sZm9ybWF0IDAuMTQu MA0KSGFzaGNvbnNpbmcgYW4gQVNUIHZpYSBQUFgNCkdlbnByaW50IHYwLjQNCk90aGVyIE9DYW1s IE5ld3MNCk9sZCBDV04NCg0KDQpDdXJyZW50X2luY3I6IGEgc21hbGwgaW5jcmVtZW50YWwgbGli cmFyeSB3aXRoIG5vIGRlcGVuZGVuY2llcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3VycmVudC1pbmNyLWEtc21hbGwt aW5jcmVtZW50YWwtbGlicmFyeS13aXRoLW5vLWRlcGVuZGVuY2llcy81NTMxLzE+DQoNCg0KVGhv bWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgcmVjZW50IFtP Q3VycmVudCAwLjJdIHJlbGVhc2UgaW5jbHVkZWQgYSBsaXR0bGUgaW5jcmVtZW50YWwNCiAgbGli cmFyeSB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBzb21lIHBlb3BsZS4gSXQgaXMgdXNl ZnVsIGZvcg0KICB3cml0aW5nIHByb2dyYW1zIHRoYXQgbmVlZCB0byBrZWVwIHNvbWUgY29tcHV0 YXRpb24gdXAtdG8tZGF0ZQ0KICBlZmZpY2llbnRseSBhcyB0aGUgaW5wdXRzIGNoYW5nZS4NCg0K ICBJdCBpcyBzaW1pbGFyIHRvIHRoZSBleGlzdGluZyBbaW5jcmVtZW50YWxdIGFuZCBbcmVhY3Rd IGxpYnJhcmllcw0KICBhbHJlYWR5IGluIG9wYW0uIFVubGlrZSBgaW5jcmVtZW50YWwnICh3aGlj aCBwdWxscyBpbiB0aGUgd2hvbGUgb2YNCiAgYGNvcmVfa2VybmVsJyksIGBjdXJyZW50X2luY3In IGhhcyBubyBydW50aW1lIGRlcGVuZGVuY2llcyAoYW5kIGJ1aWxkDQogIGRlcGVuZGVuY2llcyBv bmx5IG9uIGBvY2FtbCcgYW5kIGBkdW5lJykuIFVubGlrZSBgcmVhY3QnLA0KICBgY3VycmVudF9p bmNyJyBpbW1lZGlhdGVseSBzdG9wcyBjb21wdXRhdGlvbnMgd2hlbiB0aGV5IGFyZSBubyBsb25n ZXINCiAgbmVlZGVkIChyYXRoZXIgdGhhbiByZWx5aW5nIG9uIHdlYWsgcmVmZXJlbmNlcyBhbmQg dGhlIGdhcmJhZ2UNCiAgY29sbGVjdG9yKS4NCg0KICBJdCBpcyBhIGZhaXJseSBkaXJlY3QgaW1w bGVtZW50YXRpb24gb2YgdGhlIFtBZGFwdGl2ZSBGdW5jdGlvbmFsDQogIFByb2dyYW1taW5nXSBw YXBlciwgYW5kIG1pZ2h0IGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgcGVvcGxlDQogIHdh bnRpbmcgdG8gbGVhcm4gYWJvdXQgdGhhdC4NCg0KICBZb3UgY2FuIGdldCB0aGUgbGlicmFyeSB1 c2luZyBgb3BhbSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluc3RhbGwgY3Vy cmVudF9pbmNyDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEhlcmUncyBhIHNpbXBsZSBleGFtcGxl IChpbiB1dG9wKToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICNyZXF1aXJlICJjdXJyZW50 X2luY3IiOzsNCiAg4pSCDQogIOKUgiBsZXQgdG90YWwgPSBDdXJyZW50X2luY3IudmFyIDEwDQog IOKUgiBsZXQgY29tcGxldGUgPSBDdXJyZW50X2luY3IudmFyIDUNCiAg4pSCDQogIOKUgiBsZXQg c3RhdHVzID0NCiAg4pSCICAgQ3VycmVudF9pbmNyLm9mX2NjIGJlZ2luDQogIOKUgiAgICAgQ3Vy cmVudF9pbmNyLnJlYWQgKEN1cnJlbnRfaW5jci5vZl92YXIgdG90YWwpIEBAIGZ1bmN0aW9uDQog IOKUgiAgICAgfCAwIC0+IEN1cnJlbnRfaW5jci53cml0ZSAiTm8gam9icyINCiAg4pSCICAgICB8 IHRvdGFsIC0+DQogIOKUgiAgICAgICBDdXJyZW50X2luY3IucmVhZCAoQ3VycmVudF9pbmNyLm9m X3ZhciBjb21wbGV0ZSkgQEAgZnVuIGNvbXBsZXRlIC0+DQogIOKUgiAgICAgICBsZXQgZnJhYyA9 IGZsb2F0X29mX2ludCBjb21wbGV0ZSAvLiBmbG9hdF9vZl9pbnQgdG90YWwgaW4NCiAg4pSCICAg ICAgIFByaW50Zi5zcHJpbnRmICIlZC8lZCBqb2JzIGNvbXBsZXRlICglLjFmJSUpIg0KICDilIIg CQkgICAgIGNvbXBsZXRlIHRvdGFsICgxMDAuICouIGZyYWMpDQogIOKUgiAgICAgICB8PiBDdXJy ZW50X2luY3Iud3JpdGUNCiAg4pSCICAgZW5kDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg ZGVmaW5lcyB0d28gaW5wdXQgdmFyaWFibGVzIChgdG90YWwnIGFuZCBgY29tcGxldGUnKSBhbmQg YQ0KICAiY2hhbmdlYWJsZSBjb21wdXRhdGlvbiIgKGBzdGF0dXMnKSB3aG9zZSBvdXRwdXQgZGVw ZW5kcyBvbiB0aGVtLiBBdA0KICB0aGUgdG9wLWxldmVsLCB3ZSBjYW4gb2JzZXJ2ZSB0aGUgaW5p dGlhbCBzdGF0ZSB1c2luZyBgb2JzZXJ2ZSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAj IHByaW50X2VuZGxpbmUgQEAgQ3VycmVudF9pbmNyLm9ic2VydmUgc3RhdHVzOzsNCiAg4pSCIDUv MTAgam9icyBjb21wbGV0ZSAoNTAuMCUpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFVubGlrZSBh IHBsYWluIGByZWYnIGNlbGwsIGEgYEN1cnJlbnRfaW5jci52YXInIGtlZXBzIHRyYWNrIG9mIHdo aWNoDQogIGNvbXB1dGF0aW9ucyBkZXBlbmQgb24gaXQuIEFmdGVyIGNoYW5naW5nIHRoZW0sIHlv dSBtdXN0IGNhbGwNCiAgYHByb3BhZ2F0ZScgdG8gdXBkYXRlIHRoZSByZXN1bHRzOg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgIyBDdXJyZW50X2luY3IuY2hhbmdlIHRvdGFsIDEyOzsNCiAg 4pSCICMgQ3VycmVudF9pbmNyLmNoYW5nZSBjb21wbGV0ZSA0OzsNCiAg4pSCICMgcHJpbnRfZW5k bGluZSBAQCBDdXJyZW50X2luY3Iub2JzZXJ2ZSBzdGF0dXM7Ow0KICDilIIgNS8xMCBqb2JzIGNv bXBsZXRlICg1MC4wJSkJKCogTm90IHlldCB1cGRhdGVkICopDQogIOKUgg0KICDilIIgIyBDdXJy ZW50X2luY3IucHJvcGFnYXRlICgpOw0KICDilIIgIyBwcmludF9lbmRsaW5lIEBAIEN1cnJlbnRf aW5jci5vYnNlcnZlIHN0YXR1czs7DQogIOKUgiA0LzEyIGpvYnMgY29tcGxldGUgKDMzLjMlKQ0K ICDilJTilIDilIDilIDilIANCg0KICBDb21wdXRhdGlvbnMgY2FuIGhhdmUgc2lkZS1lZmZlY3Rz LCBhbmQgeW91IGNhbiB1c2UgYG9uX3JlbGVhc2UnIHRvDQogIHJ1biBzb21lIGNvbXBlbnNhdGlu ZyBhY3Rpb24gaWYgdGhlIGNvbXB1dGF0aW9uIG5lZWRzIHRvIGJlIHVuZG9uZQ0KICBsYXRlci4g SGVyZSdzIGEgZnVuY3Rpb24gdGhhdCBwdWJsaXNoZXMgYSByZXN1bHQsIGFuZCBhbHNvIHJlZ2lz dGVycyBhDQogIGNvbXBlbnNhdGlvbiBmb3IgaXQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giBsZXQgcHVibGlzaCBtc2cgPQ0KICDilIIgICBQcmludGYucHJpbnRmICJQVUJMSVNIOiAlc1xu JSEiIG1zZzsNCiAg4pSCICAgQ3VycmVudF9pbmNyLm9uX3JlbGVhc2UgQEAgZnVuICgpIC0+DQog IOKUgiAgIFByaW50Zi5wcmludGYgIlJFVFJBQ1Q6ICVzXG4lISIgbXNnDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpczoNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCICMgbGV0IGRpc3BsYXkgPSBDdXJyZW50X2luY3IubWFwIHB1Ymxpc2ggc3RhdHVzOzsN CiAg4pSCIFBVQkxJU0g6IDQvMTIgam9icyBjb21wbGV0ZSAoMzMuMyUpDQogIOKUgg0KICDilIIg IyBDdXJyZW50X2luY3IuY2hhbmdlIHRvdGFsIDA7DQogIOKUgiAjIEN1cnJlbnRfaW5jci5wcm9w YWdhdGUgKCkNCiAg4pSCIFJFVFJBQ1Q6IDQvMTIgam9icyBjb21wbGV0ZSAoMzMuMyUpDQogIOKU giBQVUJMSVNIOiBObyBqb2JzDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEEgbWFqb3IgZGlmZmVy ZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSByZWFjdCBsaWJyYXJ5ICh3aGljaCBJJ3ZlIHVzZWQN CiAgaW4gcHJldmlvdXNseSBpbiBbMGluc3RhbGwncyBwcm9ncmVzcyByZXBvcnRpbmddIGFuZCBb Q3VlS2VlcGVyXSkgaXMNCiAgdGhhdCBgQ3VycmVudF9pbmNyJyBkb2VzIG5vdCBkZXBlbmQgb24g dGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRlY2lkZQ0KICB3aGVuIHRvIHN0b3AgYSBjb21wdXRh dGlvbi4gSW4gcmVhY3QsIHlvdSdkIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBtYWtlDQogIHN1cmUg dGhhdCBgZGlzcGxheScgZGlkbid0IGdldCBHQydkIChldmVuIHRob3VnaCB5b3UgZG9uJ3QgbmVl ZCB0bw0KICByZWZlciB0byBpdCBhZ2FpbikgYmVjYXVzZSBpZiBpdCBkaWQgdGhlbiB0aGUgb3V0 cHV0IHdvdWxkIHN0b3ANCiAgZ2V0dGluZyB1cGRhdGVkLiBBbHNvLCBzZXR0aW5nIGB0b3RhbCcg dG8gYDAnIGluIHJlYWN0IG1pZ2h0IGNhdXNlIHRoZQ0KICBwcm9ncmFtIHRvIGNyYXNoIHdpdGgg YSBkaXZpc2lvbi1ieS16ZXJvIGV4Y2VwdGlvbiwgYmVjYXVzZSB0aGUgYGZyYWMnDQogIGNvbXB1 dGF0aW9uIHdpbGwgY29udGludWUgcnVubmluZyB1bnRpbCBpdCBnZXRzIEdDJ2QsIGV2ZW4gdGhv dWdoIGl0DQogIGlzbid0IG5lZWRlZCBmb3IgYW55dGhpbmcgbm93Lg0KDQogIFtgQ3VycmVudF9p bmNyJydzIEFQSV0gaXMgcHJldHR5IHNtYWxsLiBZb3UgbWlnaHQgd2FudCB0byB3cmFwIGl0IHRv DQogIHByb3ZpZGUgZXh0cmEgZmVhdHVyZXMsIGUuZy4NCg0KICDigKIgVXNlIG9mIGEgYHJlc3Vs dCcgdHlwZSB0byBwcm9wYWdhdGUgZXJyb3JzLg0KICDigKIgSW50ZWdyYXRpb24gd2l0aCBgTHd0 JyB0byBhbGxvdyBhc3luY2hyb25vdXMgY29tcHV0YXRpb25zLg0KICDigKIgU3RhdGljIGFuYWx5 c2lzIHRvIHJlbmRlciB5b3VyIGNvbXB1dGF0aW9uIHdpdGggZ3JhcGh2aXouDQogIOKAoiBQZXJz aXN0ZW5jZSBvZiBzdGF0ZSB0byBkaXNrLg0KDQogIElmIHlvdSBuZWVkIHRoYXQsIGNvbnNpZGVy IHVzaW5nIHRoZSBtYWluIFtPQ3VycmVudF0gbGlicmFyeSwgd2hpY2gNCiAgZXh0ZW5kcyBgY3Vy cmVudF9pbmNyJyB3aXRoIHRoZXNlIGZlYXR1cmVzLg0KDQoNCltPQ3VycmVudCAwLjJdIDxodHRw czovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb2N1cnJlbnQvcmVsZWFzZXMvdGFnL3YwLjI+DQoNCltp bmNyZW1lbnRhbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2luY3JlbWVudGFsPg0K DQpbcmVhY3RdIDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9yZWFjdD4NCg0KW0FkYXB0 aXZlIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmddDQo8aHR0cHM6Ly93d3cuY3MuY211LmVkdS9+Z3V5 Yi9wYXBlcnMvcG9wbDAyLnBkZj4NCg0KWzBpbnN0YWxsJ3MgcHJvZ3Jlc3MgcmVwb3J0aW5nXQ0K PGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5OTc1MTQwL2hvdy10by1zdG9w LW9jYW1sLWdhcmJhZ2UtY29sbGVjdGluZy1teS1yZWFjdGl2ZS1ldmVudC1oYW5kbGVyPg0KDQpb Q3VlS2VlcGVyXQ0KPGh0dHBzOi8vcm9zY2lkdXMuY29tL2Jsb2cvYmxvZy8yMDE1LzA2LzIyL2N1 ZWtlZXBlci1pbnRlcm5hbHMtaXJtaW4vPg0KDQpbYEN1cnJlbnRfaW5jcicncyBBUEldDQo8aHR0 cHM6Ly9vY3VycmVudC5naXRodWIuaW8vb2N1cnJlbnQvY3VycmVudF9pbmNyL0N1cnJlbnRfaW5j ci9pbmRleC5odG1sPg0KDQpbT0N1cnJlbnRdIDxodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQv b2N1cnJlbnQ+DQoNCg0KU2Npa2l0LWxlYXJuIGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zY2lraXQtbGVhcm4tZm9yLW9jYW1s LzU1MzYvMT4NCg0KDQpVbml4SnVua2llIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUm9uYW4gTGVoeSBq dXN0IGhhY2tlZCB0aGlzOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vbGVoeS9vY2FtbC1za2xl YXJuPg0KDQogIFRoaXMgbWlnaHQgaW50ZXJlc3QgYSBzaWduaWZpY2FudCBudW1iZXIgb2YgcGVv cGxlIG91dCB0aGVyZS4gIFdlIGFyZQ0KICBubyBtb3JlIGNvbmRlbW5lZCB0byBsaXZlIGluIGEg d29ybGQgZnVsbCBvZiBzbmFrZXMgdGhhdCB3aWxsIGJpdGUgdXMNCiAgYXQgcnVuLXRpbWUuIDpz bWlsZXk6DQoNCg0KUm9uYW4gTGUgSHkgdGhlbiBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBTbyBJIGNhbWUg aGVyZSB0byBhbm5vdW5jZSBvY2FtbC1za2xlYXJuIGFzIGl0IGp1c3QgZ290IHB1Ymxpc2hlZCBv bg0KICBPcGFtLCBidXQgSSBzZWUgQFVuaXhKdW5raWUgZGlkIGl0IGZvciBtZSAoYXJpZ2F0byBn b3phaQ0KICBtYXN1KS4gQW55d2F5Og0KICDigKIgdGhpcyBhbWJpdGlvbnMgdG8gY292ZXIgdGhl IGNvbXBsZXRlIHNjaWtpdC1sZWFybiBBUEkNCiAg4oCiIHRoaXMgYW1iaXRpb24gaXMgY3VycmVu dGx5IG5vdCB0b3RhbGx5IHJlYWxpemVkLCBidXQgSSB3YW50ZWQgdG8NCiAgICByZWxlYXNlIHNv bWV0aGluZyBpbml0aWFsIHRoYXQgb25lIGNhbiBwbGF5IHdpdGgNCiAg4oCiIGl0J3MgYWxsIEBV bml4SnVua2llJ3MgZmF1bHQgd2l0aCBoaXMgZnVubnkgUiB3cmFwcGVycy4NCg0KICBTbzoNCiAg 4oCiIG9wYW0gaW5zdGFsbCBza2xlYXJuDQogIOKAoiBnbyBjaGVjayBvdXQgW3NjaWtpdC1sZWFy biBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gdG8ga25vdw0KICAgIHdoYXQgaXQgZG9l cw0KICDigKIgbG9vayBhdCBbb2NhbWwtc2tsZWFybidzIGRvY3VtZW50YXRpb25dIHRvIHNlZSB3 aGF0IHRoZSBjdXJyZW50DQogICAgT0NhbWwgQVBJIGxvb2tzIGxpa2UNCiAg4oCiIGhhdmUgZnVu IHdpdGggaXQgYW5kIHRlbGwgbWUgd2hhdCB5b3UgdGhpbmsgb2YgaXQuDQoNCg0KW3NjaWtpdC1s ZWFybiBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gPGh0dHBzOi8vc2Npa2l0LWxlYXJu Lm9yZz4NCg0KW29jYW1sLXNrbGVhcm4ncyBkb2N1bWVudGF0aW9uXSA8aHR0cHM6Ly9sZWh5Lmdp dGh1Yi5pby9vY2FtbC1za2xlYXJuLz4NCg0KDQpBbnRvbiBLb2Noa292IHRoZW4gYWRkZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFByb2JhYmx5IHdvcnRoIHRvIGFkZCBoZXJlOg0KICDigKIgPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkvYXdlc29tZS1vY2FtbCNtYWNoaW5lLWxl YXJuaW5nPg0KDQoNCk9DYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXMgdXBkYXRlZDogbmV3 IEZlZG9yYS9BbHBpbmUvVWJ1bnR1IGltYWdlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1hbmQtb3BhbS1jb250YWluZXItaW1hZ2VzLXVwZGF0ZWQtbmV3LWZlZG9y YS1hbHBpbmUtdWJ1bnR1LWltYWdlcy81NTM5LzE+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgRG9ja2VyIFtvY2FtbCBh bmQgb3BhbSBjb250YWluZXIgaW1hZ2VzXSBoYXZlIGJlZW4gdXBkYXRlZDoNCg0KICDigKIgQWxw aW5lIDMuMTEsIEZlZG9yYSAzMSBhbmQgVWJ1bnR1IDIwLjA0IChiZXRhKSBhcmUgbm93IGluY2x1 ZGVkLg0KICDigKIgVWJ1bnR1IDE5LjA0IGFuZCBGZWRvcmEgMjkgYW5kIDMwIGFyZSBub3cgZGVw cmVjYXRlZC4NCiAg4oCiIE9DYW1sIDQuMDkuMSBhbmQgNC4xMS4wfmRldiBoYXZlIGJlZW4gcmVm cmVzaGVkLg0KDQogIFlvdSBjYW4gZmluZCB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBjb250YWlu ZXIgaW1hZ2VzIGF2YWlsYWJsZSBbb24NCiAgdGhlIE9DYW1sIGluZnJhc3RydWN0dXJlIHdpa2ld Lg0KDQogIFRoZSBjb250YWluZXJzIGFyZSBnZW5lcmF0ZWQgZnJvbSBhIHNldCBvZiBzY3JpcHRz IHVzaW5nDQogIFtvY2FtbC1kb2NrZXJmaWxlXSwgYW5kIHdpbGwgYmUgbWlncmF0aW5nIG92ZXIg dGhlIG5leHQgc2l4IG1vbnRocyB0bw0KICB1c2UgYW4gW29jdXJyZW50XS1iYXNlZCBpbmZyYXN0 cnVjdHVyZS4gVGhlcmUgd2lsbCBiZSBhbiBhbm5vdW5jZW1lbnQNCiAgb24gdGhpcyBmb3J1bSBh Ym91dCBhbnkgdXNlci1mYWNpbmcgY2hhbmdlcyB0aGF0IGludm9sdmVzLCB3aXRoIHBsZW50eQ0K ICBvZiB0aW1lIHRvIHRyYW5zaXRpb24geW91ciBvd24gQ0lzIG92ZXIuICBUaGFua3MgZ28gdG8g QHRhbGV4NSBhbmQNCiAgQFhWaWxrYSBmb3IgY29udHJpYnV0aW9ucyB0byB0aGlzIHJvdW5kIG9m IHVwZGF0ZXMuDQoNCg0KW29jYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXNdIDxodHRwczov L2h1Yi5kb2NrZXIuY29tL3Ivb2NhbWwvb3BhbTI+DQoNCltvbiB0aGUgT0NhbWwgaW5mcmFzdHJ1 Y3R1cmUgd2lraV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvaW5mcmFzdHJ1Y3R1cmUvd2lr aS9Db250YWluZXJzPg0KDQpbb2NhbWwtZG9ja2VyZmlsZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9h dnNtL29jYW1sLWRvY2tlcmZpbGU+DQoNCltvY3VycmVudF0gPGh0dHBzOi8vb2N1cnJlbnQub3Jn Pg0KDQoNCk9DYW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMjQ+DQoNCg0KSnVsZXMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBBcyBFdGllbm5lIG1lbnRpb25lZCwgd2UgaGF2ZSByZWxlYXNlZCBPQ2FtbGZvcm1hdCAwLjE0 LjEsIHJldmVydGluZw0KICB0aGUgY2hhbmdlIHRvIHRoZSBkZWZhdWx0cyBhbmQgb3VyIHBsYW5z IHRvIGRlcHJlY2F0ZSB0aGUNCiAgYGRvYy1jb21tZW50cycgb3B0aW9uLg0KDQogIEZvciBwcm9q ZWN0cyB0aGF0IGFscmVhZHkgdXBncmFkZWQgdG8gMC4xNC4wIChlZy4gQ29xKSwgdGhlDQogIGBk b2MtY29tbWVudHMnIG9wdGlvbiB3aWxsIGNoYW5nZSBpdHMgbWVhbmluZyBhZ2Fpbi4gSXQgaXMg bmVjZXNzYXJ5DQogIHRvIGFkZCBgZG9jLWNvbW1lbnRzPWJlZm9yZScgdG8gaGF2ZSB0aGUgZG9j dW1lbnRhdGlvbiBjb21tZW50cyBwbGFjZWQNCiAgYmVmb3JlLiAgTW9yZW92ZXIsIHRoZSBuZXcg b3B0aW9uIGBkb2MtY29tbWVudHMtdmFsJyBhZGRlZCBpbiAwLjE0LjANCiAgaGFzIGEgaGlnaGVy IHByZWNlZGVuY2UgdGhhbiBgZG9jLWNvbW1lbnRzJywgZXZlbiB3aGVuIGl0J3Mgbm90DQogIHNl dC4gSXQgaXMgdGh1cyBuZWNlc3NhcnkgdG8gc2V0IHRoZW0gYm90aCB0byBgYmVmb3JlJyB0byBo YXZlIHRoZSBvbGQNCiAgImJlZm9yZSIgYmVoYXZpb3IuICBUaGlzIHdpbGwgYmUgaW1wcm92ZWQg aW4gdGhlIG5leHQgcmVsZWFzZSAoc2VlDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4 L29jYW1sZm9ybWF0L3B1bGwvMTM0MD4pLg0KDQogIFRoYW5rIHlvdSB0byBvdXIgZWFybHkgYWRv cHRlcnMgdG8gYmVhciB1cy4gV2UgYXJlIGltcHJvdmluZyBvdXINCiAgcmVsZWFzZSBwcm9jZXNz IHRvIHJlZHVjZSBjb25mdXNpb24gZm9yIHRoZSBuZXh0IHVwZGF0ZXMuIEFzIHVzdWFsLCBpZg0K ICB5b3UgaGF2ZSBhbnkgZmVlZGJhY2ssIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG9uDQogIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0PiB0byBkaXNjdXNzIGl0IHdpdGgg dXMuDQoNCg0KSGFzaGNvbnNpbmcgYW4gQVNUIHZpYSBQUFgNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaGFzaGNvbnNp bmctYW4tYXN0LXZpYS1wcHgvNTU1OC8xPg0KDQoNCkNoZXQgTXVydGh5IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgW3VwLWZyb250IChzbyBub2JvZHkgZ2V0cyB0aGUgd3JvbmcgaWRlYSk6IEknbSBu b3QgcHVzaGluZyBDYW1scDUuDQogIFJhdGhlciwgSSdtIGp1c3Qgbm90aW5nIHRoYXQgdGhpcyBz b3J0IG9mIHRoaW5nIGlzIHJlYWxseSBlYXN5IHRvIGRvLA0KICBhbmQgSSBlbmNvdXJhZ2Ugc29t ZW9uZSB0byBkbyBzb21ldGhpbmcgc2ltaWxhciB1c2luZyB0aGUgUFBYDQogIGluZnJhc3RydWN0 dXJlLl0NCg0KICBJIGRpZG4ndCB3YW50IHRvIGRlcmFpbCB0aGUgIkZ1dHVyZSBvZiBQUFgiIHRo cmVhZCwgc28gSSB0aG91Z2h0IEknZA0KICBwb3N0IHNlcGFyYXRlbHkgdG8gYW5zd2VyIGl2Z0Ag J3MgaXNzdWUgYWJvdXQgaGFzaGNvbnNpbmcgb2YgQVNUcw0KICB1c2luZyBQUFguICBJdCdzIGFj dHVhbGx5IFt1aCwgSSB0aGlua10gcmVhbGx5LCByZWFsbHkgZWFzeSB0bw0KICBpbXBsZW1lbnQg aGFzaGNvbnNpbmcgb2YgQURUcywgdXNpbmcgYSBQUFggZXh0ZW5zaW9uLiAgT24gYSBsYXJrLCBJ DQogIGRlY2lkZWQgdG8gZG8gaXQgKnRvZGF5KiwgYW5kIHdoaWxlIHRoZSBjb2RlIEkndmUgZ290 IGlzbid0IHN1ZmZpY2llbnQNCiAgdG8gdXNlLCBJIHRoaW5rIGl0J3Mgbm90IHZlcnkgZmFyIGF3 YXksIGFuZCBJIGhhdmUgdGhlIHBlcmZlY3QNCiAgdXNlLWNhc2UgYWxyZWFkeSBpbi1taW5kLiAg SXQgdG9vayBtZSB0d28gaG91cnMgdG8gaW1wbGVtZW50IHRoZQ0KICByZXdyaXRlciBhbmQgdGhl IHRlc3RjYXNlLCBvbiB0b3Agb2YgdGhlIG90aGVyIGluZnJhc3RydWN0dXJlLCB3aGljaA0KICBo YXMgbm8gc3VwcG9ydCBmb3IgaGFzaGNvbnNpbmcgb2YgYW55IHNvcnQuDQoNCiAgSGVyZSBhcmUg c29tZSBleGFtcGxlcyBvZiBkYXRhLXR5cGVzIGFuZCBmdW5jdGlvbnMgdGhhdCBhcmUNCiAgYXV0 b21hdGljYWx5IGhhc2gtY29uc2VkLiAgVGhlIGlkZWEgaXMgdGhhdCBpbiB0aGUgcGF0dGVybi1t YXRjaCB0aGUNCiAgcGF0dGVybiBpcyBhbm5vdGF0ZWQgd2l0aCBhIHZhcmlhYmxlIChpbiB0aGlz IGV4YW1wbGUsICJ6Iik7IHRoZQ0KICBleHByZXNzaW9uIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUg aGFzaC1jb25zZWQgYWdhaW5zdCB0aGF0IHBhdHRlcm4gaXMNCiAgYW5ub3RhdGVkIHdpdGggdGhh dCBzYW1lIHZhcmlhYmxlLiAgW1RoZSBjb2RlIHRoYXQgZGVzY2VuZHMgdG8gdGhlDQogIGV4cHJl c3Npb24gaXMgYSBsaXR0bGUgd2VhayByaWdodCBub3csIGJ1dCBJIHRoaW5rIHRoYXQncyBlYXNp bHkNCiAgZml4YWJsZS5dICBUaGUgYWxnb3JpdGhtIGdvZXMgYXMgZm9sbG93czoNCg0KICAoMSkg ImRlY29yYXRlIiB0aGUgcGF0dGVybiB3aXRoICJhcyB6XzxpbnRlZ2VyPiIgdmFyaWFibGVzIGV2 ZXJ5d2hlcmUNCiAgaW4gY29uc3RydWN0b3JzLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVmZXIgdG8g cGFydHMgb2YgdGhlIG9yaWdpbmFsDQogIHZhbHVlLg0KDQogICgyKSB0aGVuIGZpbmQgZWFjaCBl eHByZXNzaW9uIHRoYXQgaXMgbWFya2VkIHdpdGggdGhhdCBzYW1lIHZhcmFibGUuDQogIFN0cnVj dHVyYWxseSBkZXNjZW5kIHRoZSBwYXR0ZXJuIGFuZCB0aGUgZXhwcmVzc2lvbiBpbiBwYXJhbGxl bCBhbmQNCiAgZ2VuZXJhdGUgY29kZSB0byBjb21wYXJlIHN1Yi1zdHJ1Y3R1cmUgYW5kIGhhc2hj b25zIHdoZXJlIGFwcHJvcHJpYXRlLg0KDQogIEFuZCB0aGF0J3MgcmVhbGx5IGl0LiAgSSdtIHN1 cmUgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFBQWA0KICB0b29scy4NCg0KICBT b21lIGNvbW1lbnRzOiAoMSkgd2hhdCdzIG5pY2UsIGlzIHRoYXQgd2UgY2FuIGp1c3QgdGFrZQ0K ICBhbHJlYWR5LXdyaXR0ZW4gY29kZSBsaWtlIGBMaXN0Lm1hcCcgYW5kIGFubm90YXRlIGl0OyB0 aGF0IGdlbmVyYXRlcyBhDQogIGhhc2gtY29uc2VkIHZlcnNpb24uICBBbmQgc2luY2UgdGhlIGdl bmVyYXRlZCBjb2RlIG5ldmVyIHVzZXMgZGVlcA0KICBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChvbmx5 IHBvaW50ZXItZXF1YWxpdHkpIGl0IHNob3VsZCBiZSBvbmx5DQogIG1hcmdpbmFsbHkgc2xvd2Vy IHRoYW4gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uLg0KDQogICgyKSBUaGUgdmFyaWFibGUg aW4gdGhlIGFubm90YXRpb24gKCJ6IikgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3INCiAgZ2VuZXJh dGluZyBhIHdob2xlIHNsZXcgb2YgZnJlc2ggdmFyaWFibGVzLCBhbmQgSSBkb24ndCBib3RoZXIg KHlldCkNCiAgdG8gY2hlY2sgZm9yIGNsYXNoZXM7IHRoaXMgKGFnYWluKSBpcyBzdHJhaWdodGZv cndhcmQsIGJ1dCBoZXksIEkNCiAgc3RhcnRlZCB0d28gaG91cnMgYWdvLg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgdHlwZSB0ID0gTGVhZiBvZiBpbnQgfCBOb2RlIG9mIHQgKiBpbnQgKiB0 DQogIOKUgg0KICDilIIgbW9kdWxlIEhDTGlzdCA9IHN0cnVjdA0KICDilIINCiAg4pSCIGxldCBy ZWMgbWFwIGYgPSBmdW5jdGlvbg0KICDilIIgICAgIFtdW0BoYXNocmVjb25zIHpdIC0+IFtdW0Bo YXNocmVjb25zIHpdDQogIOKUgiAgIHwgKGE6OmwpW0BoYXNocmVjb25zIHpdIC0+IGxldCByID0g ZiBhIGluICgociA6OiBtYXAgZiBsKVtAaGFzaHJlY29ucyB6XSkNCiAg4pSCDQogIOKUgiBlbmQN CiAg4pSCDQogIOKUgiBsZXQgZGVlcCA9DQogIOKUgiBsZXQgcmVjIGRlZXAgPSAoZnVuY3Rpb24N CiAg4pSCICAgTGVhZiBuW0BoYXNocmVjb25zIHpdIC0+IExlYWYgbltAaGFzaHJlY29ucyB6XQ0K ICDilIIgfCBOb2RlIChsLCBuLCByKSBbQGhhc2hyZWNvbnMgel0gLT4NCiAg4pSCICAgTm9kZSAo ZGVlcCBsLCBuLCBkZWVwIHIpIFtAaGFzaHJlY29ucyB6XQ0KICDilIIgICApDQogIOKUgiBbQEBv Y2FtbC53YXJuaW5nICItMjYiXQ0KICDilIIgaW4gZGVlcA0KICDilIINCiAg4pSCIHR5cGUgc2V4 cCA9DQogIOKUgiAgIHwgQXRvbSBvZiBzdHJpbmcNCiAg4pSCICAgfCBMaXN0IG9mIHNleHAgbGlz dA0KICDilIINCiAg4pSCIGxldCBzZXhwX2RlZXAgPQ0KICDilIIgICBsZXQgcmVjIGRlZXAgPSBm dW5jdGlvbg0KICDilIIgICAgICAgQXRvbSBzW0BoYXNocmVjb25zIHpdIC0+IEF0b20gc1tAaGFz aHJlY29ucyB6XQ0KICDilIIgICAgIHwgTGlzdCBsW0BoYXNocmVjb25zIHpdIC0+IExpc3QgKEhD TGlzdC5tYXAgZGVlcCBsKVtAaGFzaHJlY29ucyB6XQ0KICDilIIgICBpbiBkZWVwDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIExpbmtzOiBGaXJzdCwgYXQgdGhlIGNvbW1pdCwgc28gdGhleSB3b24n dCBjaGFuZ2UNCg0KICB0aGUgdGVzdGNhc2UgZmlsZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9j aGV0bXVydGh5L3BhX3BweC9jb21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBhZDY5NjA3NDIwMDEw MWJkNjYxZiNkaWZmLWU2ZGZmZTc4ZmM2YzI3YmRmZmE0MTk3MGM0YTdmMWNhPg0KDQogIHRoZSAi cHB4IHJld3JpdGVyIjoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9jaGV0bXVydGh5L3BhX3BweC9j b21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBhZDY5NjA3NDIwMDEwMWJkNjYxZiNkaWZmLTI0YWVh ZjUxMzY2MDE3OTQ4ZjU3MzU3MjdmMDAxYzg1Pg0KDQogIFNlY29uZCwgdGhlIGZpbGVzIHdpdGgg aHVtYW4tcmVhZGFibGUgbmFtZXMsIGV0Yy46DQoNCiAgdGhlIHRlc3RjYXNlOg0KICA8aHR0cHM6 Ly9naXRodWIuY29tL2NoZXRtdXJ0aHkvcGFfcHB4L2Jsb2IvbWFzdGVyL3Rlc3RzL3Rlc3RfaGFz aHJlY29ucy5tbD4NCg0KICB0aGUgInBweCByZXdyaXRlciI6DQogIDxodHRwczovL2dpdGh1Yi5j b20vY2hldG11cnRoeS9wYV9wcHgvYmxvYi9tYXN0ZXIvcGFfaGFzaHJlY29ucy9wYV9oYXNocmVj b25zLm1sPg0KDQogIFRoZSBwcm9qZWN0czoNCg0KICBjaGV0bXVydGh5L3BhX3BweDogQSByZWlt cGxlbWVudGF0aW9uIG9mIHBweF9kZXJpdmluZywgYWxsIGl0cw0KICBwbHVnaW5zLCBwcHhfaW1w b3J0LCBhbmQgYSBmZXcgb3RoZXJzLg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vY2hldG11cnRo eS9wYV9wcHg+DQoNCiAgY2hldG11cnRoeS9jYW1scDU6IENhbWxwNSwgdmVyc2lvbiBwcmUtOC4w MCBvbiB3aGljaCB0aGUgYWJvdmUgaXMNCiAgYmFzZWQuICBUaGlzIGlzIG9uIHRoZSBicmFuY2gg MjYuYXR0ZW1wdC1wYS1kZXJpdmluZyAuDQoNCg0KS2FrYWR1IHNhaWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZXhwZXJpbWVudGVkIHdpdGggdGhpcyBzb21lIHRp bWUgYWdvIGZvciBNTCB3b3Jrc2hvcC4gIFRoZSBpZGVhIHdhcw0KICB0byBwcm92aWRlIGZ1bmN0 aW9uOiBgdCAtPiBodGJsIC0+IGh0YmwgKiB0JyB3aGljaCByZXdyaXRlcyB2YWx1ZSBvZg0KICB0 eXBlIGB0JyBieSByZW1vdmluZyBlcXVhbCBzdWJ0cmVlcy4gRXNzZW50aWFsbHkgaXQgaXMganVz dCBhIGZvbGQNCiAgb3ZlciBkYXRhIHR5cGUuDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9rYWth ZHUvR1QvYmxvYi9tYXN0ZXIvcmVncmVzc2lvbi90ZXN0ODE2aGFzaC5tbCNMNzQ+DQoNCg0KQ2hl dCBNdXJ0aHkgYXNrZWQgYW5kIEpvc2ggQmVyZGluZSByZXBsaWVkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICAgICAgICBJZiB5b3Ugd2FubmEgdXNlIGEgaGFzaHRhYmxlIChhbmQsIEkgcHJlc3VtZSwgT2Jq Lm1hZ2ljKQ0KICAgICAgICB5b3UgY2FuIHdyaXRlIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgZG9l cyB0aGUgdHJpY2sgZm9yDQogICAgICAgIGFsbCBpbW11dGFibGUgZGF0YS10eXBlcywgcmlnaHQ/ DQoNCiAgWWVzLCB3ZSBoYXZlIHNvbWUgbWFnaWMgQG1ib3Vheml6IFtjb2RlXSBpbiBJbmZlciB0 aGF0IGRvZXMgdGhpcyB0bw0KICBjcmVhdGUgYXMgbXVjaCBzaGFyaW5nIGFzIHBvc3NpYmxlIGFz IHZhbHVlcyBhcmUgTWFyc2hhbGVkIG91dC4NCg0KDQpbY29kZV0NCjxodHRwczovL2dpdGh1Yi5j b20vZmFjZWJvb2svaW5mZXIvYmxvYi9tYXN0ZXIvaW5mZXIvc3JjL2lzdGQvTWF4aW11bVNoYXJp bmcubWw+DQoNCg0KR2VucHJpbnQgdjAuNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Z2VucHJpbnQtdjAtNC81NTc1LzE+DQoNCg0KcHJvZ21hbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgcmUtYW5ub3Vu Y2VtZW50IG9mIEdlbnByaW50LCBhIGdlbmVyYWwgdmFsdWUgcHJpbnRpbmcgbGlicmFyeSwgdGhh dA0KICBhZGRyZXNzZXMgcHJpb3IgbGltaXRhdGlvbnMgdGhhdCBtYWRlIGl0IG5vbmUgdG9vIHVz ZWZ1bCENCg0KICAxLiBJdCBkaWRuJ3Qgd29yayBjb3JyZWN0bHkgZm9yIDQuMDguMCwgdGhlIGxh dGVzdCBjb21waWxlciByZWxlYXNlIGFzDQogICAgIG9mIGZpcnN0IGFubm91bmNlbWVudCAodGhv dWdoIGZpbmUgZm9yIDQuMDIgLi4gNC4wNy4xKQ0KICAyLiBUaGVyZSB3YXMgYW4gYXdrd2FyZCBu ZWVkIHRvIHNwZWNpZnkgYSBzZWFyY2ggcGF0aCBmb3IgLmNtdCBmaWxlcw0KICAgICB3aGVuIHdv cmtpbmcgd2l0aCB0aGUgbGlrZXMgb2YgRHVuZSAod2hpY2ggdXNlcyBzZXBhcmF0ZQ0KICAgICBk aXJlY3RvcmllcyBmb3Igc291cmNlLCAuY21pIGFuZCAoZm9yIG9wdCkgLmNtdCBmaWxlcykNCiAg My4gTW9yZSBvZnRlbiB0aGFuIG5vdCB2YWx1ZXMgb2YgaW50ZXJlc3Qgd291bGQgZGlzcGxheSBz aW1wbHkgYXMNCiAgICAgYDxhYnN0cj4nIG93aW5nIHRvIHRoZSBwcmVzZW5jZSBvZiBzaWduYXR1 cmUgYWJzdHJhY3Rpb24gb2YgdGhlDQogICAgIG1vZHVsZSdzIHR5cGUgb2YgaW50ZXJlc3QuDQoN CiAgVGhlc2UgaXNzdWVzIGhhdmUgYmVlbiBhZGRyZXNzZWQ6DQogIDEuIFdvcmtzIHdpdGggdmVy c2lvbnMgNC4wNCAuLiA0LjEwLjAgKGVhcmxpZXIgdmVyc2lvbnMgYmVjYW1lIGludmFsaWQNCiAg ICAgYWZ0ZXIgYSBkZXBlbmRlbmN5IGNoYW5nZSB0byBwcHhsaWIpDQogIDIuIFRoZSBsb2NhdGlv biBvZiAuY210IGZpbGVzIGlzIGNhcHR1cmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFBQWA0KICAg ICBwcmVwcm9jZXNzb3IuDQogIDMuIFNpZ25hdHVyZXMgYXQgdGhlIGltcGxlbWVudGF0aW9uIGxl dmVsICgubWxpIGZpbGVzKSBhbmQgaW50ZXJuYWxseQ0KICAgICAoZnVuY3RvciBhcHBsaWNhdGlv biBjb25zdHJhaW50cykgYXJlIHJlbW92ZWQgdG8gcmV2ZWFsIHRoZSBpbm5lcg0KICAgICBzdHJ1 Y3R1cmUgb2Ygb3RoZXJ3aXNlIGFic3RyYWN0IHZhbHVlcy4gIEZvciBpbnN0YW5jZSwgdGhlDQog ICAgIEVwaGVtZXJvbiBtb2R1bGU6DQogICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgICDilIIgbW9k dWxlIEVNPUVwaGVtZXJvbi5LMS5NYWtlKHN0cnVjdCB0eXBlIHQ9aW50IGxldCBlcXVhbD0oPSkg bGV0IGhhc2g9SGFzaHRibC5oYXNoIGVuZCkNCiAgICAg4pSCIG9wZW4gRU0NCiAgICAg4pSCIGxl dCBfPQ0KICAgICDilIIgICBsZXQgdj1FTS5jcmVhdGUgMCBpbg0KICAgICDilIIgICBFTS5hZGQg diAxMjM0NTY3OCAnWCc7DQogICAgIOKUgiAgIGxldCBlbXByaW50IHBwZiAodjogT2JqLkVwaGVt ZXJvbi50KSA9DQogICAgIOKUgiAgICAgRm9ybWF0LmZwcmludGYgcHBmICI8QyB3cmFwcGVyIG9m IGtleS9kYXRhPiIgaW4NCiAgICAg4pSCICAgWyVpbnN0YWxsX3ByaW50ZXIgZW1wcmludF07DQog ICAgIOKUgiAgIFslcHIgZXBoZW0gdl07DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgIFdo aWNoIHByaW50czoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAgIOKUgiBlcGhlbSA9PiB7c2l6 ZSA9IDE7DQogICAgIOKUgiAgICAgICAgICAgZGF0YSA9DQogICAgIOKUgiAgICAgICAgICAgIFt8 RW1wdHk7IEVtcHR5OyBFbXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0eTsgRW1wdHk7IEVtcHR5OyBF bXB0eTsNCiAgICAg4pSCICAgICAgICAgICAgICBFbXB0eTsgRW1wdHk7IENvbnMgKDkyMjM4MTkx NSwgPEMgd3JhcHBlciBvZiBrZXkvZGF0YT4sIEVtcHR5KTsNCiAgICAg4pSCICAgICAgICAgICAg ICBFbXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0eXxdOw0KICAgICDilIIgICAgICAgICAgIHNlZWQg PSAwOyBpbml0aWFsX3NpemUgPSAxNn0NCiAgICAg4pSU4pSA4pSA4pSA4pSADQogICAgIFRoaXMg YWxzbyBkZW1vcyB0aGUgWyVpbnN0YWxsX3ByaW50ZXJdIGZhY2lsaXR5IHdoaWNoIG1pcnJvcnMg dGhlDQogICAgIFJFUEwncy4NCg0KICBJbnN0YWxsYXRpb24gaXMgdmlhIHRoZSBPcGFtIG1haW4g cmVwb3NpdG9yeS4NCg0KICBBZGRpdGlvbmFsbHksIHRoZSBwcm9qZWN0IHJlcG9zaXRvcnkgW2Nv bnRhaW5zXSB0d28gY29tcGlsZXIgdmVyc2lvbnMNCiAgb2YgX29jYW1sZGVidWdfIGludGVncmF0 ZWQgd2l0aCB0aGUgR2VucHJpbnQgbGlicmFyeSB3aGljaCB0aGVyZWJ5DQogIGJlY29tZXMgaXRz IGRlZmF1bHQgcHJpbnRlci4NCg0KICBBbGwgb2Ygd2hpY2ggbWFrZXMgdGhpcyBsaWJyYXJ5IG11 Y2ggbW9yZSB1c2VmdWwgdGhhbiBwcmV2aW91c2x5LiAgU2VlDQogIHRoZSBbcHJvamVjdCBwYWdl XSBmb3IgdGhlIGRldGFpbHMuDQoNCg0KW2NvbnRhaW5zXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9w cm9nbWFuMS9nZW5wcmludGxpYi90cmVlL21hc3Rlci9kZWJ1Z2dlcj4NCg0KW3Byb2plY3QgcGFn ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9nbWFuMS9nZW5wcmludGxpYj4NCg0KDQpPdGhlciBP Q2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBFZGl0b3Igbm90ZTogVGhhbmtzIHRvIFtlemN1cmxdLCBJIGNh biByZXN0b3JlIHRoaXMgc2VjdGlvbi4gSSdtDQogIHB1dHRpbmcgYWxsIHRoZSBsaW5rcyB0aGlz IHdlZWssIEkgd2lsbCBwcnVuZSB0byBvbmx5IHB1dCB0aGUgbmV3IG9uZXMNCiAgbmV4dCB3ZWVr Lg0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0 IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKAoiBbQW4gaW4tZGVwdGggTG9vayBhdCBPQ2FtbOKAmXMg bmV3IOKAnEJlc3QtZml04oCdIEdhcmJhZ2UgQ29sbGVjdG9yDQogICAgU3RyYXRlZ3ldDQogIOKA oiBbU2xpZGluZyBUaWxlIFB1enpsZSwgU2VsZi1Db250YWluZWQgT0NhbWwgV2ViYXBwXQ0KICDi gKIgW05ldyB2ZXJzaW9uIG9mIFRyeSBPQ2FtbCBpbiBiZXRhIV0NCiAg4oCiIFtGcmFtYS1DbGFu ZyAwLjAuOCBpcyBvdXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KICDigKIgW0EgcmVhc29uYWJsZSBU eVhNTCByZWxlYXNlIHwgRHJ1cCdzIHRoaW5naWVzXQ0KICDigKIgW0FsdC1FcmdvIFVzZXJz4oCZ IENsdWIgQW5udWFsIE1lZXRpbmddDQogIOKAoiBbT0NhbWwgaU9TIEFwcHMgUG9ydGVkIHRvIEJy b3dzZXJdDQogIOKAoiBbV2F0Y2ggYWxsIG9mIEphbmUgU3RyZWV0J3MgdGVjaCB0YWxrc10NCiAg 4oCiIFtNZXJjdXJpYWw6IHByZXR0eWNvbmZpZyBleHRlbnNpb25dDQogIOKAoiBbTWVyY3VyaWFs IGV4dGVuc2lvbnMgKHVwZGF0ZSldDQogIOKAoiBbMjAxOSBhdCBPQ2FtbFByb10NCiAg4oCiIFtC aXRidWNrZXQgcmVwb3NpdG9yeSBtaWdyYXRpb25dDQogIOKAoiBbVHJvdWJsZXNob290aW5nIHN5 c3RlbWQgd2l0aCBTeXN0ZW1UYXBdDQogIOKAoiBbT2NzaWdlbiBTdGFydCB1cGRhdGVkXQ0KICDi gKIgW09jc2lnZW4gU3RhcnQgdXBkYXRlZF0NCiAg4oCiIFtvcGFtIDIuMC42IHJlbGVhc2VdDQog IOKAoiBbb3BhbSAyLjAuNiByZWxlYXNlXQ0KICDigKIgW0hhY2tlcnMgYW5kIGNsaW1hdGUgYWN0 aXZpc3RzIGpvaW4gZm9yY2VzIGluIExlaXB6aWddDQogIOKAoiBbRGVwbG95aW5nIGF1dGhvcml0 YXRpdmUgT0NhbWwtRE5TIHNlcnZlcnMgYXMgTWlyYWdlT1MgdW5pa2VybmVsc10NCiAg4oCiIFtS ZXByb2R1Y2libGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCiAg4oCiIFtVc2luZyBQeXRo b24gYW5kIE9DYW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJvb2tdDQogIOKAoiBbQ29xIDgu MTErYmV0YTEgaXMgb3V0XQ0KICDigKIgW0RlZXAtTGVhcm5pbmcgdGhlIEhhcmRlc3QgR28gUHJv YmxlbSBpbiB0aGUgV29ybGRdDQogIOKAoiBbRnJhbWEtQyAyMC4wIChDYWxjaXVtKSBpcyBvdXQu IERvd25sb2FkIGl0IGhlcmUuXQ0KICDigKIgW1Rlc3RpbmcgT0NhbWwgcmVsZWFzZXMgd2l0aCBv cGFtY2hlY2tdDQogIOKAoiBbQ29xIDguMTAuMiBpcyBvdXRdDQogIOKAoiBbQW5ub3VuY2luZyBJ cm1pbiAyLjAuMF0NCiAg4oCiIFtCQVAgMi4wIGlzIHJlbGVhc2VkXQ0KICDigKIgW0NJL0NEIHBp cGVsaW5lczogTW9uYWQsIEFycm93IG9yIERhcnQ/XQ0KICDigKIgW09uIGZpeGVkLXBvaW50IHRo ZW9yZW1zIGluIHN5bnRoZXRpYyBjb21wdXRhYmlsaXR5XQ0KICDigKIgW1J1bm5lcnMgaW4gYWN0 aW9uXQ0KICDigKIgW0NvcSA4LjEwLjEgaXMgb3V0XQ0KICDigKIgW0Fubm91bmNpbmcgTWlyYWdl T1MgMy42LjBdDQogIOKAoiBbQ29tbWFzIGluIGJpZyBudW1iZXJzIGV2ZXJ5d2hlcmU6IEFuIE9w ZW5UeXBlIGFkdmVudHVyZV0NCiAg4oCiIFtDb3EgOC4xMC4wIGlzIG91dF0NCiAg4oCiIFtPQ2Ft bCBleHBlcnQgYW5kIGJlZ2lubmVyIHRyYWluaW5nIGJ5IE9DYW1sUHJvIChpbiBGcmVuY2gpOg0K ICAgIE5vdi4gNS02ICYgNy04XQ0KICDigKIgW01yLiBNSU1FIC0gUGFyc2UgYW5kIGdlbmVyYXRl IGVtYWlsc10NCiAg4oCiIFtBIGxvb2sgYmFjayBvbiBPQ2FtbCBzaW5jZSAyMDExXQ0KICDigKIg W0ZyYW1hLUMgMTkuMSAoUG90YXNzaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0aGVyZS5dDQogIOKA oiBbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0KICDigKIgW1VwZGF0ZWQgQ2hlYXQgU2hlZXRzOiBP Q2FtbCBMYW5ndWFnZSBhbmQgT0NhbWwgU3RhbmRhcmQgTGlicmFyeV0NCiAg4oCiIFtGcmFtYS1D bGFuZyAwLjAuNyBpcyBvdXQuIERvd25sb2FkIGl0aGVyZS5dDQogIOKAoiBbRGVjb21wcmVzczog RXhwZXJpZW5jZXMgd2l0aCBPQ2FtbCBvcHRpbWl6YXRpb25dDQogIOKAoiBbT24gY29tcGxldGUg b3JkZXJlZCBmaWVsZHNdDQogIOKAoiBbQW4gaW50cm9kdWN0aW9uIHRvIGZ1enppbmcgT0NhbWwg d2l0aCBBRkwsIENyb3diYXIgYW5kIEJ1bl0NCiAg4oCiIFtXaGF0IGlzIGFsZ2VicmFpYyBhYm91 dCBhbGdlYnJhaWMgZWZmZWN0cz9dDQogIOKAoiBbVGhlIGJsb2cgbW92ZWQgZnJvbSBXb3JkcHJl c3MgdG8gSmVreWxsXQ0KICDigKIgW09DYW1sUHJv4oCZcyBjb21waWxlciB0ZWFtIHdvcmsgdXBk YXRlXQ0KICDigKIgW1doYXQgdGhlIGludGVybnMgaGF2ZSB3cm91Z2h0LCAyMDE5IGVkaXRpb25d DQogIOKAoiBbRGVjb21wcmVzczogVGhlIE5ldyBEZWNvbXByZXNzIEFQSV0NCg0KDQpbZXpjdXJs XSA8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9lemN1cmw+DQoNCltPQ2FtbCBQbGFuZXRdIDxo dHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvPg0KDQpbQW4gaW4tZGVwdGggTG9vayBh dCBPQ2FtbOKAmXMgbmV3IOKAnEJlc3QtZml04oCdIEdhcmJhZ2UgQ29sbGVjdG9yIFN0cmF0ZWd5 XQ0KPGh0dHA6Ly93d3cub2NhbWxwcm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJlc3QtZml0 LWdhcmJhZ2UtY29sbGVjdG9yLz4NCg0KW1NsaWRpbmcgVGlsZSBQdXp6bGUsIFNlbGYtQ29udGFp bmVkIE9DYW1sIFdlYmFwcF0NCjxodHRwOi8vcHNlbGxvcy5jb20vMjAyMC8wMy8yMDIwLjAzLmhv dy1pLXdyb3RlLWVsYXN0aWMtbWFuLmh0bWw+DQoNCltOZXcgdmVyc2lvbiBvZiBUcnkgT0NhbWwg aW4gYmV0YSFdDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAyMC8wMy8xNi9uZXctdmVyc2lv bi1vZi10cnktb2NhbWwtaW4tYmV0YS8+DQoNCltGcmFtYS1DbGFuZyAwLjAuOCBpcyBvdXQuIERv d25sb2FkIGl0IGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1jLmNvbS9pbmRleC5odG1sPg0KDQpbQSBy ZWFzb25hYmxlIFR5WE1MIHJlbGVhc2UgfCBEcnVwJ3MgdGhpbmdpZXNdDQo8aHR0cHM6Ly9kcnVw LmdpdGh1Yi5pby8yMDIwLzAzLzA2L3R5eG1sNDQwLz4NCg0KW0FsdC1FcmdvIFVzZXJz4oCZIENs dWIgQW5udWFsIE1lZXRpbmddDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAyMC8wMy8wMy9h bHQtZXJnby11c2Vyc3MtY2x1Yi1hbm51YWwtbWVldGluZy8+DQoNCltPQ2FtbCBpT1MgQXBwcyBQ b3J0ZWQgdG8gQnJvd3Nlcl0NCjxodHRwOi8vcHNlbGxvcy5jb20vMjAyMC8wMi8yMDIwLjAyLmtp ZC1jaGFybGVtYWduZS5odG1sPg0KDQpbV2F0Y2ggYWxsIG9mIEphbmUgU3RyZWV0J3MgdGVjaCB0 YWxrc10NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vd2F0Y2gtYWxsLW9mLWphbmUtc3Ry ZWV0cy10ZWNoLXRhbGtzLz4NCg0KW01lcmN1cmlhbDogcHJldHR5Y29uZmlnIGV4dGVuc2lvbl0N CjxodHRwOi8vYmxvZy4wYnJhbmNoLmNvbS9wb3N0cy8yMDIwLTAyLTE1LXByZXR0eWNvbmZpZy1l eHRlbnNpb24uaHRtbD4NCg0KW01lcmN1cmlhbCBleHRlbnNpb25zICh1cGRhdGUpXQ0KPGh0dHA6 Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDUtaGctZXh0ZW5zaW9ucy5odG1sPg0K DQpbMjAxOSBhdCBPQ2FtbFByb10NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAyLzA0 LzIwMTktYXQtb2NhbWxwcm8vPg0KDQpbQml0YnVja2V0IHJlcG9zaXRvcnkgbWlncmF0aW9uXQ0K PGh0dHA6Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDMtYml0YnVja2V0LW1pZ3Jh dGlvbi5odG1sPg0KDQpbVHJvdWJsZXNob290aW5nIHN5c3RlbWQgd2l0aCBTeXN0ZW1UYXBdDQo8 aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3Ryb3VibGVzaG9vdGluZy1zeXN0ZW1kLXdpdGgt c3lzdGVtdGFwLz4NCg0KW09jc2lnZW4gU3RhcnQgdXBkYXRlZF0NCjxodHRwczovL29jc2lnZW4u Z2l0aHViLmlvL2Jsb2cvMjAyMC8wMS8yMC9yZWxlYXNlLz4NCg0KW29wYW0gMi4wLjYgcmVsZWFz ZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAxLzE2L29wYW0tMi0wLTYtcmVsZWFz ZS8+DQoNCltvcGFtIDIuMC42IHJlbGVhc2VdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cv b3BhbS0yLTAtNi8+DQoNCltIYWNrZXJzIGFuZCBjbGltYXRlIGFjdGl2aXN0cyBqb2luIGZvcmNl cyBpbiBMZWlwemlnXQ0KPGh0dHBzOi8vbWlyYWdlLmlvL2Jsb2cvY2NjLTIwMTktbGVpcHppZz4N Cg0KW0RlcGxveWluZyBhdXRob3JpdGF0aXZlIE9DYW1sLUROUyBzZXJ2ZXJzIGFzIE1pcmFnZU9T IHVuaWtlcm5lbHNdDQo8aHR0cHM6Ly9oYW5uZXMubnFzYi5pby9Qb3N0cy9EbnNTZXJ2ZXI+DQoN CltSZXByb2R1Y2libGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCjxodHRwczovL2hhbm5l cy5ucXNiLmlvL1Bvc3RzL1JlcHJvZHVjaWJsZU9QQU0+DQoNCltVc2luZyBQeXRob24gYW5kIE9D YW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJvb2tdDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJl ZXQuY29tL3VzaW5nLXB5dGhvbi1hbmQtb2NhbWwtaW4tdGhlLXNhbWUtanVweXRlci1ub3RlYm9v ay8+DQoNCltDb3EgOC4xMStiZXRhMSBpcyBvdXRdDQo8aHR0cHM6Ly9jb3EuaW5yaWEuZnIvbmV3 cy9jb3EtOC0xMWJldGExLWlzLW91dC5odG1sPg0KDQpbRGVlcC1MZWFybmluZyB0aGUgSGFyZGVz dCBHbyBQcm9ibGVtIGluIHRoZSBXb3JsZF0NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20v ZGVlcC1sZWFybmluZy10aGUtaGFyZGVzdC1nby1wcm9ibGVtLWluLXRoZS13b3JsZC8+DQoNCltG cmFtYS1DIDIwLjAgKENhbGNpdW0pIGlzIG91dC4gRG93bmxvYWQgaXQgaGVyZS5dDQo8aHR0cDov L2ZyYW1hLWMuY29tL2luZGV4Lmh0bWw+DQoNCltUZXN0aW5nIE9DYW1sIHJlbGVhc2VzIHdpdGgg b3BhbWNoZWNrXQ0KPGh0dHA6Ly9nYWxsaXVtLmlucmlhLmZyL2Jsb2cvYW4tb2NhbWwtcmVsZWFz ZS1zdG9yeS0xPg0KDQpbQ29xIDguMTAuMiBpcyBvdXRdIDxodHRwczovL2NvcS5pbnJpYS5mci9u ZXdzL2NvcS04LTEwLTItaXMtb3V0Lmh0bWw+DQoNCltBbm5vdW5jaW5nIElybWluIDIuMC4wXSA8 aHR0cHM6Ly9taXJhZ2UuaW8vYmxvZy9pbnRyb2R1Y2luZy1pcm1pbi12Mj4NCg0KW0JBUCAyLjAg aXMgcmVsZWFzZWRdDQo8aHR0cDovL2JpbmFyeWFuYWx5c2lzcGxhdGZvcm0uZ2l0aHViLmlvL2Jh cC0yLXJlbGVhc2U+DQoNCltDSS9DRCBwaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0P10N CjxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8xNC9jaWNkLXBpcGVsaW5l cy8+DQoNCltPbiBmaXhlZC1wb2ludCB0aGVvcmVtcyBpbiBzeW50aGV0aWMgY29tcHV0YWJpbGl0 eV0NCjxodHRwOi8vbWF0aC5hbmRyZWouY29tLzIwMTkvMTEvMDcvb24tZml4ZWQtcG9pbnQtdGhl b3JlbXMtaW4tc3ludGhldGljLWNvbXB1dGFiaWxpdHkvPg0KDQpbUnVubmVycyBpbiBhY3Rpb25d DQo8aHR0cDovL21hdGguYW5kcmVqLmNvbS8yMDE5LzEwLzI4L3J1bm5lcnMtaW4tYWN0aW9uLz4N Cg0KW0NvcSA4LjEwLjEgaXMgb3V0XSA8aHR0cHM6Ly9jb3EuaW5yaWEuZnIvbmV3cy9jb3EtOC0x MC0xLWlzLW91dC5odG1sPg0KDQpbQW5ub3VuY2luZyBNaXJhZ2VPUyAzLjYuMF0NCjxodHRwczov L21pcmFnZS5pby9ibG9nL2Fubm91bmNpbmctbWlyYWdlLTM2LXJlbGVhc2U+DQoNCltDb21tYXMg aW4gYmlnIG51bWJlcnMgZXZlcnl3aGVyZTogQW4gT3BlblR5cGUgYWR2ZW50dXJlXQ0KPGh0dHBz Oi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9jb21tYXMtaW4tYmlnLW51bWJlcnMtZXZlcnl3aGVyZS8+ DQoNCltDb3EgOC4xMC4wIGlzIG91dF0gPGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29xLTgt MTAtMC1pcy1vdXQuaHRtbD4NCg0KW09DYW1sIGV4cGVydCBhbmQgYmVnaW5uZXIgdHJhaW5pbmcg YnkgT0NhbWxQcm8gKGluIEZyZW5jaCk6IE5vdi4gNS02ICYNCjctOF0NCjxodHRwOi8vd3d3Lm9j YW1scHJvLmNvbS8yMDE5LzA5LzI1L29jYW1sLWV4cGVydC1hbmQtYmVnaW5uZXItdHJhaW5pbmct Ynktb2NhbWxwcm8taW4tZnJlbmNoLW5vdi01LTYtNy04Lz4NCg0KW01yLiBNSU1FIC0gUGFyc2Ug YW5kIGdlbmVyYXRlIGVtYWlsc10NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAxOS0wOS0y NS1tci1taW1lLXBhcnNlLWFuZC1nZW5lcmF0ZS1lbWFpbHMuaHRtbD4NCg0KW0EgbG9vayBiYWNr IG9uIE9DYW1sIHNpbmNlIDIwMTFdDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAxOS8wOS8y MC9hLWxvb2stYmFjay1vbi1vY2FtbC8+DQoNCltGcmFtYS1DIDE5LjEgKFBvdGFzc2l1bSkgaXMg b3V0LiBEb3dubG9hZCBpdGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1jLmNvbS9pbmRleC5odG1sPg0K DQpbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0KPGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29x LTgtMTBiZXRhMy1pcy1vdXQuaHRtbD4NCg0KW1VwZGF0ZWQgQ2hlYXQgU2hlZXRzOiBPQ2FtbCBM YW5ndWFnZSBhbmQgT0NhbWwgU3RhbmRhcmQgTGlicmFyeV0NCjxodHRwOi8vd3d3Lm9jYW1scHJv LmNvbS8yMDE5LzA5LzEzL3VwZGF0ZWQtY2hlYXQtc2hlZXRzLW9jYW1sLWxhbmd1YWdlLWFuZC1v Y2FtbC1zdGFuZGFyZC1saWJyYXJ5Lz4NCg0KW0ZyYW1hLUNsYW5nIDAuMC43IGlzIG91dC4gRG93 bmxvYWQgaXRoZXJlLl0NCjxodHRwOi8vZnJhbWEtYy5jb20vaW5kZXguaHRtbD4NCg0KW0RlY29t cHJlc3M6IEV4cGVyaWVuY2VzIHdpdGggT0NhbWwgb3B0aW1pemF0aW9uXQ0KPGh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDE5LTA5LTEzLWRlY29tcHJlc3MtZXhwZXJpZW5jZXMtd2l0aC1vY2Ft bC1vcHRpbWl6YXRpb24uaHRtbD4NCg0KW09uIGNvbXBsZXRlIG9yZGVyZWQgZmllbGRzXQ0KPGh0 dHA6Ly9tYXRoLmFuZHJlai5jb20vMjAxOS8wOS8wOS9vbi1jb21wbGV0ZS1vcmRlcmVkLWZpZWxk cy8+DQoNCltBbiBpbnRyb2R1Y3Rpb24gdG8gZnV6emluZyBPQ2FtbCB3aXRoIEFGTCwgQ3Jvd2Jh ciBhbmQgQnVuXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDE5LTA5LTA0LWFuLWludHJv ZHVjdGlvbi10by1mdXp6aW5nLW9jYW1sLXdpdGgtYWZsLWNyb3diYXItYW5kLWJ1bi5odG1sPg0K DQpbV2hhdCBpcyBhbGdlYnJhaWMgYWJvdXQgYWxnZWJyYWljIGVmZmVjdHM/XQ0KPGh0dHA6Ly9t YXRoLmFuZHJlai5jb20vMjAxOS8wOS8wMy93aGF0LWlzLWFsZ2VicmFpYy1hYm91dC1hbGdlYnJh aWMtZWZmZWN0cy8+DQoNCltUaGUgYmxvZyBtb3ZlZCBmcm9tIFdvcmRwcmVzcyB0byBKZWt5bGxd DQo8aHR0cDovL21hdGguYW5kcmVqLmNvbS8yMDE5LzA5LzAzL3RoZS1ibG9nLW1vdmVkLWZyb20t d29yZHByZXNzLXRvLWpla3lsbC8+DQoNCltPQ2FtbFByb+KAmXMgY29tcGlsZXIgdGVhbSB3b3Jr IHVwZGF0ZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDE5LzA4LzMwL29jYW1scHJvcy1j b21waWxlci10ZWFtLXdvcmstdXBkYXRlLz4NCg0KW1doYXQgdGhlIGludGVybnMgaGF2ZSB3cm91 Z2h0LCAyMDE5IGVkaXRpb25dDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3doYXQtdGhl LWludGVybnMtaGF2ZS13cm91Z2h0LTIwMTkvPg0KDQpbRGVjb21wcmVzczogVGhlIE5ldyBEZWNv bXByZXNzIEFQSV0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAxOS0wOC0yNi1kZWNvbXBy ZXNzLXRoZS1uZXctZGVjb21wcmVzcy1hcGkuaHRtbD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDi lZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3Nl bmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBh IGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZl c10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0K DQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4N Cg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGlu Zm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 14 to 21, 2020.

Current_incr: a small incremental library with no dependencies=

Thomas Leonard announced

The recent OCurrent 0.2 release included a little incremental library which might be interesting to some people. It is useful= for writing programs that need to keep some computation up-to-date efficiently as the inputs change.

It is similar to the existing incremental and react libraries already= in opam. Unlike incremental (which pulls in the whole of core_kernel), current_incr has no runtim= e dependencies (and build dependencies only on ocaml and dune). Unlike react, current_incr im= mediately stops computations when they are no longer needed (rather than relying on weak references and the garbage collector).

It is a fairly direct implementation of the Adaptive Functional Programming paper, and might be a good starting point for people wanting to learn about that.

You can get the library using opam:

opam install current_incr

Here's a simple example (in utop):

#require "current_incr";;

let total =3D Curre=
nt_incr.var 10
let complete =3D Cu=
rrent_incr.var 5

let status =3D
  Current_incr.of_cc begin
    Current_incr.read (Current_incr.of_var total) @@ function
    | 0 -> Current_incr.write "No jobs"
    | total ->
      Current_incr.read (Current_incr.of_var complete) @@ fun complete ->
      let frac =3D float_of_int complete /. float_of_=
int total in
      Printf.sprintf "%d/%d jobs complete (%.1f%%)"
                     complete total (100. *. frac)
      |> Current_incr.write
  end

This defines two input variables (total and complete) and a "changeable computation" (status) whose output depends on them. At the top-level, we can observe the initial state using <= code>observe:

# print_endline Current_incr.observe sta=
tus;;
5/10 jobs complete (50.0%)

Unlike a plain ref cell, a Current_incr.var keeps= track of which computations depend on it. After changing them, you must call propagate to update the results:

# Current_incr=
.change total 12;;
# Current_incr.change complete 4;;
# print_endline @@ Current_incr.observe status;;
5/10 jobs complete (50.0%)      (* Not y=
et updated *)

# Current_incr.propagate ();
# print_endline @@ Current_incr.observe status;;
4/12 jobs complete (33.3%)

Computations can have side-effects, and you can use on_release= to run some compensating action if the computation needs to be undone later. Here's a function that publishes a result, and al= so registers a compensation for it:

let publish msg =3D
  Printf.printf "PUBLISH: %s\n%!" msg;
  Current_incr.on_release @@ fun =
() ->
  Printf.printf "RETRACT: %s\n%!" msg

It can be used like this:

# let display =3D Current_incr.map publish status;;
PUBLISH: =
4/12 jobs complete (33.3%)

# Current_incr.change total 0;
# Current_incr.propagate ()
RETRACT: =
4/12 jobs complete (33.3%)
PUBLISH: =
No jobs

A major difference between this and the react library (which I've used in p= reviously in 0install's progre= ss reporting and CueKeeper) is that Current_incr does not depend on the garbage collector to decide when to stop a computation. I= n react, you'd have to be careful to make sure that display didn't get GC'd (even though you don't need = to refer to it again) because if it did then the output would stop getting updated. Also, setting total to 0 in react might cause the program to crash with a division-by-zero exception, because the frac computation will = continue running until it gets GC'd, even though it isn't needed for anything now.

Current_incr's API is pretty small. You might want to wrap it to provide extra features, e.g.

  • Use of a result type to propagate errors.
  • Integration with Lwt to allow asynchronous computations.
  • Static analysis to render your computation with graphviz.
  • Persistence of state to disk.

If you need that, consider using the main OCurrent library, which extends current_incr with these features.

Scikit-learn for OCaml

UnixJunkie announced

Ronan Lehy just hacked this:

https://github.com/lehy/o= caml-sklearn

This might interest a significant number of people out there. We are no more condemned to live in a world full of snakes that will bite us at run-time. :smiley:

Ronan Le Hy then said

So I came here to announce ocaml-sklearn as it just got published on Opam, = but I see @UnixJunkie did it for me (arigato gozai masu). Anyway:

  • this ambitions to cover the complete scikit-learn API
  • this ambition is currently not totally realized, but I wanted to releas= e something initial that one can play with
  • it's all @UnixJunkie's fault with his funny R wrappers.

So:

Anton Kochkov then added

OCaml and opam container images updated: new Fedora/Alpine/Ubu= ntu images

Anil Madhavapeddy announced

The Docker ocaml and opam = container images have been updated:

  • Alpine 3.11, Fedora 31 and Ubuntu 20.04 (beta) are now included.
  • Ubuntu 19.04 and Fedora 29 and 30 are now deprecated.
  • OCaml 4.09.1 and 4.11.0~dev have been refreshed.

You can find the full details of the container images available on the OCaml infra= structure wiki.

The containers are generated from a set of scripts using ocaml-dockerfile, = and will be migrating over the next six months to use an ocurrent-based infrastructure. Ther= e will be an announcement on this forum about any user-facing changes that involves, with plenty of time to transition your o= wn CIs over. Thanks go to @talex5 and @XVilka for contributions to this round of updates.

OCamlformat 0.14.0

Jules announced

As Etienne mentioned, we have released OCamlformat 0.14.1, reverting the ch= ange to the defaults and our plans to deprecate the doc-comments option.

For projects that already upgraded to 0.14.0 (eg. Coq), the doc-comme= nts option will change its meaning again. It is necessary to add doc-comments=3Dbefore to have the document= ation comments placed before. Moreover, the new option doc-comments-val added in 0.14.0 has = a higher precedence than doc-comments, even when it's not set. It is thus necessary to set them both to before = to have the old "before" behavior. This will be improved in the next release (see https://github.com/ocaml-ppx/ocamlformat= /pull/1340).

Thank you to our early adopters to bear us. We are improving our release pr= ocess to reduce confusion for the next updates. As usual, if you have any feedback, please open an issue on https://github.com/ocaml-ppx= /ocamlformat to discuss it with us.

Hashconsing an AST via PPX

Chet Murthy announced

[up-front (so nobody gets the wrong idea): I'm not pushing Camlp5. Rather, I'm just noting that this sort of thing is really easy to do, and I encourage someone to do something similar using the PPX infrastructure.]

I didn't want to derail the "Future of PPX" thread, so I thought I'd post separately to answer ivg@ 's issue about hashconsing of ASTs using PPX. It's actually [uh, I think] really, really easy to implement hashconsing of ADTs, using a PPX extension. On a lark, I decided to do it today, and while the code I've got isn't sufficient to use, I think it's not very far away, and I have the perfect use-case already in-mind. It took me two hours to implement the rewriter and the testcase, on top of the other infrastructure, which has no support for hashconsing of any sort.

Here are some examples of data-types and functions that are automaticaly hash-consed. The idea is that in the pattern-match the pattern is annotated with a variable (in this example, "z"); the expression that is supposed to be hash-consed against that pattern is annotated with that same variable. [The code that descends to the expression is a little weak right now, but I think that's easily fixable.] The algorithm goes as follows:

(1) "decorate" the pattern with "as z_<integer>" variables everywhere in constructors. This allows us to refer to parts of the original value.

(2) then find each expression that is marked with that same varable. Structurally descend the pattern and the expression in parallel and generate code to compare sub-structure and hashcons where appropriate.

And that's really it. I'm sure this can be implemented using the PPX tools.

Some comments: (1) what's nice, is that we can just take already-written code like List.map and annotate it; that generates a hash-cons= ed version. And since the generated code never uses deep structural equality (only pointer-equality) it should be only marginally slower than the original implementation.

(2) The variable in the annotation ("z") is used as the base for generating a whole slew of fresh variables, and I don't bother (yet) to check for clashes; this (again) is straightforward, but hey, I started two hours ago.

type t =3D Leaf of int | Node of t * =
int * t

module HCList =3D struct

let rec map f =3D function
    [][@hashrecons z] -> [][@hashrecons z]
  | (a::l=
)[@hashrecons z] -> let r =3D f a in ((r :=
: map f l)[@hashrecons z])

end

let deep =3D
let rec deep =3D (function
  Leaf n<=
span style=3D"color: #483d8b;">[@hashrecons z] -> Leaf n[@hashrecons z]
| Node (l=
, n, r) [@hashrecons z] ->
  Node (d=
eep l, n, deep r) [@hashrecons z]
  )
[@@ocaml.warning "-26"]
in deep

type sexp =3D
  | Atom =
of string
  | List =
of sexp list

let sexp_deep =3D
  let rec deep =3D function
      Atom s[@hashrecons z] -> Atom s[@hashrecons z]
    | List l[@hashrecons z] -> List (HCList.map deep l)=
[@hashrecons z]
  in deep

Links: First, at the commit, so they won't change

the testcase file: https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= e6dffe78fc6c27bdffa41970c4a7f1ca

the "ppx rewriter": https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= 24aeaf51366017948f5735727f001c85

Second, the files with human-readable names, etc.:

the testcase: https://github.com/chetmurthy/pa_ppx/blob/master/t= ests/test_hashrecons.ml

the "ppx rewriter": https://github.com/chetmurthy/pa_ppx/b= lob/master/pa_hashrecons/pa_hashrecons.ml

The projects:

chetmurthy/pa_ppx: A reimplementation of ppx_deriving, all its plugins, ppx= _import, and a few others.

https://github.com/chetmur= thy/pa_ppx

chetmurthy/camlp5: Camlp5, version pre-8.00 on which the above is based. T= his is on the branch 26.attempt-pa-deriving .

Kakadu said

I experimented with this some time ago for ML workshop. The idea was to provide function: t -> htbl -> htbl * t = which rewrites value of type t by removing equal subtrees. Essentially it is just a fold over data type.

https://github.com/kakadu/GT/blob/master/regression/test816hash.ml#= L74

Chet Murthy asked and Josh Berdine replied

If you wanna use a hashtable (and, I presume, Obj.magic) you can write a si= ngle function that does the trick for all immutable data-types, right?

Yes, we have some magic @mbouaziz code in Infer that does this to create as much sharing as possible as values are Marshaled out.

Genprint v0.4

progman announced

A re-announcement of Genprint, a general value printing library, that addre= sses prior limitations that made it none too useful!

  1. It didn't work correctly for 4.08.0, the latest compiler release as of = first announcement (though fine for 4.02 .. 4.07.1)
  2. There was an awkward need to specify a search path for .cmt files when = working with the likes of Dune (which uses separate directories for source,= .cmi and (for opt) .cmt files)
  3. More often than not values of interest would display simply as &l= t;abstr> owing to the presence of signature abstraction of the mo= dule's type of interest.

These issues have been addressed:

  1. Works with versions 4.04 .. 4.10.0 (earlier versions became invalid af= ter a dependency change to ppxlib)
  2. The location of .cmt files is captured automatically by the PPX preproc= essor.
  3. Signatures at the implementation level (.mli files) and internally (functor= application constraints) are removed to reveal the inner structure of othe= rwise abstract values. For instance, the Ephemeron module:

    module EM=3DEphemeron.K1.Make(struct type t=3Dint let equal=3D(=3D) =
    let hash=3DHashtbl.=
    hash end)
    open EM
    let _=3D
      let v=3DEM.c=
    reate 0 in
      EM.add v 12345678 'X';
      let emprint ppf (v: Obj.Ephemeron.t) =3D
        Format.fprintf ppf "<C wrapper of key/data>" in
      [%install_prin=
    ter emprint[%pr ep=
    hem v];
    

    Which prints:

    ephem =3D> {size =3D 1;
              data =3D
               [|Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty;
                 Empty; Empty; Cons (922381915, <C wrapper of key/data>, =
    Empty);
                 Empty; Empty; Empty; Empty|];
              seed =3D 0; initial_size =3D 16}
    

    This also demos the [%install_printer] facility which mirrors the REPL's.

Installation is via the Opam main repository.

Additionally, the project repository contains two compiler versions of ocamldebug integrated= with the Genprint library which thereby becomes its default printer.

All of which makes this library much more useful than previously. See the project page for the details.

Other OCaml News

From the ocamlcore planet blog

Editor note: Thanks to ezcurl<= /a>, I can restore this section. I'm putting all the links this week, I wil= l prune to only put the new ones next week.

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

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

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

--=-=-=--