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 sympa.inria.fr (Postfix) with ESMTPS id B25027F332 for ; Tue, 3 Dec 2019 16:42:57 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,273,1571695200"; d="asc'?scan'208,217";a="417352768" Received: from 207-7-99-34.oc.nextlevelinternet.com (HELO set) ([207.7.99.34]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 03 Dec 2019 16:42:54 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 03 Dec 2019 16:42:51 +0100 Message-ID: <878sntl8jo.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTm92ZW1iZXIgMjYgDQp0bw0KRGVjZW1iZXIg MDMsIDIwMTkuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSXJt aW4gMi4wLjAgcmVsZWFzZQ0KSG93IHZpYWJsZSBpcyBkZWxpdmVyaW5nIGJp bmFyaWVzIGxpbmtlZCB0byBDeWd3aW4gdG8gV2luZG93cyANCmN1c3RvbWVy cz8NCkR1bmUgMi4wLjANCkFkdmFuY2VkIEMgYmluZGluZyB1c2luZyBvY2Ft bC1jdHlwZXMgYW5kIGR1bmUNClVwY29taW5nIGJyZWFraW5nIGNoYW5nZSBp biBCYXNlL0NvcmUgdjAuMTQNCkNJL0NEIFBpcGVsaW5lczogTW9uYWQsIEFy cm93IG9yIERhcnQ/DQpVc2Ugb2YgZnVuY3RvcnMgdG8gYXBwcm94aW1hdGUg RiMgc3RhdGljYWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0KT2xk IENXTg0KDQoNCklybWluIDIuMC4wIHJlbGVhc2UNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IA0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1pcm1pbi0yLTAtMC1yZWxlYXNlLzQ3NDYvNT4NCg0KDQpDb250aW51 aW5nIHRoaXMgdGhyZWFkLCBzYW1vaHQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBBbmQgdGhlcmUgaXMgbm93IGEg Zm9sbG93LXVwIGJsb2cgcG9zdCwgZXhwbGFpbmluZyBob3cgdG8gdXNlIA0K ICB0aGUgbmV3DQogIEdyYXBoUUwgQVBJIGF2YWlsYWJsZSBpbiBJcm1pbjI6 DQogIDxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAxOS0xMS0yNy1pbnRy b2R1Y2luZy1pcm1pbi1ncmFwaHFsPi4NCg0KDQpIb3cgdmlhYmxlIGlzIGRl bGl2ZXJpbmcgYmluYXJpZXMgbGlua2VkIHRvIEN5Z3dpbiB0byBXaW5kb3dz IA0KY3VzdG9tZXJzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9ob3ctdmlhYmxlLWlzLWRlbGl2ZXJpbmctYmluYXJpZXMtbGlu a2VkLXRvLWN5Z3dpbi10by13aW5kb3dzLWN1c3RvbWVycy80Nzc1Pg0KDQoN Cm1iYWNhcmVsbGEgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGluIHRoZSBlYXJs eSBzdGFnZXMgb2YgcGxhbm5pbmcgYSBkZWxpdmVyYWJsZSBiaW5hcnkgcHJv ZHVjdCANCiAgdGhhdA0KICB3aWxsIHJ1biBvbiBMaW51eCwgTWFjIGFuZCBX aW5kb3dzLg0KDQogIE15IGJyaWVmIHNuaWZmIG9mIHRoZSBhaXIgYXJvdW5k IHRoZSBPQ2FtbCBlY29zeXN0ZW0gc2F5cyBJIA0KICBzaG91bGQNCiAgZXhw ZWN0IHRvIHRhcmdldCBDeWd3aW4gdG8gZ2V0IFdpbmRvd3MgZ29pbmcgKGFs dGhvdWdoIHRoZXJl4oCZcw0KICBpbXByZXNzaXZlIHdvcmsgdG8gZ2V0IG5h dGl2ZSBXaW5kb3dzIHN0dWZmIGRvbmUgdGhhdCBjYW4gYmVjb21lIA0KICB0 aGUNCiAgcHJlZmVycmVkIGFwcHJvYWNoIGluIGEgZmV3IHllYXJzKS4NCg0K ICBNeSBleHBlcmllbmNlIHVzaW5nIEN5Z3dpbiBhcyBhbiBvcGVyYXRpbmcg ZW52aXJvbm1lbnQgaXMgdGhhdCANCiAgaXTigJlzDQogIHByZXR0eSBkYXJu IHNsdWdnaXNoIGNvbXBhcmVkIHRvIExpbnV4IG9uIHRoZSBzYW1lIGNvbXB1 dGVyLg0KDQogIFdoeSBpcyB0aGlzPyBUaGVyZeKAmXMgYW4gYW5lY2RvdGUg dGhhdCBzYXlzIEN5Z3dpbiBjYW4gb25seSBmb3JrIA0KICBhdA0KICBhYm91 dCAzMC01MHggYSBzZWNvbmQgb24gV2luZG93cywgZHVlIHRvIGhvdyBpdCBo YXMgdG8gYWRhcHQgaXQgDQogIHRvDQogIHdvcmsgd2l0aGluIFdpbmRvd3Pi gJkgdGFzayBzcGF3bmluZyBtb2RlbC4gKEZvciBjb250cmFzdCwgTGludXgg DQogIGNhbg0KICBhY2hpZXZlIHRob3VzYW5kcyBvZiBmb3JrcyBwZXIgc2Vj b25kIGlmIHlvdSBwbGF5IGFyb3VuZCB3aXRoIA0KICBpdCkuDQoNCiAgSSB1 bmRlcnN0YW5kIGZyb20gYW5vdGhlciBwcm9kdWN0IGRldmVsb3BlciB0aGF0 IHdoZW4gdGhleSBidWlsZA0KICBiaW5hcmllcyB0byBkZWxpdmVyIHRvIFdp bmRvd3MvQ3lnd2luLCB0aGV5IGFjdHVhbGx5IA0KICBjcm9zcy1jb21waWxl IG9uDQogIExpbnV4IGJlY2F1c2Ugb2YgaG93IHNsb3dseSB0aGUgdG9vbGNo YWluIHJ1bnMgb24gQ3lnd2luLg0KDQogIFRoYXQgc291bmRzIGxpa2UgYmFk IG5ld3MgaWYgeW91IHdhbnQgdG8gZG8gVU5JWHkgdGhpbmdzLCBidXQgDQog IGZvciBhDQogIHNpbmdsZSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIHRoaXMg bWlnaHQgbm90IGJlIHNvIGJhZD8gSSBhc3N1bWUgDQogIGlmIEkNCiAgc2hp cCBhIGRlbGl2ZXJhYmxlIHRvIFdpbmRvd3MvQ3lnd2luLCB0aGUgZW5kIHVz ZXIgbWF5IGVuam95IA0KICBnb29kDQogIHBlcmZvcm1hbmNlLCBzbyBsb25n IGFzIEnigJltIG5vdCBzcGF3bmluZyB0b25zIG9mIHByb2Nlc3NlcyBvciAN CiAgcmVseWluZw0KICBvbiBmb3JrIGZvciBtdWx0aS1wcm9ncmFtbWluZy4g SXMgdGhpcyBhIHNhZmUgYXNzdW1wdGlvbnM/DQoNCiAgQW55IG90aGVyIGdv dGNoYXMgd2hlbiBpdCBjb21lcyB0byBPQ2FtbCBvbiBDeWd3aW4gdy5yLnQu IA0KICBwZXJmb3JtYW5jZT8NCg0KICBUaGUgYXBwIHByZXR0eSBtdWNoIGhh cyByZWFsLXRpbWUgZ2FtaW5nIHJlcXVpcmVtZW50cyAodGhvdWdoIA0KICBp dOKAmXMgbm90DQogIGEgZ2FtZSBzbyBjYW4gc2lkZS1zdGVwIHdvcnJ5aW5n IGFib3V0IGFjY2VzcyB0byBHUFVzIGFuZA0KICB3aGF0LW5vdCkuIFN0YXRl ZCBhbm90aGVyIHdheSwgYWx0aG91Z2ggbXkgYXBwbGljYXRpb24gd2lsbCAN CiAgZGVwZW5kIG9uDQogIHRoZSBQT1NJWCBsYXllciBvZmZlcmVkIGJ5IEN5 Z3dpbiwgSSBleHBlY3QgaXQgbm90IHRvIGNydW5jaCANCiAgUE9TSVgNCiAg cmVsYXRlZCBzdHVmZiBpbiB0aGUgbWFpbiBsb29wLg0KDQogIEhvdyBoYXMg eW91ciBleHBlcmllbmNlIGdvbmU/DQoNCg0KSm9obiBXaGl0aW5ndG9uIHJl cGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgaGF2ZSBi ZWVuIHNoaXBwaW5nIGNvbW1lcmNpYWwgYmluYXJpZXMgZm9yIExpbnV4ICgz MiBhbmQgNjQgDQogIGJpdCksDQogIFdpbmRvd3MgKDMyIGFuZCA2NGJpdCkg YW5kIE9TIFggZm9yIHllYXJzLiBGb3IgZXhhbXBsZToNCiAgPGh0dHBzOi8v Z2l0aHViLmNvbS9jb2hlcmVudGdyYXBoaWNzL2NwZGYtYmluYXJpZXM+DQoN CiAgQW5kIGV2ZW4gc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gYmlu YXJ5IGZvcm06DQogIDxodHRwczovL2dpdGh1Yi5jb20vY29oZXJlbnRncmFw aGljcy9jcGRmbGliLWJpbmFyeT4NCg0KICBPbiBPUyBYLCB5b3UgbmVlZCB0 byB1c2UgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9yIHNpbWlsYXIgdG8g DQogIG1ha2UNCiAgc3VyZSB5b3VyIGJ1aWxkcyB3aWxsIHJ1biBvbiBvbGRl ciBzeXN0ZW1zLiBBbmQsIGluIGZhY3QsIHlvdSANCiAgbmVlZCB0bw0KICB1 c2UgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIHdoZW4gYXNraW5nIE9QQU0g dG8gY29tcGlsZSB0aGUgDQogIE9DYW1sDQogIGNvbXBpbGVyIGl0c2VsZi4g QW5kLCB5b3Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBjb2Rlc2lnbmluZyBh bmQNCiAgbm90YXJpemF0aW9uLiBCdXQgaXTigJlzIGFsbCBkb2FibGUuDQoN CiAgRm9yIGxpbnV4LCB5b3UgbWF5IG5lZWQgdG8gYnVpbGQgdW5kZXIgb2xk ZXIgbGludXggdmVyc2lvbnMsIHRvIA0KICBtYWtlDQogIHN1cmUgdGhhdCB0 aGUgZ2xpYmMgaW4gdXNlIGlzIG9sZCBlbm91Z2guIFRoaXMgaXMgbm90IGFu DQogIG9jYW1sLXNwZWNpZmljIHByb2JsZW0uIEkgaGF2ZSBhIDY0IGJpdCBh bmQgMzIgYml0IFZNIHdpdGggDQogIG9sZC1pc2gNCiAgZ2xpYmMgdmVyc2lv bnMgZm9yIHRoaXMgcHVycG9zZS4NCg0KICBVbmRlciBXaW5kb3dzLCB0aGVy ZSBhcmUgbm8gc3VjaCBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IA0KICBwcm9i bGVtcy4gSQ0KICB1c2UgdGhlIG5ldyBPQ2FtbCBmb3Igd2luZG93cyBzeXN0 ZW0sIHdoaWNoIGNvbWVzIHdpdGggT1BBTSwgYW5kIA0KICBpcw0KICBtaW5n dy1iYXNlZC4gTm8gY3lnd2luIHJlbWFpbnMgaW4gdGhlIGZpbmFsIGJpbmFy eS4NCg0KICBGb3IgbW9yZSBvYnNjdXJlIHN5c3RlbXMgKEFJWCwgSFBVWCwg U3BhcmMgZXRjKSBjdXN0b21lcnMgDQogIGNvbXBpbGUgZnJvbQ0KICBzb3Vy Y2UgKHdpdGggaGVscCBmcm9tIG1lKS4gTm90IG9uY2UgaW4gbW9yZSB0aGFu IHRlbiB5ZWFycyBoYXMgDQogIGFueW9uZQ0KICBjYXJlZCB0aGF0IGl0IHdh cyB3cml0dGVuIGluIE9DYW1sLg0KDQoNCmRidWVuemxpIGFsc28gcmVwbGll ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgcmVtZW1iZXIgdGhhdCBvbiB0 aGUgV2luZG93cyBuYXRpdmUgcG9ydCwgdGhlIFVuaXggbW9kdWxlIA0KICBk aXN0cmlidXRlZA0KICB3aXRoIE9DYW1sIGlzIHlvdXIgUE9TSVggY29tcGF0 aWJpbGl0eSBsYXllci4gVGhlcmUgYXJlIGEgZmV3IA0KICBlbnRyeQ0KICBw b2ludHMgdG8gYXZvaWQgdGhvdWdoLCB0aGUgbGlzdCBpcyBhdCB0aGUgYm90 dG9tIG9mIFt0aGlzIA0KICBwYWdlXS4NCg0KDQpbdGhpcyBwYWdlXSANCjxo dHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xp YnVuaXguaHRtbD4NCg0KDQpub2piIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgQXQgTGV4aUZpIG91ciBtYWluIGFwcGxpY2F0aW9uIGlzIGRldmVsb3Bl ZCBhbmQgc2hpcHBlZCBvbiANCiAgV2luZG93cy4gV2UNCiAgdXNlIHRoZSBt c3ZjIHBvcnQgb2YgT0NhbWwuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbmVlZCBD eWd3aW4gdG8NCiAgZGV2ZWxvcCwgYnV0IHRoZSByZXN1bHRpbmcgYXBwbGlj YXRpb24gaXMgZnVsbHkgbmF0aXZlIGFuZCBkb2VzIA0KICBub3QNCiAgZGVw ZW5kIG9uIHRoZSBDeWd3aW4gRExMLiBBcyBAZGJ1ZW56bGkgbWVudGlvbmVk LCB0aGUgVW5peCANCiAgbW9kdWxlICppcyoNCiAgdGhlIFBPU0lYIGNvbXBh dGliaWxpdHkgbGF5ZXIuDQoNCiAgQ29tcGlsYXRpb24gc3BlZWQgaXMgc2xv d2VyIG9uIFdpbmRvd3MgYmVjYXVzZSBwcm9jZXNzIGNyZWF0aW9uIA0KICBp cw0KICBzbG93ZXIgb24gV2luZG93cyBhcyBhIGdlbmVyYWwgcnVsZSwgYnV0 IGl0IGlzIG1hbmFnZWFibGUgKG91cg0KICBhcHBsaWNhdGlvbiBoYXMgYXJv dW5kIDIwMDAgbW9kdWxlcyArIEpzX29mX29jYW1sICsgQyBiaW5kaW5ncyAr IA0KICBDIw0KICBjb21wb25lbnQpLg0KDQogIFdlIGRvbuKAmXQgaGF2ZSBh bnkgaXNzdWVzIHdpdGggcnVudGltZSBwZXJmb3JtYW5jZS4gVGhlIGBVbml4 JyANCiAgbGlicmFyeQ0KICBtZW50aW9uZWQgYWJvdmUgaW1wbGVtZW50cyBX aW5kb3dzIHN1cHBvcnQgZGlyZWN0bHkgd2l0aG91dCANCiAgZ29pbmcNCiAg dGhyb3VnaCBhbnkgY29tcGF0aWJpbGl0eSBsYXllciBhbmQgaXMgcXVpdGUg ZWZmaWNpZW50Lg0KDQoNCkJpa2FsR3VydW5nIGFsc28gcmVwbGllZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlcmUgaXMgYW4gZWRp dG9yIGJlaW5nIGJ1aWx0IGluIG9jYW1sL3JlYXNvbm1sIHdoaWNoIGN1cnJl bnRseQ0KICB0YXJnZXRzIHdpbmRvd3MsIGxpbnV4IGFuZCBtYWNvcyAtDQog IDxodHRwczovL2dpdGh1Yi5jb20vb25pdmltL29uaTI+LiBIb3dldmVyLCB0 aGUgYmluYXJ5IGlzIG5hdGl2ZQ0KICB3aW5kb3dzIHJhdGhlciB0aGFuIGN5 Z3dpbiBkZXJpdmF0aXZlLiBTbyBpZiB5b3UgZG9u4oCZdCBoYXZlIHRvIA0K ICB1c2UNCiAgY3lnd2luIGRlcGVuZGVuY2llcyB0aGVuIG5hdGl2ZSB3aW5k b3dzIGJpbmFyeSBjb3VsZCBiZSB0aGUgd2F5IA0KICB0byBnby4NCg0KICBB bHNvIGVzeSAtIDxodHRwczovL2dpdGh1Yi5jb20vZXN5L2VzeT4gbWFrZXMg ZGV2ZWxvcGluZw0KICBvY2FtbC9yZWFzb25tbCBvbiB3aW5kb3dzIHZpYWJs ZS4NCg0KDQprZWxlc2hldiBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogICpUTERSKjogSW5zdGFsbCB0aGUgW01pbmd3IHBvcnQgb2Yg T0NhbWwgNF0sIGZyZWVseSB1c2UgbW9zdCANCiAgb3BhbQ0KICAgbGlicmFy aWVzLCBhbmQgY29tcGlsZSB0byBuYXRpdmUgV2luZG93cyBiaW5hcmllcywg d2l0aG91dCANCiAgIGxpY2Vuc2luZw0KICAgaXNzdWVzLg0KDQogIEkgcmVj b21tZW5kIHlvdSByZWFkIHRoZSDigJxSZWxlYXNlIG5vdGVzIGZvciBXaW5k b3dz4oCdOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Js b2IvdHJ1bmsvUkVBRE1FLndpbjMyLmFkb2M+DQoNCiAgVG8gc3VtbWFyaXNl LCB0aGVyZSBhcmUgdGhyZWUgV2luZG93cyBwb3J0czoNCg0KICDigKIgTmF0 aXZlIE1pY3Jvc29mdCBwb3J0LA0KICDigKIgTmF0aXZlIE1pbmd3IHBvcnQs DQogIOKAoiBDeWd3aW4gcG9ydC4NCg0KICBBbGwgdGhyZWUgcmVxdWlyZSBD eWd3aW4gZm9yIGRldmVsb3BtZW50IHB1cnBvc2VzLiBJIHJlY29tbWVuZCAN CiAgdXNpbmcNCiAgdGhlIE5hdGl2ZSBNaW5ndywgYXM6DQoNCiAg4oCiIGl0 ICpkb2VzbuKAmXQqIHJlcXVpcmUgVmlzdWFsIFN0dWRpbyAoaXQgdXNlcyBh IG1pbmd3IGZvcmsgb2YgDQogIEdDQyB0aGF0DQogICAg4oCcY3Jvc3MtY29t cGlsZXPigJ0gbmF0aXZlIFdpbmRvd3MgZXhlY3V0YWJsZXMpLA0KICDigKIg aXQgKmRvZXNu4oCZdCogcmVseSBvbiB0aGUgZHJlYWRlZCBjeWd3aW4uZGxs DQogIOKAoiBpdCBoYXMgZ29vZCBvcGFtIHN1cHBvcnQgd2l0aCBvcGFtLXJl cG9zaXRvcnktbWluZ3c6DQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9mZG9w ZW4vb3BhbS1yZXBvc2l0b3J5LW1pbmd3Pg0KICDigKIgaXQgaGFzIGEgY29u dmVuaWVudCBpbnN0YWxsZXI6DQogICAgPGh0dHBzOi8vZmRvcGVuLmdpdGh1 Yi5pby9vcGFtLXJlcG9zaXRvcnktbWluZ3cvPiA1Lg0KDQogIFRvIGNvbnRy YXN0LCBOYXRpdmUgTWljcm9zb2Z0IHJlcXVpcmVzIFZpc3VhbCBTdHVkaW8s IGFuZCANCiAgZG9lc27igJl0IGhhdmUNCiAgb3BhbS4gWW91IGNhbiBzdGls bCB2ZW5kb3IgcHVyZSBPQ2FtbCBwYWNrYWdlcywgYnV0IGFzIHNvb24gYXMg DQogIHlvdQ0KICB3YW50IHRvIHVzZSBzb21lIEMgYmluZGluZ3MgeW914oCZ cmUgaW4gdHJvdWJsZSwgYmVjYXVzZSBvZiB0aGUgDQogIOKAnG1pbm9y4oCd DQogIGRpZmZlcmVuY2VzIGJldHdlZW4gVmlzdWFsIEMgYW5kIEdDQy4gQW5k IGV2ZXJ5dGhpbmcgYXNzdW1lcyBHQ0MNCiAgbm93YWRheXMuDQoNCiAgQ3ln d2luIHBvcnQgaXMgdGhlIG9uZSBJIGRvbuKAmXQgaGF2ZSBleHBlcmllbmNl IHdpdGgsIGJ1dCANCiAgcmUtcmVhZGluZw0KICB0aGUg4oCcUmVsZWFzZSBu b3RlcyBmb3IgV2luZG93c+KAnSBhYm92ZSBpdCBzdHJpa2VzIG1lIHRoYXQg aXQgDQogIG1lbnRpb25zDQogIHRoYXQgQ3lnd2luIHdhcyByZS1saWNlbnNl ZCBmcm9tIEdQTCB0byBMR1BMIHdpdGggc3RhdGljIGxpbmtpbmcNCiAgZXhj ZXB0aW9uLiBTbyBpdCBsb29rcyBsaWtlIHRoZSBDeWd3aW4gcG9ydCBjb3Vs ZCBiZSB2aWFibGUgZm9yDQogIGNvbW1lcmNpYWwgdXNlLCBidXQgSSBuZXZl ciB0cmllZCB0byBzdGF0aWNhbGx5IGxpbmtlZCANCiAgYGN5Z3dpbi5kbGwn LA0KICBhbmQgSeKAmW0gbm90IHN1cmUgd2hhdCBhcmUgdGhlIGJlbmVmaXRz IG9mIEN5Z3dpbiBwb3J0IG92ZXIgdGhlIA0KICBNaW5ndw0KICBwb3J0Lg0K DQoNCltNaW5ndyBwb3J0IG9mIE9DYW1sIDRdDQo8aHR0cHM6Ly9mZG9wZW4u Z2l0aHViLmlvL29wYW0tcmVwb3NpdG9yeS1taW5ndy8+DQoNCg0KZG1iYXR1 cmluIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V2l0aCBbc291cGF1bHQgNF0sIEkgZGVjaWRlZCB0byBzaGlwIHByZWJ1aWx0 IGJpbmFyaWVzIGZvciBhbGwNCiAgcGxhdGZvcm1zIGluY2x1ZGluZyBXaW5k b3dzLiBNb3N0bHkgdG8gc2VlIGlmIEkgY2FuLCBhbGwgaXRzIA0KICB1c2Vy cyBJDQogIGtub3cgb2YgYXJlIG9uIFVOSVgtbGlrZSBzeXN0ZW1zIGFuZCBr bm93IGhvdyB0byBidWlsZCBmcm9tIA0KICBzb3VyY2UsDQogIGJ1dCB0aGF0 4oCZcyBiZXNpZGUgdGhlIHBvaW50LiA6d2luazoNCg0KICBJIGNhbiBjb25m aXJtIGV2ZXJ5dGhpbmcgQGtlbGVzaGV2IHNheXM6IGZkb3BlbuKAmXMgcGFj a2FnZSBqdXN0IA0KICB3b3JrcywNCiAgb3BhbSB3b3JrcyBleGFjdGx5IGxp a2UgaXQgZG9lcyBvbiBVTklYLCBwdXJlIE9DYW1sIGxpYnJhcmllcyANCiAg YXJlDQogIHRyaXZpYWwgdG8gaW5zdGFsbCwgYW5kIHRoZSBiaW5hcmllcyBk b27igJl0IGRlcGVuZCBvbiBjeWd3aW4uIA0KICBOb3RlDQogIHRoYXQg4oCc b3BhbSBzd2l0Y2ggY3JlYXRl4oCdIGFsc28ganVzdCB3b3JrcywgeW91IGNh biBpbnN0YWxsIA0KICBlaXRoZXINCiAgTWluR1cgb3IgTVNWQyBjb21waWxl ciB2ZXJzaW9ucyBhcyBvcGFtIHN3aXRjaGVzLiAgSSBvbmx5IGV2ZXIgDQog IHN0YXJ0DQogIHRoZSBXaW5kb3dzIFZNIHRvIG1ha2UgcmVsZWFzZSBidWls ZHMsIGFuZCB0aGUgd29ya2Zsb3cgaXMgDQogIGV4YWN0bHkgdGhlDQogIHNh bWUgYXMgb24gTGludXggd2hlcmUgSeKAmW0gYWN0dWFsbHkgd3JpdGluZyBj b2RlLg0KDQogIE15IG9ubHkgb2JzdGFjbGUgb24gdGhhdCBwYXRoIHdhcyB0 aGF0IEZpbGVVdGlscyBsb3N0IGl0cyANCiAgV2luZG93cw0KICBjb21wYXRp YmlsaXR5LCBidXQgSSB3YW50ZWQgdG8gdXNlIGl0LCBzbyBJIHdvcmtlZCB3 aXRoIA0KICBAZ2lsZG9yNDc4IHRvDQogIG1ha2UgaXQgY3Jvc3MtcGxhdGZv cm0gYWdhaW4uIFVuY292ZXJlZCBhIGJ1ZyBpbiB0aGUgDQogIGltcGxlbWVu dGF0aW9uIG9mDQogIFVuaXgudXRpbWVzIGluIHRoZSBwcm9jZXNzLCBidXQg aXTigJlzIGhhcmRseSBhIGNvbW1vbmx5IHVzZWQgDQogIGZ1bmN0aW9uLg0K DQogIFlvdSBjYW4gYWxzbyBzZXR1cCBBcHBWZXlvciBidWlsZHMuIEl04oCZ cyBub3QgYXMgc2ltcGxlIGFzIEkgd2lzaCANCiAgaXQNCiAgd291bGQgYmUs IGJ1dCB0aGVyZSBhcmUgcHJvamVjdHMgZG9pbmcgaXQgdGhhdCB5b3UgY2Fu IHN0ZWFsIHRoZSANCiAgc2V0dXANCiAgZnJvbS4NCg0KICBUaGVyZeKAmXMg YWxzbyBvcGFtLWNyb3NzLXdpbmRvd3MsIGJ1dCBpdOKAmXMgdmVyeSBpbmNv bXBsZXRlIGFuZCANCiAgbmVlZHMNCiAgd29yayB0byBiZSBwcmFjdGljYWwu IFRoZXJlIGFyZSBubyBiaWcgb2JzdGFjbGVzLCBpdCBqdXN0IG5lZWRzDQog IHdvcmsuIFdoaWxlIGZpbGVzIGluIG9wYW0tcmVwb3NpdG9yeS1taW5ndyBh cmUgbm9ybWFsbHkgDQogIGlkZW50aWNhbCB0bw0KICB0aGUgZGVmYXVsdCBv cGFtIHJlcG9zaXRvcnksIHRoZSBjcm9zcyBvbmUgbmVlZHMgc21hbGwgDQog IGFkanVzdG1lbnRzIGluDQogIGV2ZXJ5IHBhY2thZ2UgdG8gc3BlY2lmeSB0 aGUgdG9vbGNoYWluIHRvIHVzZSwgc28gdGhlIHJlcXVpcmVkIA0KICB3b3Jr IGlzDQogIG1vc3RseSBhIGxvdCBvZiB0cml2aWFsIGJ1dCBtYW51YWwgYWN0 aW9ucy4gSSBob3BlIGV2ZW50dWFsbHkgaXQNCiAgcmVhY2hlcyBwYXJpdHkg d2l0aCBmZG9wZW7igJlzIG9uZSBhbmQgd2XigJlsbCBiZSBhYmxlIHRvIGVh c2lseSANCiAgYnVpbGQgZm9yDQogIFdpbmRvd3Mgd2l0aG91dCBldmVyIHRv dWNoaW5nIFdpbmRvd3MuDQoNCiAgQXMgb2Ygc3RhdGljIExpbnV4IGJ1aWxk cywgQEpvaG5XaGl0aW5ndG9u4oCZcyBhcHByb2FjaCBjYW4gd29yaywgDQog IGJ1dA0KICB0aGVyZeKAmXMgYSBiZXR0ZXIgb3B0aW9uIGlmIHlvdSBkb27i gJl0IG5lZWQgYW55dGhpbmcgZnJvbSBnbGliYw0KICBzcGVjaWZpY2FsbHkg YW5kIGRvbuKAmXQgbGluayBhZ2FpbnN0IGFueSBDIGxpYnM6IGJ1aWxkIHN0 YXRpY2FsbHkgDQogIHdpdGgNCiAgbXVzbC4gVGhlcmXigJlzIGEgYCttdXNs K3N0YXRpYytmbGFtYmRhJyBjb21waWxlciBmbGF2b3VyLiBZb3UgDQogIG5l ZWQgbXVzbA0KICBhbmQgZ2NjLW11c2wgdG8gaW5zdGFsbCBpdCwgYnV0IGFm dGVyIHRoYXQsIGp1c3QgYnVpbGQgd2l0aCANCiAgYC1jY29wdA0KICAtc3Rh dGljJyBmbGFnIGFuZCB5b3UgZ2V0IGEgYmluYXJ5IHRoYXQgZG9lc27igJl0 IGRlcGVuZCBvbiANCiAgYW55dGhpbmcuDQoNCg0KW3NvdXBhdWx0IDRdIDxo dHRwczovL3NvdXBhdWx0Lm5lb2NpdGllcy5vcmcvPg0KDQoNCkR1bmUgMi4w LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMi0w LTAvNDc1OD4NCg0KDQpyZ3JpbmJlcmcgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIGR1bmUgdGVhbSwgSeKAmW0gZGVs aWdodGVkIHRvIGFubm91bmNlIHRoZSANCiAgcmVsZWFzZSBvZg0KICBkdW5l IDIuMC4gVGhpcyByZWxlYXNlIGlzIHRoZSBjdWxtaW5hdGlvbiBvZiA0IG1v bnRocyBvZiBoYXJkIA0KICB3b3JrIGJ5DQogIHRoZSBkdW5lIHRlYW0gYW5k IGNvbnRhaW5zIG5ldyBmZWF0dXJlcywgYnVnIGZpeGVzLCBhbmQgDQogIHBl cmZvcm1hbmNlDQogIGltcHJvdmVtZW50cyAuIEhlcmXigJlzIGEgc2VsZWN0 aW9uIG9mIG5ldyBmZWF0dXJlcyB0aGF0IEkgDQogIHBlcnNvbmFsbHkNCiAg ZmluZCBpbnRlcmVzdGluZzoNCg0KICDigKIgTmV3IGJvb3N0cmFwIHByb2Nl ZHVyZSB0aGF0IHdvcmtzIGluIGxvdyBtZW1vcnkgZW52aXJvbm1lbnRzDQog IOKAoiAoYGRlcHJlY2F0ZWRfbGlicmFyeV9uYW1lJyAuLikgc3RhbnphIHRv IHByb3Blcmx5IGRlcHJlY2F0ZSANCiAgb2xkDQogICAgbGlicmFyeSBuYW1l cw0KICDigKIgKGBmb3JlaWduX2xpYnJhcnknIC4uKSBzdGFuemEgdG8gZGVm aW5lIEMvQysrIGxpYnJhcmllcy4NCiAg4oCiIEMgc3R1YnMgZGlyZWN0bHkg aW4gT0NhbWwgZXhlY3V0YWJsZXMNCg0KICBSZWZlciB0byB0aGUgY2hhbmdl IGxvZyBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0Lg0KDQogIFdlIHN0cml2ZSBm b3IgYSBnb29kIG91dCBvZiB0aGUgYm94IGV4cGVyaWVuY2UgdGhhdCByZXF1 aXJlcyBubw0KICBjb25maWd1cmF0aW9uLCBzbyB3ZeKAmXZlIGFsc28gdHdl YWtlZCBhIGZldyBkZWZhdWx0cy4gSW4gDQogIHBhcnRpY3VsYXIsIGAkDQog IGR1bmUgYnVpbGQnIHdpbGwgbm93IGJ1aWxkIGBAYWxsJyBpbnN0ZWFkIG9m IGBAaW5zdGFsbCcsIGFuZA0KICBvY2FtbGZvcm1hdCBydWxlcyBhcmUgc2V0 dXAgYnkgZGVmYXVsdC4NCg0KICBMYXN0bHksIGR1bmUgMi4wIHNoZWRzIGFs bCB0aGUgbGVnYWN5IHJlbGF0ZWQgdG8gamJ1aWxkZXIgYW5kIA0KICB3aWxs IG5vDQogIGxvbmdlciBidWlsZCBqYnVpbGRlciBwcm9qZWN0cy4gVGhpcyBj aGFuZ2UgaXMgbmVjZXNzYXJ5IHRvIGVhc2UNCiAgbWFpbnRlbmFuY2UgYW5k IG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBuZXcgZmVhdHVyZXMgZG93biB0aGUN CiAgbGluZS4gVGhlcmUgYXJlIGEgZmV3IG90aGVyIG1pbm9yIGJyZWFraW5n IGNoYW5nZXMuIFJlZmVyIHRvIHRoZQ0KICBjaGFuZ2UgbG9nIGZvciB0aGUg ZnVsbCBsaXN0LiBXZSBhcG9sb2dpemUgaW4gYWR2YW5jZSBmb3IgYW55DQog IGNvbnZlbmllbmNlIHRoaXMgbWlnaHQgY2F1c2UuDQoNCiAgW0NoYW5nZWxv Z10NCg0KDQpbQ2hhbmdlbG9nXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1kdW5lLTItMC0wLzQ3NTg+DQoNCg0KQWR2YW5jZWQgQyBiaW5k aW5nIHVzaW5nIG9jYW1sLWN0eXBlcyBhbmQgZHVuZQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZHZhbmNl ZC1jLWJpbmRpbmctdXNpbmctb2NhbWwtY3R5cGVzLWFuZC1kdW5lLzQ4MDU+ DQoNCg0KdG9vdHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHdvcmtlZCBvbiBhIHNv Y2tldC5oIGJpbmRpbmcgbGFzdCBzdW1tZXIgYW5kIGhhZCBhIGdyZWF0IA0K ICBleHBlcmllbmNlDQogIGludGVncmF0aW5nIG9jYW1sLWN0eXBlcyB3aXRo IGR1bmUsIEkgdGhvdWdodCB0aGF0IG1pZ2h0IGJlIG9mDQogIGludGVyZXN0 IHRvIG90aGVyIGRldmVsb3BlcnMgc28gSSB3cm90ZSBhYm91dCBpdDoNCiAg PGh0dHBzOi8vbWVkaXVtLmNvbS9Acm9tYWluLmJlYXV4aXMvYWR2YW5jZWQt Yy1iaW5kaW5nLXVzaW5nLW9jYW1sLWN0eXBlcy1hbmQtZHVuZS1jYzNmNGNi YWIzMDI+DQoNCg0KcmdyaW5iZXJnIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRo aXMgaXMgYSBnb29kIGFydGljbGUuIEkgZW5jb3VyYWdlIGFueW9uZSB3aG8g d3JpdGVzIEMgYmluZGluZ3MgDQogIHdpdGgNCiAgY3R5cGVzIHRvIHN0dWR5 IGl0IGNhcmVmdWxseS4NCg0KICBBIGxpdHRsZSBiaXQgb2YgYWR2aWNlIHRv IHNob3J0ZW4geW91ciBkdW5lIGZpbGVzOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgKGRlcHMgICAgKDpnZW4gLi9nZW5fY29uc3RhbnRzX2MuZXhl KSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBsaW5lIGlzbuKAmXQg bmVjZXNzYXJ5LiBEdW5lIGlzIHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQg DQogIHJ1bm5pbmcgYQ0KICBiaW5hcnkgaW4gYSBydWxlIGluY3VycyBhIGRl cGVuZGVuY3kgb24gaXQuDQoNCiAgICAgICAgZHVuZSBoYXMgYSB0cnVseSBh bWF6aW5nIFtzdXBwb3J0IGZvciBjcm9zcy1jb21waWxpbmddLA0KICAgICAg ICB3aGljaCB3ZSBkbyBub3QgY292ZXIgaGVyZSwgYnV0LCB1bmZvcnR1bmF0 ZWx5LCBpdHMNCiAgICAgICAgcHJpbWl0aXZlcyBmb3IgYnVpbGRpbmcgYW5k IGV4ZWN1dGluZyBiaW5hcmllcyBkbyBub3QgeWV0DQogICAgICAgIGNvdmVy IHRoaXMgdXNlIGNhc2UuDQoNCiAgSW5kZWVkLCB3ZSBkb27igJl0IGhhdmUg YW55IHByaW1pdGl2ZXMgZm9yIHJ1bm5pbmcgYmluYXJpZXMgb24gdGhlDQog IHRhcmdldCBwbGF0Zm9ybS4gUGVyaGFwcyB3ZSBzaG91bGQgYWRkIHNvbWUu IEhvd2V2ZXIsIHdlIGRvIGluIA0KICBmYWN0DQogIGhhdmUgc29tZSBmZWF0 dXJlcyBpbiBkdW5lIHRvIHNvbHZlIHRoaXMgY29uY3JldGUgY3Jvc3MgDQog IGNvbXBpbGF0aW9uDQogIHByb2JsZW0uIEFzIGZhciBhcyBJIHVuZGVyc3Rh bmQsIHRoZSBnb2FsIGlzIHRvIG9idGFpbiBzb21lIA0KICBjb21waWxlDQog IHRpbWUgdmFsdWVzIHN1Y2ggYXMgI2RlZmluZSBjb25zdGFudHMgYW5kIGZp ZWxkIG9mZnNldHMgZm9yIHRoZSANCiAgdGFyZ2V0DQogIHBsYXRmb3JtLiBU aGlzIGRvZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4gYW55dGhpbmcg b24gdGhlIA0KICBjcm9zcw0KICBjb21waWxhdGlvbiB0YXJnZXQuIEluIGNv bmZpZ3VyYXRvciwgd2UgaGF2ZSBhIHByaW1pdGl2ZQ0KICBgQ19kZWZpbmUu aW1wb3J0JyB0byBleHRyYWN0IHRoaXMgaW5mb3JtYXRpb24uIFRoZSBlbmQg cmVzdWx0IGlzIA0KICB0aGF0DQogIHRoZXNlIGNvbmZpZ3VyYXRvciBzY3Jp cHRzIGFyZSBjb21wbGV0ZWx5IGNvbXBhdGlibGUgd2l0aCBjcm9zcw0KICBj b21waWxhdGlvbi4NCg0KICBQZXJoYXBzIHRoaXMgY291bGQgYmUgZ2VuZXJh bGl6ZWQgdG8gd29yayB3aXRoIGN0eXBlcyBnZW5lcmF0b3JzIA0KICBhcw0K ICB3ZWxsPw0KDQogIEZ1bm55IGJpdCBvZiB0cml2aWE6IFRoZSBoYWNrIGlu IGNvbmZpZ3VyYXRvciByZXF1aXJlZCB0byBkbyANCiAgdGhpcyBpcw0KICBp biBmYWN0IHNvbWV0aGluZyBJIGV4dHJhY3RlZCBmcm9tIGN0eXBlcyBpdHNl bGYuIFRoZSBvcmlnaW5hbCANCiAgYXV0aG9yDQogIGlzIFt3aGl0ZXF1YXJr XSwgd2hvIGluIHR1cm4gd3JvdGUgaXQgdG8gbWFrZSBjdHlwZXMgaXRzZWxm IA0KICBhbWVuZGFibGUNCiAgdG8gY3Jvc3MgY29tcGlsYXRpb24uDQoNCg0K W3N1cHBvcnQgZm9yIGNyb3NzLWNvbXBpbGluZ10NCjxodHRwczovL2R1bmUu cmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Nyb3NzLWNvbXBpbGF0aW9uLmh0 bWw+DQoNClt3aGl0ZXF1YXJrXSA8aHR0cHM6Ly9naXRodWIuY29tL3doaXRl cXVhcms+DQoNCg0KZW1pbGxvbiB0aGVuIGFkZGVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICAgICAgICBUaGlzIGRvZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4g YW55dGhpbmcgb24gdGhlIGNyb3NzDQogICAgICAgIGNvbXBpbGF0aW9uIHRh cmdldC4gSW4gY29uZmlndXJhdG9yLCB3ZSBoYXZlIGEgcHJpbWl0aXZlDQog ICAgICAgIGBDX2RlZmluZS5pbXBvcnQnIHRvIGV4dHJhY3QgdGhpcyBpbmZv cm1hdGlvbi4gVGhlIGVuZA0KICAgICAgICByZXN1bHQgaXMgdGhhdCB0aGVz ZSBjb25maWd1cmF0b3Igc2NyaXB0cyBhcmUgY29tcGxldGVseQ0KICAgICAg ICBjb21wYXRpYmxlIHdpdGggY3Jvc3MgY29tcGlsYXRpb24uDQoNCiAgSWYg YW55Ym9keSB3YW50cyB0byBrbm93IG1vcmUgYWJvdXQgdGhpcyBiaXQsIEkg d3JvdGUgYW4gYXJ0aWNsZSANCiAgYWJvdXQNCiAgdGhpcyBsYXN0IHllYXI6 IA0KICA8aHR0cHM6Ly9kdW5lLmJ1aWxkL2Jsb2cvY29uZmlndXJhdG9yLWNv bnN0YW50cy8+DQoNCg0KVXBjb21pbmcgYnJlYWtpbmcgY2hhbmdlIGluIEJh c2UvQ29yZSB2MC4xNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC91cGNvbWluZy1icmVha2luZy1jaGFuZ2UtaW4tYmFzZS1j b3JlLXYwLTE0LzQ4MDY+DQoNCg0KYmNjMzIgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBX ZeKAmXJlIGNoYW5naW5nIGZ1bmN0aW9ucyBpbiBCYXNlIHRoYXQgdXNlZCB0 byB1c2UgdGhlIA0KICBwb2x5bW9ycGhpYw0KICB2YXJpYW50IHR5cGUgYFsg YEZzdCBvZiAnYSB8IGBTbmQgb2YgJ2IgXScgdG8gdXNlIGAoJ2EsICdiKSAN CiAgRWl0aGVyLnQnDQogIGluc3RlYWQuIEFzIHdlbGwgYXMgZW5hYmxpbmcg dGhlIHVzZSBvZiBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiANCiAgdGhlDQog IEVpdGhlciBtb2R1bGUsIHRoaXMgbWFrZXMgdGhlIGZ1bmN0aW9ucyBjb25z aXN0ZW50IHdpdGggb3RoZXINCiAgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSB1 c2UgYEVpdGhlci50JywgKGN1cnJlbnRseSBqdXN0DQogIGBTZXQuc3ltbWV0 cmljX2RpZmYnKQ0KDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25z4oCZIHR5 cGVzIHdpbGwgY2hhbmdlOg0KICDigKIgYFJlc3VsdC5va19mc3QnDQogIOKA oiBgTGlzdC5wYXJ0aXRpb25fbWFwJw0KICDigKIgYE1hcC5wYXJ0aXRpb25f bWFwJywgYE1hcC5wYXJ0aXRpb25fbWFwaScNCiAg4oCiIGBIYXNodGJsLnBh cnRpdGlvbl9tYXAnLCBgSGFzaHRibC5wYXJ0aXRpb25fbWFwaScNCg0KICBU aGUgdHlwZSBvZiBMaXN0LnBhcnRpdGlvbjNfbWFwIHdpbGwgbm90IGNoYW5n ZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHZhbCBwYXJ0aXRpb24z X21hcA0KICDilIIgICA6ICAnYSB0DQogIOKUgiAgIC0+IGY6KCdhIC0+IFsg YEZzdCBvZiAnYiB8IGBTbmQgb2YgJ2MgfCBgVHJkIG9mICdkIF0pDQogIOKU giAgIC0+ICdiIHQgKiAnYyB0ICogJ2QgdA0KICDilJTilIDilIDilIDilIAN Cg0KICBXZSBkb27igJl0IGhhdmUgYSBnZW5lcmljIHRlcm5hcnkgdmFyaWFu dCwgYW5kIGl0IGRvZXNu4oCZdCBzZWVtIA0KICB3b3J0aCBpdA0KICB0byBt aW50IG9uZSBqdXN0IGZvciB0aGlzIHB1cnBvc2UuDQoNCiAgU2luY2UgdGhp cyBjaGFuZ2UgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgd2UgZXhwZWN0 IHRoYXQgYSANCiAgc2ltcGxlDQogIGZpbmQvcmVwbGFjZSB3aWxsIGJlIHN1 ZmZpY2llbnQgdG8gdXBkYXRlIGFueSBhZmZlY3RlZCBjYWxsIA0KICBzaXRl cy4NCg0KDQpDSS9DRCBQaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0 Pw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogDQog IDxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8xNC9j aWNkLXBpcGVsaW5lcy8+DQoNCg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbiB0aGlzIHBv c3QgSSBkZXNjcmliZSB0aHJlZSBhcHByb2FjaGVzIHRvIGJ1aWxkaW5nIGEg bGFuZ3VhZ2UgDQogIGZvcg0KICB3cml0aW5nIENJL0NEIHBpcGVsaW5lcy4g TXkgZmlyc3QgYXR0ZW1wdCB1c2VkIGEgbW9uYWQsIGJ1dCB0aGlzDQogIHBy ZXZlbnRlZCBzdGF0aWMgYW5hbHlzaXMgb2YgdGhlIHBpcGVsaW5lcy4gSSB0 aGVuIHRyaWVkIHVzaW5nIA0KICBhbg0KICBhcnJvdywgYnV0IGZvdW5kIHRo ZSBzeW50YXggdmVyeSBkaWZmaWN1bHQgdG8gdXNlLiBGaW5hbGx5LCBJIA0K ICBlbmRlZCB1cA0KICB1c2luZyBhIGxpZ2h0LXdlaWdodCBhbHRlcm5hdGl2 ZSB0byBhcnJvd3MgdGhhdCBJIHdpbGwgcmVmZXIgdG8gDQogIGhlcmUNCiAg YXMgYSBkYXJ0IChJIGRvbuKAmXQga25vdyBpZiB0aGlzIGhhcyBhIG5hbWUg YWxyZWFkeSkuIFRoaXMgYWxsb3dzIA0KICBmb3INCiAgc3RhdGljIGFuYWx5 c2lzIGxpa2UgYW4gYXJyb3csIGJ1dCBoYXMgYSBzeW50YXggZXZlbiBzaW1w bGVyIA0KICB0aGFuIGENCiAgbW9uYWQuDQoNCiAgPGh0dHBzOi8vcm9zY2lk dXMuY29tL2Jsb2cvYmxvZy8yMDE5LzExLzE0L2NpY2QtcGlwZWxpbmVzLz4N Cg0KDQpVc2Ugb2YgZnVuY3RvcnMgdG8gYXBwcm94aW1hdGUgRiMgc3RhdGlj YWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC91c2Utb2YtZnVuY3RvcnMtdG8tYXBwcm94aW1h dGUtZi1zdGF0aWNhbGx5LXJlc29sdmVkLXR5cGUtcGFyYW1ldGVycy80Nzgy Pg0KDQoNCmNteGEgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEkgYW0gbGVhcm5pbmcgT0NhbWwgY29taW5nIGZyb20gRiMu IEluIEYjLCB0byBjYWxjdWxhdGUgdGhlIA0KICBhdmVyYWdlIG9mDQogIGFu IGFycmF5IHdob3NlIGVsZW1lbnQgdHlwZSBzdXBwb3J0cyBhZGRpdGlvbiBh bmQgZGl2aXNpb24sIG9uZSANCiAgY2FuDQogIHdyaXRlDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBsZXQgaW5saW5lIGF2ZXJhZ2UgKGFycjogJ2Fb XSkgOiAnYQ0KICDilIIgICAgIHdoZW4gXmEgOiAoc3RhdGljIG1lbWJlciBE aXZpZGVCeUludCA6IF5hICogaW50IC0+IF5hKQ0KICDilIIgICAgIGFuZCAg XmEgOiAoc3RhdGljIG1lbWJlciAoKykgOiBeYSAqIF5hIC0+IF5hKQ0KICDi lIIgICAgIGFuZCAgXmEgOiAoc3RhdGljIG1lbWJlciBaZXJvIDogXmEpDQog IOKUgiAgICAgPQ0KICDilIIgICAgIGlmIEFycmF5Lmxlbmd0aCBhcnIgPSAw IHRoZW4gDQogIChMYW5ndWFnZVByaW1pdGl2ZXMuR2VuZXJpY1plcm8pIGVs c2UNCiAg4pSCICAgICBMYW5ndWFnZVByaW1pdGl2ZXMuRGl2aWRlQnlJbnQg KEFycmF5LmZvbGQgKCspIA0KICAoTGFuZ3VhZ2VQcmltaXRpdmVzLkdlbmVy aWNaZXJvKSBhcnIpIChBcnJheS5sZW5ndGggYXJyKQ0KICDilJTilIDilIDi lIDilIANCg0KICBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgaW4gT0NhbWws IG9uZSB3b3VsZCBoYXZlIGEgbW9kdWxlIHR5cGUgDQogIGxpa2UNCiAgc286 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgdHlwZSBBdmVy YWdhYmxlID0gc2lnDQogIOKUgiAgIHR5cGUgJ2EgdA0KICDilIINCiAg4pSC ICAgdmFsIGRpdmlkZV9ieV9pbnQgOiAnYSAtPiBpbnQgLT4gJ2ENCiAg4pSC ICAgdmFsIHBsdXMgOiAnYSAtPiAnYSAtPiAnYQ0KICDilIIgICB2YWwgemVy byA6ICdhDQogIOKUgiBlbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTXkg cXVlc3Rpb24gaXMgaG93IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIHdv dWxkIGJlIHdyaXR0ZW46DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBs ZXQgYXZlcmFnZSBhcnIgPQ0KICDilIIgICA/Pz8NCiAg4pSU4pSA4pSA4pSA 4pSADQoNCg0Kc21vbGthaiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGaXJzdCwgYEF2ZXJh Z2FibGUnIHNob3VsZCBsb29rIGxpa2UgdGhpczoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG1vZHVsZSB0eXBlIEF2ZXJhZ2FibGUgPSBzaWcNCiAg 4pSCICAgdHlwZSB0DQogIOKUgiAgIHZhbCBkaXZpZGVfYnlfaW50IDogdCAt PiBpbnQgLT4gdA0KICDilIIgICB2YWwgcGx1cyA6IHQgLT4gdCAtPiB0DQog IOKUgiAgIHZhbCB6ZXJvIDogdA0KICDilIIgZW5kDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIFRoZW4gYXZlcmFnZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxp a2UgdGhpczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhdmVy YWdlICh0eXBlIHQpIChtb2R1bGUgQSA6IEF2ZXJhZ2FibGUgd2l0aCB0eXBl IHQgPSB0KSANCiAgKGFyciA6IHQgYXJyYXkpIDogdCA9DQogIOKUgiAgIEFy cmF5LmZvbGQgfmluaXQ6QS56ZXJvIH5mOkEucGx1cyBhcnINCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgKFRoZSBjb2RlIGFib3ZlIHVzZXMgSmFuZSBTdHJl ZXTigJlzIEJhc2UvQ29yZSBsaWJyYXJ5LikNCg0KDQppdmcgdGhlbiBhZGRl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2hpbGUgQHNtb2xrYWrigJlzIGFuc3dlciBpcyBhIGNvcnJlY3Qg YW5kIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiANCiAgb2YgeW91cg0KICBGIyBj b2RlLCBpdCBtaWdodCBiZSBuaWNlciBpZiB5b3VyIGNvZGUgY2FuIGludGVy cGxheSB3aXRoIA0KICBleGlzdGluZw0KICBhYnN0cmFjdGlvbnMgaW4gdGhl IE9DYW1sIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG9wZW4gQmFzZQ0KICDilIINCiAg4pSCIGxl dCBhdmVyYWdlICh0eXBlIGEpIChtb2R1bGUgVCA6IEZsb2F0YWJsZS5TIHdp dGggdHlwZSB0ID0gYSkgDQogIHhzID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+ aW5pdDowLiB+ZjooZnVuIHMgeCAtPiBzICsuIFQudG9fZmxvYXQgeCkgeHMg Ly4NCiAg4pSCICAgRmxvYXQub2ZfaW50IChBcnJheS5sZW5ndGggeHMpDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZCBub3cgaXQgY291bGQgYmUgdXNl ZCB3aXRoIGFueSBleGlzdGluZyBudW1lcmljIGRhdGEgaW4gDQogIEJhc2Uv Q29yZQ0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgYXZlcmFnZSAobW9k dWxlIEludCkgW3wxOzI7Mzs0fF07Ow0KICDilIIgLSA6IEJhc2UuRmxvYXQu dCA9IDIuNQ0KICDilJTilIDilIDilIDilIANCg0KICBhbmQgZXZlbiBhZGFw dGVkIHRvIG5vbi1udW1iZXJzLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgbGV0IGF2ZXJhZ2VfbGVuZ3RoID0gYXZlcmFnZSAobW9kdWxlIHN0cnVj dA0KICDilIIgICAgIGluY2x1ZGUgU3RyaW5nDQogIOKUgiAgICAgbGV0IHRv X2Zsb2F0IHggPSBGbG9hdC5vZl9pbnQgKFN0cmluZy5sZW5ndGggeCkNCiAg 4pSCICAgICBsZXQgb2ZfZmxvYXQgXyA9IGFzc2VydCBmYWxzZQ0KICDilIIg ICBlbmQpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBsYXR0ZXIgZXhh bXBsZSBzaG93cyB0aGF0IHdlIHJlcXVlc3RlZCBtb3JlIGludGVyZmFjZSB0 aGFuIA0KICBuZWVkLCBhDQogIGNvc3QgdGhhdCB3ZSBoYXZlIHRvIHBheSBm b3IgdXNpbmcgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbi4gSW4gDQogIGNhc2Vz DQogIHdoZW4gaXQgbWF0dGVycywgeW91IGNhbiBzcGVjaWZ5IHRoZSBzcGVj aWZpYyBpbnRlcmZhY2UsIGUuZy4sDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBtb2R1bGUgdHlwZSBGbG9hdGFibGUgPSBzaWcNCiAg4pSCICAgdHlw ZSB0DQogIOKUgiAgIHZhbCB0b19mbG9hdCA6IHQgLT4gZmxvYXQNCiAg4pSC IGVuZA0KICDilIINCiAg4pSCIGxldCBhdmVyYWdlICh0eXBlIGEpIChtb2R1 bGUgVCA6IEZsb2F0YWJsZSB3aXRoIHR5cGUgdCA9IGEpIHhzIA0KICA9DQog IOKUgiAgIEFycmF5LmZvbGQgfmluaXQ6MC4gfmY6KGZ1biBzIHggLT4gcyAr LiBULnRvX2Zsb2F0IHgpIHhzIC8uDQogIOKUgiAgIEZsb2F0Lm9mX2ludCAo QXJyYXkubGVuZ3RoIHhzKQ0KICDilJTilIDilIDilIDilIANCg0KICBCdXQg d2UgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgdXNpbmcgZmlyc3QgY2xhc3Mg bW9kdWxlcyBpcyANCiAgdG90YWxseQ0KICB1bm5lY2Vzc2FyeS4gT3VyIGlu dGVyZmFjZSBoYXMgb25seSBvbmUgZnVuY3Rpb24sIHNvIHRoZSANCiAgZm9s bG93aW5nDQogIGRlZmluaXRpb24gb2YgYXZlcmFnZSwgaXMgbXVjaCBtb3Jl IG5hdHVyYWwNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhdmVy YWdlIHhzIH5mID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+aW5pdDowLiB+Zjoo ZnVuIHMgeCAtPiBzICsuIGYgeCkgeHMgLy4NCiAg4pSCICAgRmxvYXQub2Zf aW50IChBcnJheS5sZW5ndGggeHMpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IGl0IGhhcyB0eXBlIGAnYSBhcnJheSAtPiBmOignYSAtPiBmbG9hdCkgLT4g ZmxvYXQnIGFuZCBjb21wdXRlcyANCiAgYW4NCiAgYXZlcmFnZSBvZiBgZiB4 X2knIGZvciBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5Lg0KDQoNCk9sZCBD V04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCANCiAgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIA0KICBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgDQogIHN1YnNj cmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRl Y2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHA6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hp dmVzXSANCjxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3Rp bmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= 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 November 26 to Decemb= er 03, 2019.

