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 A6AE65D5 for ; Tue, 20 Jul 2021 12:59:00 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.84,254,1620684000"; d="scan'208,217";a="520731751" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 Jul 2021 14:58:56 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 31A5FE001B; Tue, 20 Jul 2021 14:58:56 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E0A6BE0011 for ; Tue, 20 Jul 2021 14:58:51 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?A9a23=3Az0PO1xWeeEtQu07f+7pO67QoIZfV8KxyUzF92vM?= =?us-ascii?q?cY1JmTK2v8tzYMVDF4r011RmVB92dsKgP1ree8/i5HzBZsNDZ6DFKWacPfidNs?= =?us-ascii?q?d8RkQ0kDZzNImzAB9muURYHGt9fXkRu5XCxPBsdMs//Y1rPvi/6tmZKSV3wOgV?= =?us-ascii?q?vO+v6BJPZgdip2OCu4Z3TZBhDiCagbb9oIxi6sxndutMYjId8Jao8yhvEqWZMd?= =?us-ascii?q?+hK2G9kP12ekwv468uq4JJv7yFcsO89+sBdVqn3Y742RqFCAjQ8NGA16szrtR3?= =?us-ascii?q?dQgaK+3ARTGYYnAdWDgbc9B31UYv/vSX8tupmxSmVJtb2QqwuWTSj9KhkVhnlg?= =?us-ascii?q?zoaOjEj8WHXjstwjL9HoB+kuhdyzZLYbJ2TOfFjeazTYM4aRXFZXslPSyNBHo2?= =?us-ascii?q?yb4wKD+UbPOZYqZT2q18BoBa6AAWhAuPjxDxOhn/o3K06yOUhHhrC3AM+AtkPv?= =?us-ascii?q?nPUrM/oO6cJTOu5yKfFwSnGY/5QxDzz6pXHcgo5rP+MQ7x+bMTfx0ogGAzZlVi?= =?us-ascii?q?fs5DpMimP2+gRr2SW7extXv+vhW49rAFxpyCiy9soiobTgIIe103K+jl5wIYwJ?= =?us-ascii?q?N24VFJ7asOjHZRKsyGVLY12Ttk5Q250uCY6z7wGuYKnfCUR0JQnwBrfavybc4e?= =?us-ascii?q?W/h3jVOCRITZhhHJ4Zr2znRGy8VKvyuDlUMS/zVlFoDZfnNbWqnANywLc6tKBS?= =?us-ascii?q?vZl8Eqv1iuD2gPN5u1YIU05lqrVJ4Ihz7Mul5cdvlrPECDrlEjojqKbaFso9Oa?= =?us-ascii?q?o5uroZrjrpJ6ROpF0hAzgMqkgmsqyCvk2PAgJWmiU4+W81Lv78E3hXrpKkvw2k?= =?us-ascii?q?rXHv5DCIsQbo6u5DBFP3oYl9Rm/Ey+q0NMEknYdKVJFfAiLj4/zO1HBOPz4Ava?= =?us-ascii?q?/g0iskDd23P/KJLzhApLVInjMkbfhYbZ961NHxwYp0d9f4JdUBqkdIPL0X0/xs?= =?us-ascii?q?MbUDh4+MwCsxOboFM9y1oYaWW6VGKOZN7nSsVCQ6uI0JOmMeZcVtyzgK/gh+/7?= =?us-ascii?q?il2U2mUcFfaWx3JsXbmq4HvV8LEmDb3rsmM8NEWAWsQUkSezqjFmCXiRIaHapR?= =?us-ascii?q?a485zY7BJq7AofeQICinqaN0zymHp1XYmBJF0iAEXfmd4WcRvcMZzieIsh7kjw?= =?us-ascii?q?LTbShRIgh1RahtA/+1bVrNPbb+iodtZ771dh6+u3SlRU29TBuCMSdyW6NQ3lsn?= =?us-ascii?q?mMSRj822rx/rlJnyluZzah4hORUFdhN6PNPSQc1K4Xcw/Z7C9D0XA/KY9SHSE6?= =?us-ascii?q?+T9m7Hz08Ssg9z8ISb0tyAdmvgAzP0zCkDrIaj7CHGZI5/r/G03TvJ8twxGzK2?= =?us-ascii?q?LQ9g1U8X8dCN3Gqi6hi/AbJHYHJiV+Wl6OyeKQcwiHN8GCDwHKLvEBXTQJ8S73?= =?us-ascii?q?FXXcbZkrWsdT2+F/NT7+oCbQmKwtB1NCNJrFNat3zglVKXPbjONLAbGKtg2q8G?= =?us-ascii?q?AiEy7eWYIb3Z2kQ0z/RBUYYnwwJ83uLOhAyBiK7rGLfCDxuG0jvY0Tp8eRmtX2?= =?us-ascii?q?1UlI6wx2SYkBgzLq15h0aiOSbRf0Uxr8EoCAhqzF0HVahwd3ZF9qApwxgfKVFf?= =?us-ascii?q?NMy/k1L1WXDtwxyJpGvNaRiiUQYcwhtpEPhyxV3CoBBkcg2sHMn1xF9KaWF0FN?= =?us-ascii?q?HazyXw4vwNqfSKmT98xGjcanW2kvR0NqO4KcA9Ow4q0n/vAGuDkct729o09xR0?= =?us-ascii?q?3eF4pXKDRESUY7qX0Ys9xl6oqnabTMn64PV031sK6i0vSXY19InHut2giqnKp1?= =?us-ascii?q?bL6XOXFv2DMsyA9eobuonhw7tJlgPI+YYvOZgNNygX/+Hw7KweudsjTaiy2Nd7?= =?us-ascii?q?9Y5mkmF8i45Tu/Tw74ExeuZ102JTWTSllCk5+nzkIYMXjoSG2uj1WCwDYpYYOt?= =?us-ascii?q?pdoYOCHuyC9WwwsRiipXtXX9B6VPlAEkJjpz6MSGOZkDwiFUDnX8cpmaqzHTpp?= =?us-ascii?q?9Sbuzsus6yU0TeIxrjyMh0dNTwSLIGDpVL8eM6siNQLQEWjbw4ojQaoo0HgyPo?= =?us-ascii?q?CzEyaB3HURVZUciP2KWB7T6b2saCNMZcn1Q=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Aq79ODKgWLGGao6oBOWADJrtDYHBQXjQji2hC?= =?us-ascii?q?6mlwRA09TyW9rbHMoB1773/JYVMqM03I9ursBEDtex/hHP1OgLX5X43NYOCOgg?= =?us-ascii?q?LBRr2KhrGSugEIdReQysdtkZ1JN4RuCNm1J158isrx/U2ZKr8bsbu62ZHtv8+b?= =?us-ascii?q?42ZsSUVPY6FkqyhjDALzKDwSeCB2QaAQULaM5s4CnTCpfnMaY62AdwI4dtmGnf?= =?us-ascii?q?WOuIPnZVo4CwU86A+I5AnYkIISCyLouiv2SQk/povK71K19TDE2g=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AgAwA/x/ZgfSIeaIFaFoNvWUEBZFcWJ?= =?us-ascii?q?DGESIFfhyWIXIETghWFcoZVh3aEEIERA08QAQMBDSoBAwEPAQIEAQGBY4E/gTU?= =?us-ascii?q?CF4JdAh4GAQUzEwIEFQEBBQEBAQIBAwMEARMBAQ8ZCEiFaA2COAwMAwODdwEYA?= =?us-ascii?q?QgKZSMDFAEGAwIEDQEXARQKAwETARIUBoIMTIMHBQqLdZwKgTKBAYNNAQMDEA+?= =?us-ascii?q?ENIFjDQIUgReFbVNIAYJpg3gCJxCBVUSBFYIkSgdugU8BexcBAQEBAReBEQERA?= =?us-ascii?q?gEGCwkPLYJhgmQEghsTHA46BAEBWQkHEQQPAQcCCggOAQEiNg4qAQoZGQQJBAE?= =?us-ascii?q?JFRYfCwcEAi2RGxsDJYt+ijKCTpB+aiwHgyeBMAYLh1+BFYc3hQGHd4NjgUeKF?= =?us-ascii?q?4Y+iiyGMyGVZ4IchlEIgQIJBoIsiACLUQQECySEeYFIKl0wPwEdAwkHMxowQw0?= =?us-ascii?q?DglkJYA6NfYI6KlFegT6BJoEkGDkyCYVMPzIBAQEBATMCBgEKAQEDCXUBAQUTC?= =?us-ascii?q?wGIPYFqVQYBAQ?= X-IPAS-Result: =?us-ascii?q?A0AgAwA/x/ZgfSIeaIFaFoNvWUEBZFcWJDGESIFfhyWIXIE?= =?us-ascii?q?TghWFcoZVh3aEEIERA08QAQMBDSoBAwEPAQIEAQGBY4E/gTUCF4JdAh4GAQUzE?= =?us-ascii?q?wIEFQEBBQEBAQIBAwMEARMBAQ8ZCEiFaA2COAwMAwODdwEYAQgKZSMDFAEGAwI?= =?us-ascii?q?EDQEXARQKAwETARIUBoIMTIMHBQqLdZwKgTKBAYNNAQMDEA+ENIFjDQIUgReFb?= =?us-ascii?q?VNIAYJpg3gCJxCBVUSBFYIkSgdugU8BexcBAQEBAReBEQERAgEGCwkPLYJhgmQ?= =?us-ascii?q?EghsTHA46BAEBWQkHEQQPAQcCCggOAQEiNg4qAQoZGQQJBAEJFRYfCwcEAi2RG?= =?us-ascii?q?xsDJYt+ijKCTpB+aiwHgyeBMAYLh1+BFYc3hQGHd4NjgUeKF4Y+iiyGMyGVZ4I?= =?us-ascii?q?chlEIgQIJBoIsiACLUQQECySEeYFIKl0wPwEdAwkHMxowQw0DglkJYA6NfYI6K?= =?us-ascii?q?lFegT6BJoEkGDkyCYVMPzIBAQEBATMCBgEKAQEDCXUBAQUTCwGIPYFqVQYBAQ?= X-IronPort-AV: E=Sophos;i="5.84,254,1620684000"; d="scan'208,217";a="520731700" X-MGA-submission: =?us-ascii?q?MDGjLXXa3KlN9OOYXLZByVSgDyN2jN3UElJdEb?= =?us-ascii?q?FIRQXRkm6RZSKvAxrWlFHpzPGe6wgqb6Ujs7uWseFevFOHwzRQYHKU+Z?= =?us-ascii?q?vGlXNnYLDU+V7CV2AAJanYIerl4tFYxISg2tJ5NtfirhOuF4j94d/mC5?= =?us-ascii?q?hwSnWRPSY5lujiZbo/UWsoMg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jul 2021 14:58:48 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9BDC1561285; Tue, 20 Jul 2021 14:58:47 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 20 Jul 2021 14:58:28 +0200 Message-ID: <87bl6xw39n.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 20 14:58:48 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=EF172561294 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18543 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxMyB0byAyMCwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KV3JpdGluZyBh IFJFU1QgQVBJIHdpdGggRHJlYW0NCk9UT01MIDAuOS4wIOKAlCBhIGNvbXBsaWFudCBhbmQgZmxl eGlibGUgVE9NTCBwYXJzaW5nLCBtYW5pcHVsYXRpb24sIGFuZCBwcmV0dHktcHJpbnRpbmcgbGli cmFyeQ0Kc291cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwg cmV3cml0aW5nDQpPQ2FtbCA0LjEzLjAsIHNlY29uZCBhbHBoYSByZWxlYXNlDQpPQ2FtbEZvcm1h dCAwLjE5LjANCk9DYW1sIENhZsOpOiBXZWQsIEF1ZyA0IEAgN3BtIChVLlMuIENlbnRyYWwpDQpP bGQgQ1dODQoNCg0KV3JpdGluZyBhIFJFU1QgQVBJIHdpdGggRHJlYW0NCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvd3JpdGluZy1hLXJlc3QtYXBpLXdpdGgtZHJlYW0vODE1MC8xPg0KDQoNCkpvZSBUaG9t YXMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHdyaXR0ZW4gYSBzaG9ydCBbYmxvZyBwb3N0XSBh Ym91dCB0aGUgcG9zaXRpdmUgZXhwZXJpZW5jZSBJIGhhZA0KICB1c2luZyBEcmVhbSB0byBidWls ZCBhIFJFU1QgQVBJLiBUaGUgYWNjb21wYW55aW5nIHNvdXJjZSBjb2RlIGlzDQogIGF2YWlsYWJs ZSBoZXJlOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vanN0aG9tYXMvc2Vuc29ycz4NCg0KICBJ J20gaW50ZXJlc3RlZCBpbiBhZGRpbmcgbW9yZSBleGFtcGxlcyBhbmQgdHV0b3JpYWxzIHRvIHRo ZSBPQ2FtbA0KICBlY29zeXN0ZW0gYW5kIHdvdWxkIGJlIGhhcHB5IHRvIGdldCB5b3VyIGZlZWRi YWNrIG9uIHRoaXMgd3JpdGV1cA0KICAoaGVyZSBvciB2aWEgZW1haWwvZ2l0aHViKS4NCg0KDQpb YmxvZyBwb3N0XSA8aHR0cHM6Ly9qc3Rob21hcy5naXRodWIuaW8vb2NhbWwtZHJlYW0tYXBpLmh0 bWw+DQoNCg0KT1RPTUwgMC45LjAg4oCUIGEgY29tcGxpYW50IGFuZCBmbGV4aWJsZSBUT01MIHBh cnNpbmcsIG1hbmlwdWxhdGlvbiwgYW5kIHByZXR0eS1wcmludGluZyBsaWJyYXJ5DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vdG9tbC0wLTktMC1hLWNv bXBsaWFudC1hbmQtZmxleGlibGUtdG9tbC1wYXJzaW5nLW1hbmlwdWxhdGlvbi1hbmQtcHJldHR5 LXByaW50aW5nLWxpYnJhcnkvODE1Mi8xPg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBkb24ndCByZWFsbHkgbGlrZSB0byBiYXNlIGEgcmVsZWFz ZSBhbm5vdW5jZW1lbnQgb24gYmFzaGluZyBhbm90aGVyDQogIHByb2plY3QsIGJ1dCB0aGlzIHdo b2xlIHByb2plY3QgaXMgbW90aXZhdGVkIGJ5IG15IGRpc3NhdGlzZmFjdGlvbg0KICB3aXRoIFtU by5tbF3igJR0aGUgb25seSBUT01MIGxpYnJhcnkgZm9yIE9DYW1sLCBzbyBoZXJlIHdlIGdvLiBP VE9NTCBpcw0KICBhIFRPTUwgbGlicmFyeSB0aGF0IHlvdSAoaG9wZWZ1bGx5KSBjYW4gdXNlIHdp dGhvdXQgd3JpdGluZyBsb25nIHJhbnRzDQogIGFmdGVyd2FyZHMuIDspDQoNCiAgSW4gc2hvcnQ6 DQoNCiAg4oCiIFtUT01MIDEuMC1jb21wbGlhbnRdIChUby5tbCBpcyBub3QpLg0KICDigKIgR29v ZCBlcnJvciByZXBvcnRpbmcuDQogIOKAoiBNYWtlcyBpdCBlYXN5IHRvIGxvb2sgdXAgbmVzdGVk IHZhbHVlcy4NCiAg4oCiIEJpZ251bSBhbmQgY2FsZW5kYXIgbGlicmFyaWVzIGFyZSBwbHVnZ2Fi bGUgdmlhIGZ1bmN0b3JzLg0KICDigKIgRmxleGlibGUgcHJldHR5LXByaW50ZXIgd2l0aCBpbmRl bnRhdGlvbi4NCg0KICBPUEFNOiA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9vdG9t bC8+IEdpdEh1YjoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vb3RvbWw+DQoNCiAg Tm93IGxldCdzIGdldCB0byBkZXRhaWxzLg0KDQogIFRPTUwgaXMgc3VwcG9zZWQgdG8gYmUgaHVt YW4tZnJpZW5kbHkgc28gdGhhdCBwZW9wbGUgY2FuIHVzZSBpdCBhcyBhDQogIGNvbmZpZ3VyYXRp b24gZmlsZSBmb3JtYXQuIEZvciB0aGF0LCBib3RoIGRldmVsb3BlciBhbmQgZW5kLXVzZXINCiAg ZXhwZXJpZW5jZSBtdXN0IGJlIGdyZWF0LiBUby5tbCBwcm92aWRlcyBuZWl0aGVyLiBJJ3ZlIGJl ZW4gdXNpbmcNCiAgVG8ubWwgaW4gbXkgcHJvamVjdHMgZm9yIGEgbG9uZyB0aW1lLCBhbmQNCg0K DQpbVG8ubWxdIDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL3RvbWwvPg0KDQpbVE9N TCAxLjAtY29tcGxpYW50XSA8aHR0cHM6Ly90b21sLmlvL2VuL3YxLjAuMD4NCg0KU3RhbmRhcmQg Y29tcGxpYW5jZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVE9NTCBpcyBuZWl0aGVyIG1pbmltYWwgbm9yIG9idmlvdXMgcmVh bGx5LCBpdCdzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlDQogIGNvbW1vbmx5IHVzZWQgc3Vic2V0IGFu ZCB0aGUgc3BlYyBpcyBub3QgY29uc2lzdGVudCBhbmQgbm90IGVhc3kgdG8NCiAgcmVhZCwgYnV0 IFRvLm1sIGZhaWxzIGF0IHJhdGhlciB3ZWxsLWtub3duIHRoaW5ncywgbGlrZSBkb3R0ZWQga2V5 cywNCiAgYXJyYXlzIG9mIHRhYmxlcyBhbmQgaGV0ZXJvZ2VuZW91cyBhcnJheXMuDQoNCiAgT1RP TUwgcGFzc2VzIGFsbCB0ZXN0cyBpbiB0aGUgW3Rlc3Qgc3VpdGVdLCBleGNlcHQgdGhlIHRlc3Rz IHJlbGF0ZWQNCiAgdG8gYmlnbnVtIHN1cHBvcnQuIFRob3NlIHRlc3RzIGZhaWwgYmVjYXVzZSB0 aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbg0KICBtYXBzIGludGVnZXJzIGFuZCBmbG9hdHMgdG8g dGhlIG5hdGl2ZSAzMS82My1iaXQgT0NhbWwgdHlwZXMuIE1vcmUgb24NCiAgdGhhdCBsYXRlci4N Cg0KDQpbdGVzdCBzdWl0ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9CdXJudFN1c2hpL3RvbWwtdGVz dD4NCg0KDQpFcnJvciByZXBvcnRpbmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIExldCdzIGxvb2sgYXQgZXJyb3IgcmVwb3J0aW5nLiBUby5tbCdz IHJlc3BvbnNlIHRvIGFueSBwYXJzZSBlcnJvciBpcw0KICBhIGdlbmVyaWMgZXJyb3Igd2l0aCBq dXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg dXRvcCAjIFRvbWwuUGFyc2VyLmZyb21fc3RyaW5nICJmb28gPSBbIiA7Ow0KICDilIIgLSA6IFRv bWwuUGFyc2VyLnJlc3VsdCA9DQogIOKUgiBgRXJyb3INCiAg4pSCICAgKCJFcnJvciBpbiA8c3Ry aW5nPiBhdCBsaW5lIDEgYXQgY29sdW1uIDcgKHBvc2l0aW9uIDcpIiwNCiAg4pSCICAgIHtUb21s LlBhcnNlci5zb3VyY2UgPSAiPHN0cmluZz4iOyBsaW5lID0gMTsgY29sdW1uID0gNzsgcG9zaXRp b24gPSA3fSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTWVuaGlyIG9mZmVycyBleGNlbGxlbnQg dG9vbHMgZm9yIGVycm9yIHJlcG9ydGluZywgc28gSSB0b29rIHRpbWUgdG8NCiAgbWFrZSBkZXNj cmlwdGl2ZSBtZXNzYWdlcyBmb3IgbWFueSBlcnJvciBjb25kaXRpb25zICh0aGVyZSBfYXJlXw0K ICBnZW5lcmljICJzeW50YXggZXJyb3IiIG1lc3NhZ2VzIHN0aWxsLCBidXQgdGhhdCdzIGJldHRl ciB0aGFuIG5vdGhpbmcNCiAgYXQgYWxsKS4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHV0 b3AgIyBPdG9tbC5QYXJzZXIuZnJvbV9zdHJpbmdfcmVzdWx0ICJmb28gPSBbIiA7Ow0KICDilIIg LSA6IChPdG9tbC50LCBzdHJpbmcpIHJlc3VsdCA9DQogIOKUgiBFcnJvcg0KICDilIIgICJTeW50 YXggZXJyb3Igb24gbGluZSAxLCBjaGFyYWN0ZXIgODogTWFsZm9ybWVkIGFycmF5IChtaXNzaW5n IGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQ/KVxuIg0KICDilIIgDQogIOKUgiB1dG9wICMgT3RvbWwu UGFyc2VyLmZyb21fc3RyaW5nX3Jlc3VsdCAiZm9vID0ge2JhciAiIDs7DQogIOKUgiAtIDogKE90 b21sLnQsIHN0cmluZykgcmVzdWx0ID0NCiAg4pSCIEVycm9yDQogIOKUgiAgIlN5bnRheCBlcnJv ciBvbiBsaW5lIDEsIGNoYXJhY3RlciAxMjogS2V5IGlzIGZvbGxvd2VkIGJ5IGVuZCBvZiBmaWxl IG9yIGEgbWFsZm9ybWVkIFRPTUwgY29uc3RydWN0LlxuIg0KICDilJTilIDilIDilIDilIANCg0K DQpMb29raW5nIHVwIG5lc3RlZCB2YWx1ZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE5lc3RlZCBz ZWN0aW9ucyBhcmUgY29tbW9uIGluIGNvbmZpZ3MgYW5kIHNob3VsZCBiZSBlYXN5IHRvIHdvcmsN CiAgd2l0aC4gVGhpcyBpcyBob3cgeW91IGRvIGl0IGluIE9UT01MOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwuUGFyc2VyLmZyb21fc3RyaW5nICJbdGhp cy5pcy5hLmRlZXBseS5uZXN0ZWQudGFibGVdDQogIOKUgiBhbnN3ZXI9NDIiOzsNCiAg4pSCIHZh bCB0IDogT3RvbWwudCA9DQogIOKUgiAgIE90b21sLlRvbWxUYWJsZQ0KICDilIIgICAgWygidGhp cyIsDQogIOKUgiAgICAgIE90b21sLlRvbWxUYWJsZS4uLg0KICDilIIgDQogIOKUgiB1dG9wICMg T3RvbWwuZmluZCB0IE90b21sLmdldF9pbnRlZ2VyIFsidGhpcyI7ICJpcyI7ICJhIjsgImRlZXBs eSI7ICJuZXN0ZWQiOyAidGFibGUiOyAiYW5zd2VyIl0gOzsNCiAg4pSCIC0gOiBpbnQgPSA0Mg0K ICDilJTilIDilIDilIDilIANCg0KICBGb3IgY29tcGFyaXNvbiwgdGhpcyBpcyBob3cgaXQgd2Fz IGRvbmUgaW4gVG8ubWw6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB1dG9wICMgbGV0IHRv bWxfZGF0YSA9IFRvbWwuUGFyc2VyLihmcm9tX3N0cmluZyAiDQogIOKUgiBbdGhpcy5pcy5hLmRl ZXBseS5uZXN0ZWQudGFibGVdDQogIOKUgiBhbnN3ZXI9NDIiIHw+IHVuc2FmZSk7Ow0KICDilIIg dmFsIHRvbWxfZGF0YSA6IFR5cGVzLnRhYmxlID0gPGFic3RyPg0KICDilIIgDQogIOKUgiB1dG9w ICMgVG9tbC5MZW5zZXMuKGdldCB0b21sX2RhdGEgKA0KICDilIIgICBrZXkgInRoaXMiIHwtLSB0 YWJsZQ0KICDilIIgICB8LS0ga2V5ICJpcyIgfC0tIHRhYmxlDQogIOKUgiAgIHwtLSBrZXkgImEi IHwtLSB0YWJsZQ0KICDilIIgICB8LS0ga2V5ICJkZWVwbHkiIHwtLSB0YWJsZQ0KICDilIIgICB8 LS0ga2V5ICJuZXN0ZWQiIHwtLSB0YWJsZQ0KICDilIIgICB8LS0ga2V5ICJ0YWJsZSIgfC0tIHRh YmxlDQogIOKUgiAgIHwtLSBrZXkgImFuc3dlciJ8LS0gaW50ICkpOzsNCiAg4pSCIC0gOiBpbnQg b3B0aW9uID0gU29tZSA0Mg0KICDilJTilIDilIDilIDilIANCg0KDQpFeHRyYSBkZXBlbmRlbmNp ZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoZSBUT01MIHNwZWMgaW5jbHVkZXMgZmlyc3QtY2xhc3MgUkZDMzMzOSBkYXRlcywg Zm9yIGJldHRlciBvcg0KICB3b3JzZS4gVGhlIGlyb255IGlzIHRoYXQgbW9zdCB1c2VzIG9mIFRP TUwgKGFuZCwgaW5kZWVkLCBtb3N0DQogIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIHdvcmxk KSBkb24ndCBuZWVkIHRoYXQsIHNvIGl0J3MgYXJndWFibHkgYQ0KICBmZWF0dXJlIGJsb2F04oCU YnV0IGlmIHdlIHNldCBvdXQgdG8gc3VwcG9ydCBUT01MIGFzIGl0J3MgZGVmaW5lZCwgdGhhdA0K ICBxdWVzdGlvbiBpcyBhY2FkZW1pYy4NCg0KICBUaGUgcHJhY3RpY2FsIGltcGxpY2F0aW9uIGlz IHRoYXQgaWYgdGhlIHN0YW5kYXJkIGxpYnJhcnkgb2YgYQ0KICBsYW5ndWFnZSBkb2Vzbid0IGlu Y2x1ZGUgYSBkYXRldGltZSB0eXBlLCBhIFRPTUwgbGlicmFyeSBoYXMgdG8gZGVjaWRlDQogIGhv dyB0byByZXByZXNlbnQgdGhvc2UgdmFsdWVzLiBUby5tbCBtYWtlcyBJU084NjAxIGEgaGFyZCBk ZXBlbmRlbmN5LA0KICBzbyBpZiB5b3UgZG9uJ3QgdXNlIGRhdGVzLCB5b3UgZW5kIHVwIHdpdGgg YSB1c2VsZXNzIGRlcGVuZGVuY3kuIEFuZA0KICBpZiB5b3UgcHJlZmVyIGFub3RoZXIgbGlicmFy eSAob3IgbmVlZCBmdW5jdGlvbmFsaXR5IG5vIHByZXNlbnQgaW4NCiAgSVNPODYwMSksIHlvdSBl bmQgdXAgd2l0aCB0d28gbGlicmFyaWVzOiBvbmUgeW91IGNob3NlIHRvIHVzZSwgYW5kIG9uZQ0K ICBtb3JlIGZvcmNlZCBvbiB5b3UuDQoNCiAgU2FtZSBnb2VzIGZvciB0aGUgYXJiaXRyYXJ5IHBy ZWNpc2lvbiBhcml0aG1ldGljLiBNb3N0IGNvbmZpZ3Mgd29uJ3QNCiAgbmVlZCBpdCwgYnV0IHRo ZSBzdGFuZGFyZCBkZW1hbmRzIGl0LCBzbyBzb21ldGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4NCg0K ICBMdWNraWx5LCBpbiB0aGUgT0NhbWwgbGFuZCB3ZSBoYXZlIGZ1bmN0b3JzLCBzbyBpdCdzIGVh c3kgdG8gbWFrZSBhbGwNCiAgdGhlc2UgZGVwZW5kZW5jaWVzIHBsdWdnYWJsZS4gU28gSSBtYWRl IGl0IGEgZnVuY3RvciB0aGF0IHRha2VzIHRocmVlDQogIG1vZHVsZXMuDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBtb2R1bGUgTWFrZSAoSSA6IFRvbWxJbnRlZ2VyKSAoRiA6IFRvbWxGbG9h dCkgKEQgOiBUb21sRGF0ZSkgOg0KICDilIIgICBUb21sSW1wbGVtZW50YXRpb24gd2l0aCB0eXBl IHRvbWxfaW50ZWdlciA9IEkudCBhbmQgdHlwZSB0b21sX2Zsb2F0ID0gRi50IGFuZCB0eXBlIHRv bWxfZGF0ZSA9IEQudA0KICDilJTilIDilIDilIDilIANCg0KICBUaGlzIGlzIGhvdyB0byB1c2Ug WmFyaXRoIGZvciBiaWcgaW50ZWdlcnMgYW5kIGtlZXAgdGhlIHJlc3QNCiAgdW5jaGFuZ2VkOg0K DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogTm8gc2lnbmF0dXJlIGFzY3JpcHRpb246DQog IOKUgiAgICBgbW9kdWxlIEJpZ0ludGVnZXIgOiBPdG9tbC5CYXNlLlRvbWxJbnRlZ2VyYCB3b3Vs ZCBtYWtlIHRoZSB0eXBlIHQgYWJzdHJhY3QsDQogIOKUgiAgICB3aGljaCBpcyBpbmNvbnZlbmll bnQuDQogIOKUgiAgKikNCiAg4pSCIG1vZHVsZSBCaWdJbnRlZ2VyID0gc3RydWN0DQogIOKUgiAg IHR5cGUgdCA9IFoudA0KICDilIIgICBsZXQgb2Zfc3RyaW5nID0gWi5vZl9zdHJpbmcNCiAg4pSC ICAgbGV0IHRvX3N0cmluZyA9IFoudG9fc3RyaW5nDQogIOKUgiAgIGxldCBvZl9ib29sZWFuIGIg PSBpZiBiIHRoZW4gWi5vbmUgZWxzZSBaLnplcm8NCiAg4pSCICAgbGV0IHRvX2Jvb2xlYW4gbiA9 IChuIDw+IFouemVybykNCiAg4pSCIGVuZA0KICDilIIgDQogIOKUgiBtb2R1bGUgTXlUb21sID0g T3RvbWwuQmFzZS5NYWtlIChCaWdJbnRlZ2VyKSAoT3RvbWwuQmFzZS5PQ2FtbEZsb2F0KSAoT3Rv bWwuQmFzZS5TdHJpbmdEYXRlKQ0KICDilJTilIDilIDilIDilIANCg0KDQpQcmludGluZw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVG8ubWwncyBwcmludGVyIGNhbiBwcmludCBUT01M IGF0IHlvdSwgdGhhdCdzIGZvciBjZXJ0YWluLiBObw0KICBpbmRlbnRhdGlvbiwgbm90aGluZyB0 byBoZWxwIHlvdSBuYXZpZ2F0ZSBuZXN0ZWQgdmFsdWVzLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdXRvcCAjIGxldCB0b21sX2RhdGEgPSBUb21sLlBhcnNlci4oZnJvbV9zdHJpbmcgIltm b28uYmFyXVxuYmF6PWZhbHNlXG4gW2Zvby5xdXV4XVxuIHh5enp5ID0gWzEsMl0iIHw+IHVuc2Fm ZSkgfD4NCiAg4pSCIFRvbWwuUHJpbnRlci5zdHJpbmdfb2ZfdGFibGUgfD4gcHJpbnRfZW5kbGlu ZTs7DQogIOKUgiBbZm9vLmJhcl0NCiAg4pSCIGJheiA9IGZhbHNlDQogIOKUgiBbZm9vLnF1dXhd DQogIOKUgiB4eXp6eSA9IFsxLCAyXQ0KICDilJTilIDilIDilIDilIANCg0KICBXZSBjYW4gZG8g YmV0dGVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwu UGFyc2VyLmZyb21fc3RyaW5nICJbZm9vLmJhcl1cbmJhej1mYWxzZVxuIFtmb28ucXV1eF1cbiB4 eXp6eSA9IFsxLDJdIiB8Pg0KICDilIIgT3RvbWwuUHJpbnRlci50b19jaGFubmVsIH5pbmRlbnRf d2lkdGg6NCB+Y29sbGFwc2VfdGFibGVzOmZhbHNlIHN0ZG91dDs7DQogIOKUgiANCiAg4pSCIFtm b29dDQogIOKUgiANCiAg4pSCIFtmb28uYmFyXQ0KICDilIIgICAgIGJheiA9IGZhbHNlDQogIOKU giANCiAg4pSCIFtmb28ucXV1eF0NCiAg4pSCICAgICB4eXp6eSA9IFsxLCAyXQ0KICDilIIgdmFs IHQgOiB1bml0ID0gKCkNCiAg4pSCIA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwuUGFyc2Vy LmZyb21fc3RyaW5nICJbZm9vLmJhcl1cbmJhej1mYWxzZVxuIFtmb28ucXV1eF1cbiB4eXp6eSA9 IFsxLDJdIiB8Pg0KICDilIIgT3RvbWwuUHJpbnRlci50b19jaGFubmVsIH5pbmRlbnRfd2lkdGg6 NCB+Y29sbGFwc2VfdGFibGVzOmZhbHNlIH5pbmRlbnRfc3VidGFibGVzOnRydWUgc3Rkb3V0OzsN CiAg4pSCIA0KICDilIIgW2Zvb10NCiAg4pSCIA0KICDilIIgICAgIFtmb28uYmFyXQ0KICDilIIg CWJheiA9IGZhbHNlDQogIOKUgiANCiAg4pSCICAgICBbZm9vLnF1dXhdDQogIOKUgiAJeHl6enkg PSBbMSwgMl0NCiAg4pSCIHZhbCB0IDogdW5pdCA9ICgpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoN Ck1haW50ZW5hbmNlIHByYWN0aWNlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTGFzdCBidXQgbm90IGxlYXN0LCBn b29kIG1haW50ZW5hbmNlIHByYWN0aWNlcyBhcmUgYWxzbyBpbXBvcnRhbnQsIG5vdA0KICBqdXN0 IGdvb2QgY29kZS4gVG8ubWwgaXMgYXQgNy4wLjAgbm93LiBJdCBoYXMgYSBbQ0hBTkdFUy5tZF0g ZmlsZSwgYnV0DQogIEknbSBzdGlsbCB0byBzZWUgdGhlIG1haW50YWluZXJzIGRvY3VtZW50IHdo YXQgdGhlIGJyZWFraW5nIGNoYW5nZSBpcywNCiAgd2hvJ3MgYWZmZWN0ZWQsIGFuZCB3aGF0IHRo ZXkgc2hvdWxkIGRvIHRvIG1ha2UgdGhlaXIgY29kZSBjb21wYXRpYmxlLg0KDQogIEZvciBleGFt cGxlLCBpbiA2LjAuMCB0aGUgYnJlYWtpbmcgY2hhbmdlIHdhcyBhIHJlbmFtZSBmcm9tDQogIGBU b21sTGVuc2VzJyB0byBgVG9tbC5MZW5zZXMnLiBJbiBhbiBlYXJsaWVyIHJlbGVhc2UsIEkgcmVt ZW1iZXIgdGhlDQogIG9wcG9zaXRlIHJlbmFtZS4gR2l2ZW4gdGhlIHN0YW5kYXJkIGNvbXBhdGli aWxpdHkgcHJvYmxlbXMgZ29pbmcNCiAgdW5maXhlZCBmb3IgeWVhcnMsIHRoYXQncyBsaWtlIHJl YXJyYW5naW5nIGZ1cm5pdHVyZSB3aGVuIHRoZSByb29mIGlzDQogIGxlYWtpbmcuDQoNCiAgSSBw cm9taXNlIG5vdCB0byBkbyB0aGF0Lg0KDQoNCltDSEFOR0VTLm1kXQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC10b21sL1RvLm1sL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNCg0KQ29uY2x1 c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSBob3BlIHRoaXMgbGli cmFyeSB3aWxsIGhlbHAgbWFrZSBUT01MIGEgdmlhYmxlIGNvbmZpZ3VyYXRpb24gZmlsZQ0KICBm b3JtYXQgZm9yIE9DYW1sIHByb2dyYW1zLg0KDQogIEl0J3MganVzdCB0aGUgZmlyc3QgdmVyc2lv biBvZiBjb3Vyc2UsIHNvIHRoZXJlJ3Mgc3RpbGwgcm9vbSBmb3INCiAgaW1wcm92ZW1lbnQuIEZv ciBleGFtcGxlLCB0aGUgbGV4ZXIgaXMgZXNwZWNpYWxseSB1Z2x5OiBkdWUgdG8gVE9NTA0KICBi ZWluZyBoaWdobHkgY29udGV4dC1zZW5zaXRpdmUsIGl0IGludm9sdmVzIG1hc3NpdmUgYW1vdW50 cyBvZiBsZXhlcg0KICBoYWNrcyBmb3IgY29udGV4dCB0cmFja2luZy4gIE1heWJlIG9jYW1sbGV4 IGlzIGEgd3JvbmcgdG9vbCBmb3IgdGhlDQogIGpvYiBhYmQgaXQgc2hvdWxkIGJlIHJlcGxhY2Vk IHdpdGggc29tZXRoaW5nIGVsc2UgKHNpbmNlIEknbSB1c2luZw0KICBNZW5oaXIncyBpbmNyZW1l bnRhbCBBUEkgYW55d2F5LCBpdCdzIG5vdCB0aWVkIHRvIGFueSBsZXhlciBBUEkpLg0KDQogIFRo ZSBwcmludGVyIGlzIGFsc28gbGVzcyB0ZXN0ZWQgdGhhbiB0aGUgcGFyc2VyLCBzbyB0aGVyZSBt YXkgYmUNCiAgdW5oYW5kbGVkIGVkZ2UgY2FzZXMuIEl0IGFsc28gaGFzIHNvbWUgY29zbWV0aWMg aXNzdWVzIGxpa2UgbmV3bGluZXMNCiAgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHRhYmxlcy4N Cg0KICBBbnkgZmVlZGJhY2sgYW5kIHBhdGNoZXMgYXJlIHdlbGNvbWUhDQoNCg0Kc291cGF1bHQ6 IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwgcmV3cml0aW5nDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1z b3VwYXVsdC1hLXN0YXRpYy13ZWJzaXRlLWdlbmVyYXRvci1iYXNlZC1vbi1odG1sLXJld3JpdGlu Zy80MTI2LzE1Pg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgW3NvdXBhdWx0IDMuMC4wXSBpcyBub3cgYXZhaWxhYmxlLg0KDQogIEl0IG5vdyB1c2Vz IHRoZSBuZXcgW09UT01MXSBsaWJyYXJ5IGZvciBsb2FkaW5nIHRoZSBjb25maWdzLCB3aGljaCBo YXMNCiAgc29tZSBwb3NpdGl2ZSBzaWRlIGVmZmVjdHMsIGUuZy4ga2V5cyBpbiB0aGUgb3V0cHV0 IG9mIGBzb3VwYXVsdA0KICAtLXNob3ctZWZmZWN0aXZlLWNvbmZpZycgKHRoYXQgc2hvd3MgeW91 ciBjb25maWcgcGx1cyBkZWZhdWx0IHZhbHVlcw0KICB5b3UgZGlkbid0IHNldCBleHBsaWNpdGx5 KSBub3cgY29tZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbiB5b3VyDQogIGNvbmZpZyBmaWxlLg0K DQogIEl0IGFsc28gcHJvdmlkZXMgVE9NTCBhbmQgWUFNTCBwYXJzaW5nIGZ1bmN0aW9ucyB0byBM dWEgcGx1Z2lucyBhbmQNCiAgaGFzIGNvbG9yZWQgbG9nIGhlYWRlcnMgKGNhbiBiZSBkaXNhYmxl ZCB3aXRoIE5PX0NPTE9SIGVudmlyb25tZW50DQogIHZhcmlhYmxlcykuDQoNCg0KW3NvdXBhdWx0 IDMuMC4wXSA8aHR0cHM6Ly9zb3VwYXVsdC5hcHAvYmxvZy9zb3VwYXVsdC0zLjAuMC1yZWxlYXNl Lz4NCg0KW09UT01MXSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9vdG9tbC8+DQoN Cg0KT0NhbWwgNC4xMy4wLCBzZWNvbmQgYWxwaGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC00LTEzLTAtc2Vjb25kLWFscGhhLXJlbGVhc2UvODE2NC8x Pg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxlYXNlIG9mIE9DYW1sIDQu MTMuMCBpcyBhcHByb2FjaGluZy4gV2UgaGF2ZSByZWxlYXNlZCBhIHNlY29uZA0KICBhbHBoYSB2 ZXJzaW9uIHRvIGhlbHAgZmVsbG93IGhhY2tlcnMgam9pbiB1cyBlYXJseSBpbiBvdXIgYnVnIGh1 bnRpbmcNCiAgYW5kIG9wYW0gZWNvc3lzdGVtIGZpeGluZyBmdW4gKHNlZSBiZWxvdyBmb3IgdGhl IGluc3RhbGxhdGlvbg0KICBpbnN0cnVjdGlvbnMpLiBZb3UgY2FuIHNlZSB0aGUgcHJvZ3Jlc3Mg b24gdGhpcyBmcm9udCBhdA0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3Np dG9yeS9pc3N1ZXMvMTg3OTE+IC4NCg0KICBCZXlvbmQgdGhlIHVzdWFsIGJ1ZyBmaXhlcyAoc2Vl IHRoZSBmdWxsIGxpc3QgYmVsb3cpLCB0aGlzIHNlY29uZA0KICBhbHBoYSBpbnRlZ3JhdGVzIGEg bmV3IGZlYXR1cmUgZm9yIG5hdGl2ZSBjb2RlOiBwb2xsIHBvaW50cy4gVGhvc2UNCiAgcG9sbCBw b2ludHMgY3VycmVudGx5IGZpeGVzIHNvbWUgaXNzdWVzIHdpdGggc2lnbmFscyBpbiBub24tYWxs b2NhdGluZw0KICBsb29wcyBpbiBuYXRpdmUgY29kZS4gTW9yZSBpbXBvcnRhbnRseSwgdGhleSBh cmUgcHJlcmVxdWlzaXRlIGZvciB0aGUNCiAgbXVsdGljb3JlIHJ1bnRpbWUuDQoNCiAgQW5vdGhl ciBjaGFuZ2UgaXMgdGhlIHJlbW92YWwgb2YgdGhlIHJlbW92YWwgb2YgaW50ZXJicmFuY2gNCiAg cHJvcGFnYXRpb24gb2YgdHlwZSBpbmZvcm1hdGlvbi4gIFRoZSBmZWF0dXJlLCBhbHJlYWR5IHBv c3Rwb25lZCBmcm9tDQogIDQuMTIsIGhhcyBiZWVuIHJlbW92ZWQgdG8gZm9jdXMgZm9yIG5vdyBv biBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpbiB0aGUNCiAgYC1wcmluY2lwYWwnIG1vZGUuDQoNCiAg SWYgeW91IGZpbmQgYW55IGJ1Z3MsIHBsZWFzZSByZXBvcnQgdGhlbSBoZXJlOg0KDQogIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzPg0KDQogIFRoZSBmaXJzdCBiZXRhIHJl bGVhc2UgbWF5IGZvbGxvdyBzb29uIHNpbmNlIHRoZSBvcGFtIGVjb3N5c3RlbSBpcyBpbg0KICBx dWl0ZSBnb29kIHNoYXBlOyBhbmQgd2UgYXJlIG9uIHRyYWNrIGZvciBhIGZ1bGwgcmVsZWFzZSBp biBTZXB0ZW1iZXIuDQoNCiAgSGFwcHkgaGFja2luZywgRmxvcmlhbiBBbmdlbGV0dGkgZm9yIHRo ZSBPQ2FtbCB0ZWFtLg0KDQoNCkluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3Bh bSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjEzLjB+YWxw aGEyIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSWYg eW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5b3Ug Y2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3aXRj aF9uYW1lPiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTMuMH5hbHBoYTIrb3B0aW9ucyw8 b3B0aW9uX2xpc3Q+DQogIOKUgiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJldGE9Z2l0K2h0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQogIOKUlOKUgOKU gOKUgOKUgA0KICB3aGVyZSA8b3B0aW9uX2xpc3Q+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qg b2Ygb2NhbWwtb3B0aW9uLSoNCiAgcGFja2FnZXMuIEZvciBpbnN0YW5jZSwgZm9yIGEgZmxhbWJk YSBhbmQgbm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0Y2g6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTMuMH5hbHBoYTIrZmxhbWJkYStuZmZhDQogIOKUgiAt LXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTMuMH5hbHBoYTIrb3B0aW9ucyxvY2FtbC1vcHRp b24tZmxhbWJkYSxvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KICDilIIgLS1yZXBv c2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwt YmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgQWxsIGF2YWlsYWJsZSBv cHRpb25zIGNhbiBiZSBsaXN0ZWQgd2l0aCAib3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9uIi4NCg0K ICBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoaXMgdmVyc2lvbiwgaXQgaXMgYWR2aXNlZCB0byBpbnN0 YWxsIHRoZSBhbHBoYQ0KICBvcGFtIHJlcG9zaXRvcnkNCg0KICA8aHR0cHM6Ly9naXRodWIuY29t L2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeT4NCg0KICB3aXRoDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgb3BhbSByZXBvIGFkZCBhbHBoYSBnaXQ6Ly9naXRodWIuY29tL2tpdC10 eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIFRo aXMgYWxwaGEgcmVwb3NpdG9yeSBjb250YWlucyB2YXJpb3VzIGZpeGVzIGluIHRoZSBwcm9jZXNz IG9mIGJlaW5nDQogIHVwc3RyZWFtZWQuDQoNCiAgVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgYWxw aGEgaXMgYWxzbyBhdmFpbGFibGUgYXQgdGhlc2UgYWRkcmVzc2VzOg0KDQogIOKAoiA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNC4xMy4wLWFscGhhMi50YXIuZ3o+DQog IOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTQuMTMvb2NhbWwt NC4xMy4wfmFscGhhMi50YXIuZ3o+DQoNCg0KQ2hhbmdlcyBzaW5jZSB0aGUgZmlyc3QgYWxwaGEg cmVsZWFzZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCk5ldyBmZWF0dXJlDQrilITilITilITilITilITilITilITilITilITilITilIQN Cg0KICDigKIgWzEwMDM5XTogU2FmZXBvaW50cyBBZGQgcG9sbCBwb2ludHMgdG8gbmF0aXZlIGdl bmVyYXRlZCBjb2RlLiBUaGVzZQ0KICAgIGFyZSBlZmZlY3RpdmVseSB6ZXJvLXNpemVkIGFsbG9j YXRpb25zIGFuZCBmaXggc29tZSBzaWduYWwgYW5kDQogICAgcmVtZW1iZXJlZCBzZXQgaXNzdWVz LiBBbHNvIG11bHRpY29yZSBwcmVyZXF1aXNpdGUuICAoU2FkaXEgSmFmZmVyLA0KICAgIFN0ZXBo ZW4gRG9sYW4sIERhbWllbiBEb2xpZ2V6LCBYYXZpZXIgTGVyb3ksIEFubW9sIFNhaG9vLCBNYXJr DQogICAgU2hpbndlbGwsIHJldmlldyBieSBEYW1pZW4gRG9saWdleiwgWGF2aWVyIExlcm95LCBh bmQgTWFyayBTaGlud2VsbCkNCg0KDQpbMTAwMzldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEwMDM5Pg0KDQoNCk5ldyBidWcgZml4ZXMNCuKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbMTA0NDldOiBGaXggbWFqb3IgR0Mgd29y ayBhY2NvdW50aW5nICh0aGUgR0Mgd2FzIHJ1bm5pbmcgdG9vDQogICAgZmFzdCkuIChEYW1pZW4g RG9saWdleiwgcmVwb3J0IGJ5IFN0ZXBoZW4gRG9sYW4sIHJldmlldyBieSBOaWNvbMOhcw0KICAg IE9qZWRhIELDpHIgYW5kIFNhZGlxIEphZmZlcikNCg0KICDigKIgWzEwNDU0XTogQ2hlY2sgcm93 X21vcmUgaW4gbm9uZGVwX3R5cGVfcmVjLiAgKExlbyBXaGl0ZSwgcmV2aWV3IGJ5DQogICAgVGhv bWFzIFJlZmlzKQ0KDQogIOKAoiBbMTA0NjhdOiBDb3JyZWN0bHkgcHJldHR5IHByaW50IGxvY2Fs IHR5cGUgc3Vic3RpdHV0aW9uLCBlLmcuIHR5cGUgdA0KICAgIDo9IOKApiwgd2l0aCAtZHNvdXJj ZSAoTWF0dCBFbHNlLCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGkpDQoNCiAg4oCiIFsxMDQ2 MV0sIFsxMDQ5OF06IGBjYW1sX3NlbmQqJyBoZWxwZXIgZnVuY3Rpb25zIHRha2UgZGVyaXZlZA0K ICAgIHBvaW50ZXJzIGFzIGFyZ3VtZW50cy4gIFRob3NlIG11c3QgYmUgZGVjbGFyZWQgd2l0aCB0 eXBlIEFkZHINCiAgICBpbnN0ZWFkIG9mIFZhbC4gTW9yZW92ZXIsIHBvbGwgcG9pbnQgaW5zZXJ0 aW9uIG11c3QgYmUgZGlzYWJsZWQgZm9yDQogICAgYGNhbWxfc2VuZConLCBvdGhlcndpc2UgdGhl IGRlcml2ZWQgcG9pbnRlciBpcyBsaXZlIGFjcm9zcyBhIHBvbGwNCiAgICBwb2ludC4gKFZpbmNl bnQgTGF2aXJvbiBhbmQgWGF2aWVyIExlcm95LCByZXZpZXcgYnkgWGF2aWVyIExlcm95IGFuZA0K ICAgIFNhZGlxIEphZmZlcikNCg0KICDigKIgWzEwNDc4XTogRml4IHNlZ2ZhdWx0IHVuZGVyIFdp bmRvd3MgZHVlIHRvIGEgbWlzdGFrZW4gaW5pdGlhbGl6YXRpb24NCiAgICBvZiB0aHJlYWQgSUQg d2hlbiBhIHRocmVhZCBzdGFydHMuIChEYXZpZCBBbGxzb3BwLCBOaWNvbMOhcyBPamVkYQ0KICAg IELDpHIsIHJldmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFs5NTI1XSwgWzEwNDAyXTog b2NhbWxkb2Mgb25seSBjcmVhdGUgcGFyYWdyYXBocSBhdCB0aGUgdG9wbGV2ZWwgb2YNCiAgICBk b2N1bWVudGF0aW9uIGNvbW1lbnRzIChGbG9yaWFuIEFuZ2VsZXR0aSwgcmVwb3J0IGJ5IEhlbmRy aWsgVGV3cywNCiAgICByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KDQogIOKAoiBbMTAyMDZd OiBTcGxpdCBsYWJlbHMgYW5kIHBvbHltb3JwaGljIHZhcmlhbnRzIHR1dG9yaWFscyBTcGxpdHMg dGhlDQogICAgbGFiZWxzIGFuZCBwb2x5bW9ycGhpYyB2YXJpYW50cyB0dXRvcmlhbCBpbnRvIHR3 by4gTW92ZXMgdGhlIEdBRFRzDQogICAgdHV0b3JpYWwgZnJvbSB0aGUgTGFuZ3VhZ2UgRXh0ZW5z aW9ucyBjaGFwdGVyIHRvIHRoZSB0dXRvcmlhbHMuDQogICAgKEpvaG4gV2hpdGluZ3RvbiwgcmV2 aWV3IGJ5IEZsb3JpYW4gQW5nZWxldHRpIGFuZCBYYXZpZXIgTGVyb3kpDQoNCg0KWzEwNDQ5XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ0OT4NCg0KWzEwNDU0XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ1ND4NCg0KWzEwNDY4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ2OD4NCg0KWzEwNDYxXSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ2MT4NCg0KWzEwNDk4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ5OD4NCg0KWzEwNDc4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ3OD4NCg0KWzk1MjVdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1MjU+DQoNClsxMDQwMl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA0MDI+DQoNClsxMDIwNl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAyMDY+DQoNCg0KUmVtb3ZlZCBm ZWF0dXJlDQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0K ICDigKIgWyAqYnJlYWtpbmcgY2hhbmdlKiBdIFs5ODExXTogcmVtb3ZlIHByb3BhZ2F0aW9uIGZy b20gcHJldmlvdXMNCiAgICBicmFuY2hlcyBUeXBlIGluZm9ybWF0aW9uIGluZmVycmVkIGZyb20g cHJldmlvdXMgYnJhbmNoZXMgd2FzDQogICAgcHJvcGFnYXRlZCBpbiBub24tcHJpbmNpcGFsIG1v ZGUuIFJldmVydCB0aGlzIGZvciBiZXR0ZXINCiAgICBjb21wYXRpYmlsaXR5IHdpdGggLXByaW5j aXBhbCBtb2RlLiBGb3IgdGhlIHRpbWUgYmVpbmcsIGluZnJpbmdpbmcNCiAgICBjb2RlIHNob3Vs ZCByZXN1bHQgaW4gYSBwcmluY2lwYWxpdHkgd2FybmluZy4gKEphY3F1ZXMgR2FycmlndWUsDQog ICAgcmV2aWV3IGJ5IFRob21hcyBSZWZpcyBhbmQgR2FicmllbCBTY2hlcmVyKQ0KDQogIFRoZSB1 cC10by1kYXRlIGxpc3Qgb2YgY2hhbmdlcyBmb3IgT0NhbWwgNC4xMyBpcyBhdmFpbGFibGUgYXQN CiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iLzQuMTMvQ2hhbmdlcz4gLg0K DQoNCls5ODExXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85ODExPg0K DQoNCk9DYW1sRm9ybWF0IDAuMTkuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xOS0wLzgxNjcvMT4NCg0KDQpHdWlsbGF1bWUgUGV0 aW90IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGhhcHB5IHRv IGFubm91bmNlIHRoZSByZWxlYXNlIG9mIFtPQ2FtbEZvcm1hdCAwLjE5LjBdLg0KDQogIE9DYW1s Zm9ybWF0IGlzIGFuIGF1dG8tZm9ybWF0dGVyIGZvciBPQ2FtbCBjb2RlLCB3cml0aW5nIHRoZSBw YXJzZQ0KICB0cmVlIGFuZCBjb21tZW50cyBpbiBhIGNvbnNpc3RlbnQgc3R5bGUsIHNvIHRoYXQg eW91IGRvIG5vdCBoYXZlIHRvDQogIHdvcnJ5IGFib3V0IGZvcm1hdHRpbmcgaXQgYnkgaGFuZCwg YW5kIHRvIHNwZWVkIHVwIGNvZGUgcmV2aWV3IGJ5DQogIGZvY3VzaW5nIG9uIHRoZSBpbXBvcnRh bnQgcGFydHMuDQoNCiAgT0NhbWxGb3JtYXQgaXMgYmV0YSBzb2Z0d2FyZS4gV2UgZXhwZWN0IHRo ZSBwcm9ncmFtIHRvIGNoYW5nZQ0KICBjb25zaWRlcmFibHkgYmVmb3JlIHdlIHJlYWNoIHZlcnNp b24gMS4wLjAuIEluIHBhcnRpY3VsYXIsIHVwZ3JhZGluZw0KICB0aGUgYG9jYW1sZm9ybWF0YCBw YWNrYWdlIHdpbGwgY2F1c2UgeW91ciBwcm9ncmFtIHRvIGdldA0KICByZWZvcm1hdHRlZC4gU29t ZXRpbWVzIGl0IGlzIHJlbGF0aXZlbHkgcGFpbi1mcmVlLCBidXQgc29tZXRpbWVzIGl0DQogIHdp bGwgbWFrZSBhIGRpZmYgaW4gYWxtb3N0IGV2ZXJ5IGZpbGUuIFdlIGFyZSB3b3JraW5nIHRvd2Fy ZHMgaGF2aW5nIGENCiAgdG9vbCB0aGF0IHBsZWFzZXMgbW9zdCB1c2VjYXNlcyBpbiB0aGUgT0Nh bWwgY29tbXVuaXR5LCBwbGVhc2UgYmVhcg0KICB3aXRoIHVzIQ0KDQogIFRvIG1ha2Ugc3VyZSB5 b3VyIHByb2plY3QgdXNlcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIG9jYW1sZm9ybWF0LCBwbGVhc2UN CiAgc2V0DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2ZXJzaW9uPTAuMTkuMA0KICDilJTi lIDilIDilIDilIANCg0KICBpbiB5b3VyIGAub2NhbWxmb3JtYXQnIGZpbGUuDQoNCiAgTWFpbiBj aGFuZ2VzIGluIGBvY2FtbGZvcm1hdC4wLjE5LjAnIGFyZToNCiAg4oCiIE9DYW1sIDQuMTMgZmVh dHVyZXMgYXJlIHN1cHBvcnRlZA0KICDigKIgYHBweGxpYicgZGVwZW5kZW5jeSBoYXMgYmVlbiBk cm9wcGVkDQogIOKAoiBBIG5ldyBgbGluZS1lbmRpbmdzPXtsZixjcmxmfScgb3B0aW9uIGhhcyBi ZWVuIGFkZGVkIGZvciB3aW5kb3dzDQogICAgY29tcGF0aWJpbGl0eQ0KDQogIEhlcmUgaXMgdGhl IFtmdWxsIGxpc3Qgb2YgY2hhbmdlc10uDQoNCiAgV2UgZW5jb3VyYWdlIHlvdSB0byB0cnkgb2Nh bWxmb3JtYXQsIHRoYXQgY2FuIGJlIGluc3RhbGxlZCBmcm9tIG9wYW0NCiAgZGlyZWN0bHkgKCBg b3BhbSBpbnN0YWxsIG9jYW1sZm9ybWF0JyApLCBidXQgcGxlYXNlIHJlbWVtYmVyIHRoYXQgaXQN CiAgaXMgc3RpbGwgYmV0YSBzb2Z0d2FyZS4gV2UgaGF2ZSBhIFtGQVEgZm9yIG5ldyB1c2VycyBd IHRoYXQgc2hvdWxkDQogIGhlbHAgeW91IGRlY2lkZSBpZiBvY2FtbGZvcm1hdCBpcyB0aGUgcmln aHQgY2hvaWNlIGZvciB5b3UuDQoNCg0KW09DYW1sRm9ybWF0IDAuMTkuMF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQ+DQoNCltmdWxsIGxpc3Qgb2YgY2hhbmdlc10N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3JlbGVhc2VzL3RhZy8w LjE5LjA+DQoNCltGQVEgZm9yIG5ldyB1c2VycyBdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LXBweC9vY2FtbGZvcm1hdCNmYXEtZm9yLW5ldy11c2Vycz4NCg0KDQpOaWNvbMOhcyBPamVkYSBC w6RyIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEEg bmV3IGBsaW5lLWVuZGluZ3M9e2xmLGNybGZ9JyBvcHRpb24gaGFzIGJlZW4gYWRkZWQgZm9yDQog ICAgICAgIHdpbmRvd3MgY29tcGF0aWJpbGl0eQ0KDQogIEp1c3QgdG8gZXhwYW5kIGEgYml0IG9u IHRoaXMgZmVhdHVyZTogcHJldmlvdXNseSwgYG9jYW1sZm9ybWF0JyB3b3VsZA0KICB1c2UgdGhl IHN5c3RlbSBFT0wgY29udmVudGlvbiAoaWUgTEYgb24gVW5peC1saWtlIE9TcyBhbmQgQ1JMRiBv bg0KICBXaW5kb3dzKS4gVGhpcyBtZWFudCB0aGF0IGlmIHlvdSBhcHBsaWVkIGBvY2FtbGZvcm1h dCcgb24gc3lzdGVtcyB3aXRoDQogIGRpZmZlcmVudCBFT0wgY29udmVudGlvbnMsIHlvdSB3b3Vs ZCBnZXQgYSBkaWZmIG9uIGV2ZXJ5IGxpbmUgb24gZXZlcnkNCiAgZmlsZSBwdXJlbHkgZHVlIHRv IHRoZSBjaGFuZ2VkIG5ld2xpbmVzLiBGdXJ0aGVybW9yZSwgdGhpcyBtZWFudA0KICBgb2NhbWxm b3JtYXQnIHdhcyBoYXJkIHRvIHVzZSBpZiB5b3VyIHByb2plY3QgdXNlZCBMRiBvbiBXaW5kb3dz IChhDQogIGNvbW1vbiB1c2FnZSkuDQoNCiAgV2l0aCB0aGUgbmV3IG9wdGlvbiwgYG9jYW1sZm9y bWF0JyBlbmZvcmNlcyBhIGdpdmVuIEVPTA0KICBjb252ZW50aW9uLiBUaGUgc3lzdGVtIEVPTCBj b252ZW50aW9uIGlzIG5vIGxvbmdlciB1c2VkIGZvciBhbnkNCiAgcHVycG9zZSBhbmQgdGhlIEVP TCBjb252ZW50aW9uIHVzZWQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4NCiAgYG9jYW1sZm9ybWF0 JydzIGNvbmZpZyAoTEYgYnkgZGVmYXVsdCkuDQoNCg0KT0NhbWwgQ2Fmw6k6IFdlZCwgQXVnIDQg QCA3cG0gKFUuUy4gQ2VudHJhbCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY2FmZS13ZWQtYXVnLTQtN3BtLXUtcy1j ZW50cmFsLzgxNjkvMT4NCg0KDQpNaWNoYWVsIEJhY2FyZWxsYSBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFBsZWFzZSBqb2luIHVzIGF0IHRoZSBuZXh0IE9DYW1sIENh ZmUsIGEgZnJpZW5kbHksIGxvdyBzdGFrZXMNCiAgb3Bwb3J0dW5pdHkgdG8gYXNrIHF1ZXN0aW9u cyBhYm91dCB0aGUgT0NhbWwgbGFuZ3VhZ2UgYW5kIGVjb3N5c3RlbSwNCiAgd29yayB0aHJvdWdo IHByb2dyYW1taW5nIHByb2JsZW1zIHRoYXQgeW914oCZcmUgc3R1Y2sgb24sIGFuZCBnZXQNCiAg ZmVlZGJhY2sgb24geW91ciBjb2RlLiBFc3BlY2lhbGx5IGdlYXJlZCB0b3dhcmQgbmV3IGFuZCBp bnRlcm1lZGlhdGUNCiAgdXNlcnMsIGV4cGVyaWVuY2VkIE9DYW1sIGRldmVsb3BlcnMgd2lsbCBi ZSBhdmFpbGFibGUgdG8gYW5zd2VyIHlvdXINCiAgcXVlc3Rpb25zLiAgQnJpbmcgeW91ciBjb2Rl IGFuZCB3ZeKAmWxsIGJlIGhhcHB5IHRvIHJldmlldyBpdCwgYXNzaXN0DQogIHdpdGggZGVidWdn aW5nLCBhbmQgcHJvdmlkZSByZWNvbW1lbmRhdGlvbnMgZm9yIGltcHJvdmVtZW50Lg0KDQogIFRo aXMgbW9udGgsIE9DYW1sIENhZsOpIHdpbGwgY29uc2lzdCBvZiB0d28gcGFydHMuIEZpcnN0LCBS dWRpIEdyaW5iZXJnDQogIG9mIFtPQ2FtbCBMYWJzXSB3aWxsIHByZXNlbnQgYW4gaW5mb3JtYWwg aW50cm9kdWN0aW9uIHRvIFtEdW5lXSwgdGhlDQogIE9DYW1sIGJ1aWxkIHN5c3RlbS4gTGVhcm4g YWJvdXQgRHVuZSBmcm9tIG9uZSB0aGUgcGVvcGxlIGRldmVsb3BpbmcNCiAgaXQuIEZvbGxvd2lu ZyBSdWRp4oCZcyBwcmVzZW50YXRpb24sIHdlIHdpbGwgb3BlbiB0aGUgZGlzY3Vzc2lvbiB0byBh bGwNCiAgdGhpbmdzIE9DYW1sLXJlbGF0ZWQuDQoNCiAgRnVsbCBbWm9vbSBtZWV0aW5nIGRldGFp bHMgaGVyZV0uDQogIOKAoiBBZGQgdG8geW91ciBbR29vZ2xlIENhbGVuZGFyXQ0KICDigKIgQWRk IHRvIHlvdXIgW2lDYWxdDQoNCg0KW09DYW1sIExhYnNdIDxodHRwczovL29jYW1sbGFicy5pby8+ DQoNCltEdW5lXSA8aHR0cHM6Ly9kdW5lLmJ1aWxkLz4NCg0KW1pvb20gbWVldGluZyBkZXRhaWxz IGhlcmVdDQo8aHR0cHM6Ly9oZnB1Zy5vcmcvZXZlbnQvb2NhbWwtY2FmZS1pbnRyb2R1Y3Rpb24t dG8tZHVuZS1hbmQtb3Blbi1mb3J1bS8+DQoNCltHb29nbGUgQ2FsZW5kYXJdDQo8aHR0cHM6Ly93 d3cuZ29vZ2xlLmNvbS9jYWxlbmRhci9ldmVudD9hY3Rpb249VEVNUExBVEUmdGV4dD1PQ2FtbCtD YWYlQzMlQTklM0ErSW50cm9kdWN0aW9uK3RvK0R1bmUrYW5kK09wZW4rRm9ydW0mZGF0ZXM9MjAy MTA4MDRUMTkwMDAwLzIwMjEwODA0VDIxMDAwMCZkZXRhaWxzPU9DYW1sK0NhZiVDMyVBOStvZmZl cnMrYStmcmllbmRseSUyQytsb3crc3Rha2VzK29wcG9ydHVuaXR5K3RvK2FzaytxdWVzdGlvbnMr YWJvdXQrdGhlK09DYW1sK2xhbmd1YWdlK2FuZCtlY29zeXN0ZW0lMkMrd29yayt0aHJvdWdoK3By b2dyYW1taW5nK3Byb2JsZW1zK3RoYXQreW91JUUyJTgwJTk5cmUrc3R1Y2srb24lMkMrYW5kK2dl dCtmZWVkYmFjaytvbit5b3VyK2NvZGUuK0VzcGVjaWFsbHkrZ2VhcmVkK3Rvd2FyZCtuZXcrYW5k K2ludGVybWVkaWF0ZSt1c2VycyUyQytleHBlcmllbmNlZCtPQ2FtbCtkZXZlbG9wZXJzK3dpbGwr YmUrYXZhaWxhYmxlK3RvK2Fuc3dlcit5b3VyK3F1ZXN0aW9ucy4lQzIlQTArQnJpbmcreW91citj b2RlK2FuZCt3ZSUyNiUyMzgyMTclM0JsbCtiZStoYXBweSt0bytyZXZpZXcraXQlMkMrYXNzaXN0 K3dpdGgrZGVidWdnaW5nJTJDK2FuZCtwcm92aWRlK3JlY29tbWVuZGF0aW9ucytmb3IraW1wcm92 ZW1lbnQuKyUwQVRoaXMrbW9udGglMkMrT0NhbWwrQ2FmJUMzJUE5K3dpbGwrY29uc2lzdCtvZit0 d28rcGFydHMuJUMyJUEwK0ZpcnN0JTJDK1J1ZGkrR3JpbmJlcmcrb2YrT0NhbWwrTGFicyt3aWxs K3ByZXNlbnQrYW4raW5mb3JtYWwraW50cm9kdWN0aW9uK3RvK0R1bmUlMkMrdGhlK09DYW1sK2J1 aWxkK3N5c3RlbS4lQzIlQTArTGVhcm4rYWJvdXQrRHVuZStmcm9tK29uZSt0aGUrcGVvcGxlK2Rl dmVsb3BpbmcraXQuJUMyJUEwK0ZvbGxvd2luZytSdWRpJTI2JTIzODIxNyUzQnMrcHJlc2VudGF0 aW9uJTJDK3dlK3dpbGwrb3Blbit0aGUrZGlzY3Vzc2lvbit0bythbGwrdGhpbmdzK09DYW1sLXJl bGF0ZWQuKyUwQVdoZXRoZXIreW91JUUyJTgwJTk5cmUrc3RpbGwrdHJ5aW5nK3RvK21ha2Urc2Vu c2Urb2YrY3Vycnlpbmcrb3IrY2FuK3Nwb3Qrbm9uLXRhaWwtcmVjdXJzaXZlK2NvZGUrZnJvbSth Y3Jvc3MrdGhlK3Jvb20lMkMrd2UraG9wZSt0aGF0K3lvdSVFMiU4MCU5OWxsK2pvaW4rdXMrd2l0 aCt5b3VyK3F1ZXN0aW9ucythYm91dCtPQ2FtbCUyQytvcitqdXN0K3RvK2hhbmcrb3V0K3dpdGgr dGhlK09DYW1sK2NvbW11bml0eS4rJTBBJTBBQ2xhdWRlK1J1KyUyOFZpZXcrRnVsbCtFdmVudCtE ZXNjcmlwdGlvbitIZXJlJTNBK2h0dHBzJTNBJTJGJTJGaGZwdWcub3JnJTJGZXZlbnQlMkZvY2Ft bC1jYWZlLWludHJvZHVjdGlvbi10by1kdW5lLWFuZC1vcGVuLWZvcnVtJTJGJTI5JmxvY2F0aW9u PVpvb20mdHJwPWZhbHNlJnNwcm9wPXdlYnNpdGU6aHR0cHM6Ly9oZnB1Zy5vcmcmY3R6PUFtZXJp Y2ElMkZDaGljYWdvPg0KDQpbaUNhbF0NCjxodHRwczovL2hmcHVnLm9yZy9ldmVudC9vY2FtbC1j YWZlLWludHJvZHVjdGlvbi10by1kdW5lLWFuZC1vcGVuLWZvcnVtLz9pY2FsPTE+DQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0 dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0 cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 13 to 20, 2021.