Irmin 2.0.0 release

Continuing this thread, samoht announced

And there is now a follow-up blog post, explaining how to use the new Graph= QL API available in Irmin2: https://tarides.com/blog/2019-11-27-introducing-= irmin-graphql.

How viable is delivering binaries linked to Cygwin to Windows = customers?

mbacarella asked

I=E2=80=99m in the early stages of planning a deliverable binary product th= at will run on Linux, Mac and Windows.

My brief sniff of the air around the OCaml ecosystem says I should expect t= o target Cygwin to get Windows going (although there=E2=80=99s impressive w= ork to get native Windows stuff done that can become the preferred approach= in a few years).

My experience using Cygwin as an operating environment is that it=E2=80=99s= pretty darn sluggish compared to Linux on the same computer.

Why is this? There=E2=80=99s an anecdote that says Cygwin can only fork at = about 30-50x a second on Windows, due to how it has to adapt it to work wit= hin Windows=E2=80=99 task spawning model. (For contrast, Linux can achieve = thousands of forks per second if you play around with it).

I understand from another product developer that when they build binaries t= o deliver to Windows/Cygwin, they actually cross-compile on Linux because o= f how slowly the toolchain runs on Cygwin.

That sounds like bad news if you want to do UNIXy things, but for a single = standalone application this might not be so bad? I assume if I ship a deliv= erable to Windows/Cygwin, the end user may enjoy good performance, so long = as I=E2=80=99m not spawning tons of processes or relying on fork for multi-= programming. Is this a safe assumptions?

Any other gotchas when it comes to OCaml on Cygwin w.r.t. performance?

The app pretty much has real-time gaming requirements (though it=E2=80=99s = not a game so can side-step worrying about access to GPUs and what-not). St= ated another way, although my application will depend on the POSIX layer of= fered by Cygwin, I expect it not to crunch POSIX related stuff in the main = loop.

How has your experience gone?

John Whitington replied

I have been shipping commercial binaries for Linux (32 and 64 bit), Windows= (32 and 64bit) and OS X for years. For example: https://githu= b.com/coherentgraphics/cpdf-binaries

And even static or shared libraries in binary form: https://gith= ub.com/coherentgraphics/cpdflib-binary

On OS X, you need to use MACOSX_DEPLOYMENT_TARGET or similar to make sure y= our builds will run on older systems. And, in fact, you need to use MACOSX_= DEPLOYMENT_TARGET when asking OPAM to compile the OCaml compiler itself. An= d, you will need to deal with codesigning and notarization. But it=E2=80=99= s all doable.

For linux, you may need to build under older linux versions, to make sure t= hat the glibc in use is old enough. This is not an ocaml-specific problem. = I have a 64 bit and 32 bit VM with old-ish glibc versions for this purpose.

Under Windows, there are no such backward-compatibility problems. I use the= new OCaml for windows system, which comes with OPAM, and is mingw-based. N= o cygwin remains in the final binary.