Writing a REST API with Dream

Joe Thomas announced

I've written a short blog post about the positive experience I had using Dream to build a REST API. The accompanying source code is available = here:

https://github.com/jsthomas= /sensors

I'm interested in adding more examples and tutorials to the OCaml ecosystem= and would be happy to get your feedback on this writeup (here or via email/github).

OTOML 0.9.0 =E2=80=94 a compliant and flexible TOML parsing, m= anipulation, and pretty-printing library

Daniil Baturin announced

I don't really like to base a release announcement on bashing another proje= ct, but this whole project is motivated by my dissatisfaction with T= o.ml=E2=80=94the only TOML library for OCaml, so here we go. OTOML is a TOML library that you (hopefully) can use without writing lo= ng rants afterwards. ;)

In short:

  • TOML 1.0-compliant (To.ml is = not).
  • Good error reporting.
  • Makes it easy to look up nested values.
  • Bignum and calendar libraries are pluggable via functors.
  • Flexible pretty-printer with indentation.

OPAM: https://opam.ocaml= .org/packages/otoml/ GitHub: https://github.com/d= mbaturin/otoml

Now let's get to details.

TOML is supposed to be human-friendly so that people can use it as a config= uration file format. For that, both developer and end-user experience must be great. To.ml provides neither. I'= ve been using To.ml in my projects for a long time, and