For more obscure systems (AIX, HPUX, Sparc etc) customers compile from sour= ce (with help from me). Not once in more than ten years has anyone cared that = it was written in OCaml.

dbuenzli also replied

remember that on the Windows native port, the Unix module distributed with = OCaml is your POSIX compatibility layer. There are a few entry points to av= oid though, the list is at the bottom of this page.

nojb also replied

At LexiFi our main application is developed and shipped on Windows. We use = the msvc port of OCaml. This means that you need Cygwin to develop, but the= resulting application is fully native and does not depend on the Cygwin DL= L. As @dbuenzli mentioned, the Unix module is the POSIX compatibilit= y layer.

Compilation speed is slower on Windows because process creation is slower o= n Windows as a general rule, but it is manageable (our application has arou= nd 2000 modules + Js_of_ocaml + C bindings + C# component).

We don=E2=80=99t have any issues with runtime performance. The Unix library mentioned above implements Windows support directly without g= oing through any compatibility layer and is quite efficient.

BikalGurung also replied

There is an editor being built in ocaml/reasonml which currently targets wi= ndows, linux and macos - https:/= /github.com/onivim/oni2. However, the binary is native windows rather t= han cygwin derivative. So if you don=E2=80=99t have to use cygwin dependenc= ies then native windows binary could be the way to go.

Also esy - https://github.com/esy/es= y makes developing ocaml/reasonml on windows viable.

keleshev also replied

TLDR: Install the Mingw port of OCaml 4, freely use most opam libraries, and co= mpile to native Windows binaries, without licensing issues.

I recommend you read the =E2=80=9CRelease notes for Windows=E2=80=9D: htt= ps://github.com/ocaml/ocaml/blob/trunk/README.win32.adoc

To summarise, there are three Windows ports:

  • Native Microsoft port,
  • Native Mingw port,
  • Cygwin port.

All three require Cygwin for development purposes. I recommend using the Na= tive Mingw, as:

To contrast, Native Microsoft requires Visual Studio, and doesn=E2=80=99t h= ave opam. You can still vendor pure OCaml packages, but as soon as you want= to use some C bindings you=E2=80=99re in trouble, because of the =E2=80=9C= minor=E2=80=9D differences between Visual C and GCC. And everything assumes= GCC nowadays.

Cygwin port is the one I don=E2=80=99t have experience with, but re-reading= the =E2=80=9CRelease notes for Windows=E2=80=9D above it strikes me that i= t mentions that Cygwin was re-licensed from GPL to LGPL with static linking= exception. So it looks like the Cygwin port could be viable for commercial= use, but I never tried to statically linked cygwin.dll, and I= =E2=80=99m not sure what are the benefits of Cygwin port over the Mingw por= t.

dmbaturin also replied

With soupault 4, I decided = to ship prebuilt binaries for all platforms including Windows. Mostly to se= e if I can, all its users I know of are on UNIX-like systems and know how t= o build from source, but that=E2=80=99s beside the point. :wink:

I can confirm everything @keleshev says: fdopen=E2=80=99s package just work= s, opam works exactly like it does on UNIX, pure OCaml libraries are trivia= l to install, and the binaries don=E2=80=99t depend on cygwin. Note that =E2=80=9Copam switch create=E2=80=9D also just works, you can ins= tall either MinGW or MSVC compiler versions as opam switches. I only ever start the Windows VM to make release builds, and the workflow i= s exactly the same as on Linux where I=E2=80=99m actually writing code.

My only obstacle on that path was that FileUtils lost its Windows compatibi= lity, but I wanted to use it, so I worked with @gildor478 to make it cross-= platform again. Uncovered a bug in the implementation of Unix.utimes in the= process, but it=E2=80=99s hardly a commonly used function.

You can also setup AppVeyor builds. It=E2=80=99s not as simple as I wish it= would be, but there are projects doing it that you can steal the setup fro= m.

There=E2=80=99s also opam-cross-windows, but it=E2=80=99s very incomplete a= nd needs work to be practical. There are no big obstacles, it just needs wo= rk. While files in opam-repository-mingw are normally identical to the defa= ult opam repository, the cross one needs small adjustments in every package= to specify the toolchain to use, so the required work is mostly a lot of t= rivial but manual actions. I hope eventually it reaches parity with fdopen= =E2=80=99s one and we=E2=80=99ll be able to easily build for Windows withou= t ever touching Windows.

As of static Linux builds, @JohnWhitington=E2=80=99s approach can work, but= there=E2=80=99s a better option if you don=E2=80=99t need anything from gl= ibc specifically and don=E2=80=99t link against any C libs: build staticall= y with musl. There=E2=80=99s a +musl+static+flambda compiler f= lavour. You need musl and gcc-musl to install it, but after that, just buil= d with -ccopt -static flag and you get a binary that doesn=E2= =80=99t depend on anything.

Dune 2.0.0

rgrinberg announced

On behalf of the dune team, I=E2=80=99m delighted to announce the release o= f dune 2.0. This release is the culmination of 4 months of hard work by the= dune team and contains new features, bug fixes, and performance improvemen= ts . Here=E2=80=99s a selection of new features that I personally find inte= resting:

  • New boostrap procedure that works in low memory environments
  • (deprecated_library_name ..) stanza to properly deprecate = old library names
  • (foreign_library ..) stanza to define C/C++ libraries.
  • C stubs directly in OCaml executables

Refer to the change log for an exhaustive list.

We strive for a good out of the box experience that requires no configurati= on, so we=E2=80=99ve also tweaked a few defaults. In particular, $ du= ne build will now build @all instead of @install<= /code>, and ocamlformat rules are setup by default.

Lastly, dune 2.0 sheds all the legacy related to jbuilder and will no longe= r build jbuilder projects. This change is necessary to ease maintenance and= make it easier to add new features down the line. There are a few other mi= nor breaking changes. Refer to the change log for the full list. We apologi= ze in advance for any convenience this might cause.

Changelog

Advanced C binding using ocaml-ctypes and dune

toots announced

I worked on a socket.h binding last summer and had a great experience integ= rating ocaml-ctypes with dune, I thought that might be of interest to other= developers so I wrote about it: https://me= dium.com/@romain.beauxis/advanced-c-binding-using-ocaml-ctypes-and-dune-cc3= f4cbab302

rgrinberg replied

This is a good article. I encourage anyone who writes C bindings with ctype= s to study it carefully.

A little bit of advice to shorten your dune files:

(deps    (:gen ./gen_constants_c.exe))

This line isn=E2=80=99t necessary. Dune is smart enough to know that runnin= g a binary in a rule incurs a dependency on it.

dune has a truly amazing support for cross-compiling, which we do not cov= er here, but, unfortunately, its primitives for building and executing bina= ries do not yet cover this use case.

Indeed, we don=E2=80=99t have any primitives for running binaries on the ta= rget platform. Perhaps we should add some. However, we do in fact have some= features in dune to solve this concrete cross compilation problem. As far = as I understand, the goal is to obtain some compile time values such as #de= fine constants and field offsets for the target platform. This does not in = fact require to run anything on the cross compilation target. In configurat= or, we have a primitive C_define.import to extract this inform= ation. The end result is that these configurator scripts are completely com= patible with cross compilation.

Perhaps this could be generalized to work with ctypes generators as well?

Funny bit of trivia: The hack in configurator required to do this is in fac= t something I extracted from ctypes itself. The original author is whitequark, who in turn wrote it to = make ctypes itself amendable to cross compilation.

emillon then added

This does not in fact require to run anything on the cross compilation targ= et. In configurator, we have a primitive C_define.import to ex= tract this information. The end result is that these configurator scripts a= re completely compatible with cross compilation.

If anybody wants to know more about this bit, I wrote an article about this= last year: https://dune.bu= ild/blog/configurator-constants/

Upcoming breaking change in Base/Core v0.14

bcc32 announced

We=E2=80=99re changing functions in Base that used to use the polymorphic variant type [ `Fst of 'a | `Snd of 'b ] to use ('a, 'b)= Either.t instead. As well as enabling the use of all of the functions in the Either module, this makes the functions consistent with other functions that already use Either.t, (currently just Set.symmetric_diff)

The following functions=E2=80=99 types will change:

  • Result.ok_fst
  • List.partition_map
  • Map.partition_map, Map.partition_mapi
  • Hashtbl.partition_map, Hashtbl.partition_mapi=

The type of List.partition3_map will not change:

val partition3_map
  :  'a t
  -> f:('a -> [ `Fst of 'b | `Snd of 'c | `Trd of 'd ])
  -> 'b t * 'c t * 'd t

We don=E2=80=99t have a generic ternary variant, and it doesn=E2=80=99t see= m worth it to mint one just for this purpose.

Since this change is pretty straightforward, we expect that a simple find/r= eplace will be sufficient to update any affected call sites.

CI/CD Pipelines: Monad, Arrow or Dart?

Thomas Leonard announced

In this post I describe three approaches to building a language for writing= CI/CD pipelines. My first attempt used a monad, but this prevented static = analysis of the pipelines. I then tried using an arrow, but found the synta= x very difficult to use. Finally, I ended up using a light-weight alternati= ve to arrows that I will refer to here as a dart (I don=E2=80=99t know if t= his has a name already). This allows for static analysis like an arrow, but= has a syntax even simpler than a monad.

https= ://roscidus.com/blog/blog/2019/11/14/cicd-pipelines/

Use of functors to approximate F# statically resolved type par= ameters

cmxa asked

I am learning OCaml coming from F#. In F#, to calculate the average of an a= rray whose element type supports addition and division, one can write

let inline average (arr: 'a[]) : 'a
    when ^a : (static member DivideByInt : ^a * int -> ^a)
    and  ^a : (static member (+) : ^a * ^a -> ^a)
    and  ^a : (static member Zero : ^a)
    =3D
    if Array.length arr =3D 0 then (LanguagePrimitives.GenericZero) else
    LanguagePrimitives.DivideByInt (Array.fold (+) (LanguagePrimitives.Gene=
ricZero) arr) (Array.length arr)

My understanding is that in OCaml, one would have a module type like so:

module type Averagable =
=3D sig
  type 'a t

  val divide_by_int : 'a -> int -> 'a
  val plus : 'a -> 'a -> 'a
  val zero : 'a
end

My question is how the corresponding function would be written:

let average arr =3D
  ???

smolkaj replied

First, Averagable should look like this:

module type Averagable =
=3D sig
  type t
  val divide_by_int : t -> int -> t
  val plus : t -> t -> t
  val zero : t
end

Then average will look something like this:

let average (type t) =
(module A : Averagable with type t =3D t) (arr : t array) : t =3D
  Array.fold ~init:A.zero ~f:A.plus arr

(The code above uses Jane Street=E2=80=99s Base/Core library.)

ivg then added

While @smolkaj=E2=80=99s answer is a correct and direct implementation of y= our F# code, it might be nicer if your code can interplay with existing abs= tractions in the OCaml infrastructure. For example,

open Base

let average (type a) (module T : Floatable.S with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

and now it could be used with any existing numeric data in Base/Core

average (modul=
e Int) [|1;2;3;4|];;
- : Base.Float.t =3D 2.5

and even adapted to non-numbers,

let average_length =3D a=
verage (module struct
    include String
    let to_float x =3D Float.of_int (String.length x)
    let of_float _ =3D assert false
  end)

The latter example shows that we requested more interface than need, a cost= that we have to pay for using an existing definition. In cases when it mat= ters, you can specify the specific interface, e.g.,

module type Floatable =
=3D sig
  type t
  val to_float : t -> float
end

let average (type a) (module T : Floatable with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

But we reached the point where using first class modules is totally unneces= sary. Our interface has only one function, so the following definition of a= verage, is much more natural

let average xs ~f =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. f x) xs /.
  Float.of_int (Array.length xs)

it has type 'a array -> f:('a -> float) -> float and = computes an average of f x_i for all elements in the array.

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.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3mgnwACgkQBA0KO07S 5cf5fwf+OCEPaFcQMlEOtzuErgqjV/oabUhQIJqA3Yq7Kih3ehj3RGYDkUpZj6+T xWTHVEIRrH5zpyE851nzkwHPqMEkP1AyQYu24mtgwKTcfQgbNVJUMUB8vjtGA+Fc aW+XeC0IeTn3dv1lluGuR4w/4wkYjIxGAmsF+iXH2rEmvUzpM7+G8MjK98CM6W5e 9upIsJFmkr7LvAntKafU9bKxNfki8K8JdWlV9rJIoTwNhdx2oQYxAz+KVUagX1SW Yvoe8Kq1NAzFl0dWW91JM6O/dVpRvEo6WF/HBMePZuRbkySAzTJUascbJarxqHcn O4nLgjkzwmdfPZgsc6Q3MfVNWRNKfw== =a7+2 -----END PGP SIGNATURE----- --===-=-=--