Standard compliance

TOML is neither minimal nor obvious really, it's much larger than the commo= nly used subset and the spec is not consistent and not easy to read, but To.ml fails at rather well-known thing= s, like dotted keys, arrays of tables and heterogeneous arrays.

OTOML passes all tests in the test suite, except the tests related to bignum support. Those tests fail because the default implementation maps in= tegers and floats to the native 31/63-bit OCaml types. More on that later.

Error reporting

Let's look at error reporting. To.ml's response to any parse error is a gen= eric error with just line and column numbers.

utop # Toml.Pa=
rser.from_string "foo =3D [" =
;;
- : Toml.Parser.result =3D
`Error
  ("Error in <string> at line 1 at co=
lumn 7 (position 7)",
   {Toml.Parser.source =3D "<string>"; line =3D 1; column =3D 7; p=
osition =3D 7})

Menhir offers excellent tools for error reporting, so I took time to make d= escriptive messages for many error conditions (there are generic "syntax erro= r" messages still, but that's better than nothing at all).

utop # Otoml.P=
arser.from_string_result "foo =3D ["=
 ;;
- : (Otoml.t, string) result =3D
Error
 "Syntax error on line 1, character 8: Malf=
ormed array (missing closing square bracket?)\n"

utop # Otoml.Parser.from_string_resu=
lt "foo =3D {bar " ;;
- : (Otoml.t, string) result =3D
Error
 "Syntax error on line 1, character 12: Key=
 is followed by end of file or a malformed TOML construct.\n"

Looking up nested values

Nested sections are common in configs and should be easy to work with. This= is how you do it in OTOML:

utop # let t =3D Otoml.Parser.from_string "[this.is.a.deeply.nested.table]
answer=3D42";;
val t : Otoml.t =3D
  Otoml.TomlTable
   [("this",
     Otoml.TomlTable...

utop # Otoml.find t Otoml.get_integer ["=
this"; "is"; "a"; "deeply"=
; "nested"; "table"; "answer"] ;;
- : int =3D 42

For comparison, this is how it was done in To.ml:

utop # let toml_data =3D=
 Toml.Parser.(from_string "
[this.is.a.deeply.nested.table]
answer=3D42" |> unsafe);;
val toml_data : Typ=
es.table =3D <abstr>

utop # Toml.Lenses.(get toml_data (
  key "this" |-- table
  |-- key "is" |-- table
  |-- key "a" |-- table
  |-- key "deeply" |-- table
  |-- key "nested" |-- table
  |-- key "table" |-- table
  |-- key "answer"|-- int ));;
- : int option =3D Some 42

Extra dependencies

The TOML spec includes first-class RFC3339 dates, for better or worse. The = irony is that most uses of TOML (and, indeed, most configuration files in the world) don't need that, so it's arg= uably a feature bloat=E2=80=94but if we set out to support TOML as it's defined, that question is academic.

The practical implication is that if the standard library of a language doe= sn't include a datetime type, a TOML library has to decide how to represent those values. To.ml makes ISO8601 a = hard dependency, so if you don't use dates, you end up with a useless dependency. And if you prefer another libr= ary (or need functionality no present in ISO8601), you end up with two libraries: one you chose to use, and one more= forced on you.

Same goes for the arbitrary precision arithmetic. Most configs won't need i= t, but the standard demands it, so something needs to be done.

Luckily, in the OCaml land we have functors, so it's easy to make all these= dependencies pluggable. So I made it a functor that takes three modules.

module Make (I : TomlIntege=
r) (F : TomlFloat) (D : TomlDateTomlImplementation with type toml_integer =3D I.=
t and type toml_float =3D F.t and type=
 toml_date =3D D.t

This is how to use Zarith for big integers and keep the rest unchanged:

(* No signature ascription:
   `module BigInteger : Otoml.Base.TomlInte=
ger` would make the type t abstract,
   which is inconvenient.
 *)<=
/span>
module BigInteger =3D struct
  type t =3D Z.t
  let of_string =3D Z=
.of_string
  let to_string =3D Z=
.to_string
  let of_boolean b =3D if b then Z.one else Z.zero
  let to_boolean n =3D (n <> Z.zero)
end

module MyToml =3D Oto=
ml.Base.Make (BigInteger) (Otoml.Base.OCamlFloat) (Otoml.Base.StringDate)

Printing

To.ml's printer can print TOML at you, that's for certain. No indentation, = nothing to help you navigate nested values.

utop # let toml_data =3D=
 Toml.Parser.(from_string "[foo.bar]\nbaz=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2=
]" |> unsafe) |>
Toml.Printer.string_of_table |> print_endline;;
[foo.bar]
baz =3D false
[foo.quux]
xyzzy =3D [1, 2]

We can do better:

utop # let t =3D Otoml.Parser.from_string "[foo.bar]\nbaz=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2]" |>
Otoml.Printer.to_channel ~indent_width:4 ~collapse_tables:false stdou=
t;;

[foo]

[foo.bar]
    baz =3D false

[foo.quux]
    xyzzy =3D [1, 2]
val t : unit =3D ()

utop # let t =3D Otom=
l.Parser.from_string "[foo.bar]\nbaz=
=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2]" |>
Otoml.Printer.to_channel ~indent_width:4 ~collapse_tables:false ~indent_subtables:true stdout;;

[foo]

    [foo.bar]
        baz =3D false

    [foo.quux]
        xyzzy =3D [1, 2]
val t : unit =3D ()

Maintenance practices

Last but not least, good maintenance practices are also important, not just= good code. To.ml is at 7.0.0 now. It has a CH= ANGES.md file, but I'm still to see the maintainers document what the breaking change is, who's affected, and what they should = do to make their code compatible.

For example, in 6.0.0 the breaking change was a rename from TomlLense= s to Toml.Lenses. In an earlier release, I remember the opposite rename. Given the standard compatibility problems goi= ng unfixed for years, that's like rearranging furniture when the roof is leaking.

I promise not to do that.

Conclusion

I hope this library will help make TOML a viable configuration file format = for OCaml programs.

It's just the first version of course, so there's still room for improvemen= t. For example, the lexer is especially ugly: due to TOML being highly context-sensitive, it involves massive amoun= ts of lexer hacks for context tracking. Maybe ocamllex is a wrong tool for the job abd it should be replaced with s= omething else (since I'm using Menhir's incremental API anyway, it's not tied to any lexer API).

The printer is also less tested than the parser, so there may be unhandled = edge cases. It also has some cosmetic issues like newlines between parent and child tables.

Any feedback and patches are welcome!

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

soupault 3.0.= 0 is now available.

It now uses the new OTOM= L library for loading the configs, which has some positive side effects, e.g. keys in the output of soupault --show-eff= ective-config (that shows your config plus default values you didn't set explicitly) now come in the same order as in = your config file.

It also provides TOML and YAML parsing functions to Lua plugins and has col= ored log headers (can be disabled with NO_COLOR environment variables).

OCaml 4.13.0, second alpha release

octachron announced

The release of OCaml 4.13.0 is approaching. We have released a second alpha= version to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the i= nstallation instructions). You can see the progress on this front at https://github.com/ocaml/opam-repository/issues/18791 .

Beyond the usual bug fixes (see the full list below), this second alpha int= egrates a new feature for native code: poll points. Those poll points currently fixes some issues with signals in = non-allocating loops in native code. More importantly, they are prerequisite for the multicore r= untime.

Another change is the removal of the removal of interbranch propagation of = type information. The feature, already postponed from 4.12, has been removed to focus for now= on better error message in the -principal mode.

If you find any bugs, please report them here:

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

The first beta release may follow soon since the opam ecosystem is in quite= good shape; and we are on track for a full release in September.

Happy hacking, Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.13.0~alpha2 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-reposi=
tory.git

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.13.0~a=
lpha2+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.13.0~alpha2+flambda+nffa
--packages=3Docaml-variants.4.13.0~alpha2+options,ocaml-option-flambda,ocam=
l-option-no-flat-float-array
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

All available options can be listed with "opam search ocaml-option".

If you want to test this version, it is advised to install the alpha opam r= epository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-ka=
te/opam-alpha-repository.git

This alpha repository contains various fixes in the process of being upstre= amed.

The source code for the alpha is also available at these addresses:

Changes since the first alpha release

New feature
  • 10039: Safe= points Add poll points to native generated code. These are effectively zero-sized allocations and fix some signal and remembered set issues. Also multicore prerequisite. (Sadiq Jaffer, Stephen Dolan, Damien Doligez, Xavier Leroy, Anmol Sahoo, Mark Shinwell, review by Damien Doligez, Xavier Leroy, and Mark Shinwell)
New bug fixes
  • 10449: Fix = major GC work accounting (the GC was running too fast). (Damien Doligez, re= port by Stephen Dolan, review by Nicol=C3=A1s Ojeda B=C3=A4r and Sadiq Jaff= er)
  • 10454: Chec= k row_more in nondep_type_rec. (Leo White, review by Thomas Refis)
  • 10468: Corr= ectly pretty print local type substitution, e.g. type t :=3D …, with= -dsource (Matt Else, review by Florian Angeletti)
  • 10461, 10498: caml_s= end* helper functions take derived pointers as arguments. Those mus= t be declared with type Addr instead of Val. Moreover, poll point insertion= must be disabled for caml_send*, otherwise the derived pointe= r is live across a poll point. (Vincent Laviron and Xavier Leroy, review by= Xavier Leroy and Sadiq Jaffer)
  • 10478: Fix = segfault under Windows due to a mistaken initialization of thread ID when a= thread starts. (David Allsopp, Nicol=C3=A1s Ojeda B=C3=A4r, review by Xavi= er Leroy)
  • 9525, 10402: ocamldoc only = create paragraphq at the toplevel of documentation comments (Florian Angele= tti, report by Hendrik Tews, review by Gabriel Scherer)
  • 10206: Spli= t labels and polymorphic variants tutorials Splits the labels and polymorphic variants tutorial into two. Moves the GAD= Ts tutorial from the Language Extensions chapter to the tutorials. (John Whitington, review by Florian Angeletti and Xavier Leroy)
Removed feature
  • [ breaking change ] 9811: remove propagation from previous branches Type informa= tion inferred from previous branches was propagated in non-principal mode. = Revert this for better compatibility with -principal mode. For the time bei= ng, infringing code should result in a principality warning. (Jacques Garri= gue, review by Thomas Refis and Gabriel Scherer)

The up-to-date list of changes for OCaml 4.13 is available at https://github.com/ocaml/oc= aml/blob/4.13/Changes .

OCamlFormat 0.19.0

Guillaume Petiot announced

We are happy to announce the release of OCamlFormat 0.19.0.

OCamlformat is an auto-formatter for OCaml code, writing the parse tree and= comments in a consistent style, so that you do not have to worry about formatting it by hand, and to speed up code = review by focusing on the important parts.

OCamlFormat is beta software. We expect the program to change considerably = before we reach version 1.0.0. In particular, upgrading the `ocamlformat` package will cause your program to = get reformatted. Sometimes it is relatively pain-free, but sometimes it will make a diff in almost every fil= e. We are working towards having a tool that pleases most usecases in the OCaml community, please bear with us!

To make sure your project uses the last version of ocamlformat, please set

version=3D0.19.0

in your .ocamlformat file.

Main changes in ocamlformat.0.19.0 are:

  • OCaml 4.13 features are supported
  • ppxlib dependency has been dropped
  • A new line-endings=3D{lf,crlf} option has been added for w= indows compatibility

Here is the full list of changes.

We encourage you to try ocamlformat, that can be installed from opam direct= ly ( opam install ocamlformat ), but please remember that it is still beta software. We have a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Nicol=C3=A1s Ojeda B=C3=A4r then added

A new line-endings=3D{lf,crlf} option has been added for windo= ws compatibility

Just to expand a bit on this feature: previously, ocamlformat = would use the system EOL convention (ie LF on Unix-like OSs and CRLF on Windows). This meant that if you applied oc= amlformat on systems with different EOL conventions, you would get a diff on every line on every file purely due to= the changed newlines. Furthermore, this meant ocamlformat was hard to use if your project used LF on W= indows (a common usage).

With the new option, ocamlformat enforces a given EOL conventi= on. The system EOL convention is no longer used for any purpose and the EOL convention used is the one specified in ocaml= format's config (LF by default).

OCaml Caf=C3=A9: Wed, Aug 4 @ 7pm (U.S. Central)

Michael Bacarella announced

Please join us at the next OCaml Cafe, a friendly, low stakes opportunity t= o ask questions about the OCaml language and ecosystem, work through programming problems that you=E2=80=99re stuck = on, and get feedback on your code. Especially geared toward new and intermediate users, experienced OCaml developers will= be available to answer your questions. Bring your code and we=E2=80=99ll be happy to review it, assist with debugg= ing, and provide recommendations for improvement.

This month, OCaml Caf=C3=A9 will consist of two parts. First, Rudi Grinberg= of OCaml Labs will present an informal introduction to Dune, the OCaml build system. Learn about Dune from one the people developing it. Following Rudi=E2=80=99s presentation, we will op= en the discussion to all things OCaml-related.

Full Zoom meeting details here.

Old CWN

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

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

--=-=-=--