From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=bHhhgEfT; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=bZh/v/DP; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B774148E3C for ; Tue, 14 Jan 2025 08:20:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=bZDjrBGKLXDt6HUw2BIWoG+YblnmMVbD73OALBRg0rc=; b=bHhhgEfTlStv4zGmzaKDPyh9RDjB1prJaYXcla2h0dE31ANTg/jy1ENS 7j0+wtzM/YCZBs8gUDKdOqidt59j3mkYdPS2NMykgFIjeg4rIm7Oytge6 fY8HYppRYhaXdW2qPVurIFVxEsVBbpMea/7kpIcwR0xuJHsr70dyhwaBF A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,313,1728943200"; d="scan'208,217";a="202950421" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Jan 2025 09:20:59 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6D796E007A; Tue, 14 Jan 2025 09:20:57 +0100 (CET) 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 55912E00A5 for ; Tue, 14 Jan 2025 09:20:52 +0100 (CET) IronPort-SDR: 67861e63_AriMpAGXUQ5LPGpK0BT0UiVqwAEfZ9xR2dPkQkhxrbzzfJ4 4OwQWXVBtqrinldm0I9cxeRuUz8BlWEwWwlTDsQ== X-IPAS-Result: =?us-ascii?q?A0FMBgB1HYZngSIeaIFaEwEBgkcCgT+BAxkBY1ozBwhIQ?= =?us-ascii?q?x6DOTyDT44fgRaQN4p4gVaBJQMYFiMUAQMBDS4BDgQBAgQBAQMBAgGCDIIuQ?= =?us-ascii?q?AQCGIpfAh8GAQQwCQ4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECE?= =?us-ascii?q?AEBPQVJhXsNSQEBBAsBgWpRcV4HCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECCAQBJxBZDgEIBAYTAQE4GCMDFAEGAwIED?= =?us-ascii?q?QE1AwETARIagmiCH0UDBQwGlm2bOxB6fzOBAYIMAQEGgQg+AwsCAgMYJQHaB?= =?us-ascii?q?oFkCYFIhWuCSRoBKkhqAoRIhDwnD4FVRIEVNYFWHUoHb4FQbwsXAQEBAYE8A?= =?us-ascii?q?QFNgy6CaYI3RAMEeoEwVF6BDIFshGgSVII7gR+BPR0dL0aBD1aBL4FbgwyId?= =?us-ascii?q?oFHSzMsAVUTFwsHBWGBEgMtNjGBTHs5gg1pSzcCDQI1gh4kWIIrgx+BP4RHh?= =?us-ascii?q?FOFYoIUghGEFB1AAwttPTcUG5t5AQk1NgE8gnYvDgsUGQYCLB8OBxoTARsIB?= =?us-ascii?q?gEBCRcCLgg0BQoFMAEOCQMaGhMLKw8DklERFyqPR44SlF00B4QegV0GDIkFg?= =?us-ascii?q?SSOLYdOhARNgQqLL4cAkSmBICKYWiKCNoclgSUJgW8eTJVQAxMDhUCBZzqBX?= =?us-ascii?q?DMaMEOCMwEBMgkJATwcD1eNIQEzARaDWIE+gSaBPDk7t1tCNQIBAQcxAgcBC?= =?us-ascii?q?gEBAwmFYgEBgwSCF4RjgUsBAQ?= IronPort-PHdr: A9a23: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 8NS5iw= IronPort-Data: A9a23:qrMOV6IXrheCq8ZUFE+RfJElxSXFcZb7ZxGr2PjKsXjdYENS3zUOy mocC2qGbvqCYmqkfN1/PIXj80gAvp6Gy4RlHlQd+CA2RRqmi+KVXIXDdh+Y0wC6d5CYEho/t 63yTvGacajYm1eF/k/F3oDJ9CU6j+fSLlbFILasEjhrQgN5QzsWhxtmmuoo6qZlmtHR7zml4 LsemOWBfgb/s9JIGjhMsf/b8Uoz5K2aVA4w5zTSW9gb5DcyqFFOVPrzFYnpR1PkT49dGPKNR uqr5NlVKUuEl/uFIorNfofTKiXmcJaKVeS9oiY+t5yZv/R3jndaPpDXmxYrQRw/Zz2hx7idw TjW3HC6YV9B0qbkwIzxX/TEes3X0GIvFLLveBCCXcKvI0LuNGXx09ZEL3kNE7YS1csuCkoW9 9ADAWVYBvyDr7reLLOTT/k1wNwkKNj3MYgfvHB50DyfCuwpKXzBa/yQtJkBhGt23ZgIRqq2i 8kxMVKDaDz7WSYXb10eVLRrocj9nn77YiFVo1KTpLMq7i7U1gMk2bzkNpzOcdyPRNlJtkyfu 2TN8n+/B00KctuFxlJp91r23rWewHugCN96+LuQ/dpUpFSN3m0pEUc2agWrgNakrnCTYocKQ 6AT0nFz8fZpqxTDosPGdxaxpXrBuh8HR/JLAugi4UeMzLDV6kCXHAA5oiVpbcx/8tcxQS022 1SJmdLwGDEpt6eaIZ6AyluKhXSsJDg2B0w6XgE/RyQoutLI+IMflTuaG76PD5WJptHyHDjxx RWDoy4/m6gfgKY3O0OTpg6vb9WE/cihc+Il2jg7SF5J+StXXuaYi2GA7EiCq+5HKJeFQ1KBu nkdhsXY6/oBZX1sqMBvaLtWdF1Kz6/bWNE5vbKJN8N9n9hK0yTzFb28GBkkeC9U3j8sIFcFm nP7twJL/4N0N3C3d6JxaI/ZI511lva/RI+8DKmFP4Mmjn1NmOmvoHEGiam4gz6FraTQufpX1 WqzL5vxVihy5VpPlmLoGo/xLoPHNghlmD+NHs+jp/hW+beVY3qYAa8CNEqSY+s56qKdvQid/ s5EPNPi9vmseLCWX8UjyqZKdQpiBSFiXfje8pUHHtNv1yI8SQnN/deLkOt5I+SIXs19yo/1w 51KchQCmAOi1Sadd17ih7IKQOqHYKuTZEkTZUQEVWtEEVB6CWp2xPZOL8kEbvM8+fZ9zPV5a fAAdo/SSr5MUznLsXBVJ5X0sIUoJlzhiBOsLhiVRmE1X6dhYAjVpf7iXA/krxcVAgSN6MARn ryH1yHge6QleThMNsjsVa+Q/wuDhkRFwONWdGnUE+ZXY3TpodRLKTSur/oZIPMsCBTkxxmb3 V2oHCZCm/vpptdt/fKUm6uBpIaNOMl9F3p8AGP0w+uXNy7b32z72q5Gcr+CUg78XVPO2peJR Ltq3dClF9Nfh3dMkY53M4gz/JIE/9G1+oNrlFV1LkvEf3GAK+1GIEDf+eJtq6cU5LtSmTXua 3K14tMAZIm4YpL0ImUwejggQP+Ij8wPuz/o6v8wHkX2yQl38JeDUmRQJxO8szNcHpQkLLIax fodh+BO5zydkhYKNvO0vhJQ/UmILV0CVPwDnbMeC4nJlAEq6w9jZbrxNyzI26yMOu58ahQSH jyphaT5l+t9wGjGeCENDnTj57dWqqkPnxFo92U8AWq1tODLvdIN5y0Jww8LFlxU6j5lz9NMP nNaMhwpBKeWoBZtqstxf0GtPABjGxfD6hH95GULnUKEV0KYaGjpKTwsC/es52EcyXpXJRJAz YGbyUHkcDfkR97w1S0MQnxYq+TvYNhy1w/akuWlIpi1JIY7aj/bnaOeX2oEhB/5C8cXhkech +1V0MtvSK/8bwg8nrYaDtSE6LEuVxy0HmxObvV/9qcvH2uHWjWT2yCLGn+haPF2OP3G3k+pO fNAfvsVeUyF6x+PiTQHCYonAbx+xqcp7eVfXILbHzcNtr/Howd5tJ7VyDPFu1YqZNdTiuc4F JLacmOTM26XhEYMoVT3kut/BjOab+UHNSrG58Lk1MUSFpkGjvNgTlFq7JuwoEeuEVVG+zC6g Vr9QpH4ns1Y9JRUvorzE698KR2+BvHtWc+prg2ikdR8QuneEMXJtgklpUnDOS5IN5sVA+ZIs 7OHtdrn0Hz4obxtcWb4moaAJYZN986dTOpaCeOpDXh4zA+pet7g3AsHwE+8cad2qdJ64tK1Y ieFc+6ySIIlYMhcz3hrdCRuKRYRJKDpZKPGpynmjfCzJjUC8A7AdvWLyGTIaDxFSyo2JJHOM A/4lPKw7NR+ro4XJhslBeljMqBoMm3YRqoqWN3ghwa2VlDyrAu5hYLjsh485RXgKHqOSp/66 K2YYCnOTk25vaWQwexJt4B3gAYsM098pusNZWMYxc99jmGrLWwBLNlFC648NLNvrnXQ2q37N Rb3V0lzORWlCH4AOV/57c/4VwiSOv0WN52rbnY19keTcGGtCJnGHLJl8Tx67mxrfif4ituqM swa5ma6Ky3ZLkuFngrPzqfTbSZbKvLmKrYg/FCk1dT1BwcCDL4K0n14AQcLUjbIey0IvFueP nA7HAioX2niIXMd0+45E5KWJP3dlDno0jMjYDzJxYrP/YKBw4WsDdXhbvrr3ORrgNsifdYzq LCee4dJy3iR3m0PtKApvdMwnKIyDuiEdiR/wGkPWiVK95yNBq8b0w/uUMbBoAzOOOKSLr8Fq gSR3g== IronPort-HdrOrdr: A9a23:8DDaKa9+lALNGXkRdQBuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:q1EGmW4fFDFfUawoOtsss1AJCuMPUUXm4kzaDGLhAk0xSpGOYArF X-Talos-MUID: 9a23:1XkRZwXIXn05w6Xq/DTIuhVrKt9p2b30KH9TgbQppu26GBUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,313,1728943200"; d="scan'208,217";a="202950385" X-MGA-submission: =?us-ascii?q?MDG555WEzMhyEUytvH59WDAWgd8Sb50kulcyD9?= =?us-ascii?q?0cUj7IJ5IU3v4z9/3tarCQh9XHoUH6RsJil/gqCR8wgj80dC+2bv/Np3?= =?us-ascii?q?TzKlZcHG1nmm7zln3qa6HPTFo/MXECqCSaiQjG+oq3eIuy533r/t1Mf/?= =?us-ascii?q?KIXKNeVFjjodSEdY+i6Jng4g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jan 2025 09:20:51 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (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 F31B4564A7F; Tue, 14 Jan 2025 09:20:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1736842850; bh=s4LWiLhHRR2Wgl+SMt34BM9YS3xwEbMWUbmcBkyYjfo=; h=From:To:Subject:Date:Message-ID; b=bZh/v/DPsQfJWxba+5Kfg/AXITN0vq+zfwQP5fkdguqzFA5rzSf6eAGwMoOgqMkqi qVDuq5tDb2UVwly1gLsObWfBbrLZxcFCCe4vkjlo+gMSX49bL1dwLYM5ZaTEnC/Ppg 5OvxfeYc/DTWTZTboTFUYKVPzYwbAmLg0BGG7W48= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Jan 2025 09:20:49 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 14 09:20:50 2025 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.335493, queueID=345B8564A81 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: 19251 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 ZWsgb2YgSmFudWFyeSAwNyB0byAxNCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KT24gY29u Y3VycmVuY3kgbW9kZWxzDQpPQ2FtbCA1LjMuMCByZWxlYXNlZA0KZHJlYW0taHRtbCBhbmQgcHVy ZS1odG1sIDMuOS41DQpCdWlsZGluZyBhbiBPQ2FtbCBjcm9zcyBjb21waWxlciB3aXRoIE9DYW1s IDUuMw0KUHB4IGRlcml2aW5nIGRlY29kZXJzDQpPcnRhYyAwLjUuMCB0ZXN0aW5nIGhpZ2hlciBv cmRlciBmdW5jdGlvbnMNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpPbiBjb25jdXJy ZW5jeSBtb2RlbHMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb24tY29uY3VycmVuY3ktbW9kZWxzLzE1ODk5LzI0Pg0KDQoNCkRlZXAgaW4gdGhpcyB0 aHJlYWQsIENhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBGb3IgdGhvc2UgaW50ZXJlc3RlZCwgd2UndmUgc3BlbnQg c29tZSB0aW1lIHdyaXRpbmcgW2EgYm9va10gb24gaG93IHRvDQogIHVzZSBNaW91IGFuZCBhc3lu Y2hyb25vdXMgcHJvZ3JhbW1pbmcgd2l0aCBNaW91IOKAlCBiYXNpY2FsbHksIGl0DQogIGludHJv ZHVjZXMgTWlvdSdzIGRlc2lnbi4gSW4gYWRkaXRpb24sIHJlc291cmNlcyB0aGF0IG1heSBiZSBv Zg0KICBpbnRlcmVzdCBhcmU6DQogIOKAoiBbYSByZXRyb3NwZWN0aXZlXSBvZiBhIGhhbmRoZWxk IHNjaGVkdWxlciBpbXBsZW1lbnRhdGlvbiBjb21wYXJlZCB0bw0KICAgIHdoYXQgTWlvdSBvZmZl cnMNCiAg4oCiIFthIG1hbmlmZXN0b10gdGhhdCBzYXlzIHRoZSBzYW1lIHRoaW5nIGFzIHdoYXQg SSBzYWlkIGFib3ZlDQoNCiAgQSBuZXh0IHJlbGVhc2Ugb2YgTWlvdSBpcyBpbiBwcmVwYXJhdGlv biBhbmQgYWRkaXRpb25zIHRvIHRoaXMg4oCYbGl0dGxlDQogIGJvb2vigJkgd2lsbCBiZSBtYWRl LiBJbiBwYXJ0aWN1bGFyLCB0aGVyZSB3aWxsIGJlIGFuIGV4cGxhbmF0aW9uIG9mIGhvdw0KICB3 ZSBpbXBsZW1lbnRlZCBbaGFwcHktZXllYmFsbHNdLCB3aGljaCByZW1haW5zIGEgZ29vZCBleGFt cGxlLg0KDQoNClthIGJvb2tdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvaW50 cm9kdWN0aW9uLmh0bWw+DQoNClthIHJldHJvc3BlY3RpdmVdIDxodHRwczovL3JvYnVyLWNvb3Au Z2l0aHViLmlvL21pb3UvcmV0cm9zcGVjdGl2ZS5odG1sPg0KDQpbYSBtYW5pZmVzdG9dIDxodHRw czovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvbWFuaWZlc3RvLmh0bWw+DQoNCltoYXBweS1l eWViYWxsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2hhcHB5LWV5ZWJhbGxzPg0K DQoNCk9DYW1sIDUuMy4wIHJlbGVhc2VkDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMy0wLXJlbGVhc2VkLzE1OTE2LzE+DQoNCg0Kb2N0YWNo cm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgaGF2ZSB0aGUgcGxlYXN1cmUgb2YgYW5ub3VuY2luZyB0 aGUgcmVsZWFzZSBvZiBPQ2FtbCB2ZXJzaW9uDQogIDUuMy4wLiBkZWRpY2F0ZWQgdG8gdGhlIG1l bW9yeSBvZiBKb2huIFdpbGxpYW0gTWF1Y2hseSBhbmQgUGF1bA0KICBWZXJsYWluZSBvbiB0aGUg YW5uaXZlcnNhcnkgb2YgdGhlaXIgZGVhdGguDQoNCiAgICAgICAgRGUgbGEgbXVzaXF1ZSBhdmFu dCB0b3V0ZSBjaG9zZSwNCiAgICAgICAgRXQgcG91ciBjZWxhIHByw6lmw6hyZSBs4oCZSW1wYWly DQoNCiAgICAgICAgKE11c2ljIGZpcnN0IGFuZCBmb3JlbW9zdCBvZiBhbGwhDQogICAgICAgIENo b29zZSB5b3VyIG1lYXN1cmUgb2Ygb2RkIG5vdCBldmVuKQ0KDQogIFNvbWUgb2YgdGhlIGhpZ2hs aWdodHMgaW4gT0NhbWwgNS4zLjAgYXJlOg0KDQogIOKAoiBTeW50YXggZm9yIGRlZXAgZWZmZWN0 IGhhbmRsZXJzDQoNCiAgICBUaGVyZSBpcyBub3cgYSBkZWRpY2F0ZWQgc3ludGF4IGZvciBpbnN0 YWxsaW5nIGRlZXAgZWZmZWN0IGhhbmRsZXINCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIg bWF0Y2ggZiAoKSB3aXRoDQogICAg4pSCIHwgeCAtPiB4DQogICAg4pSCIHwgZWZmZWN0IFJhbmRv bV9mbG9hdCwgayAtPiBFZmZlY3QuRGVlcC5jb250aW51ZSBrIChSYW5kb20uZmxvYXQgMS4wKQ0K ICAgIOKUlOKUgOKUgOKUgOKUgA0KICAgIFRoaXMgbmV3IHN5bnRheCBhZGRzIGEgbmV3IGBlZmZl Y3QnIGtleXdvcmQsIHdoaWNoIG1heSBicmVhaw0KICAgIGV4aXN0aW5nIGNvZGUuICBUbyBpbXBy b3ZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgbmV3IGtleXdvcmQNCiAgICBjYW4gYmUg ZGlzYWJsZWQgd2l0aCB0aGUgbmV3IGAta2V5d29yZHMnIGZsYWdzIGlmIG5lZWRlZCBmb3INCiAg ICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Lg0KDQogIOKAoiBSZXN0b3JlZCBNU1ZDIHBvcnQNCg0K ICAgIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgdGhlIE1TVkMgdG9vbGNoYWluIG9uIFdpbmRv d3MsIHJlc3RvcmluZw0KICAgIHRoZSBsYXN0IG1pc3NpbmcgcG9ydCBmcm9tIE9DYW1sIDQgKGV4 Y2VwdCBmb3IgdGhlIG5hdGl2ZSBjb21waWxlcg0KICAgIHN1cHBvcnQgZm9yIDMyLWJpdCBhcmNo aXRlY3R1cmVzIHdoaWNoIGlzIG5vdCBwbGFubmVkKQ0KDQogIOKAoiBSZS1pbnRyb2R1Y2VkIHN0 YXRpc3RpY2FsIG1lbW9yeSBwcm9maWxpbmcgKHN0YXRtZW1wcm9mKQ0KDQogICAgVGhlIHN1Ym1v ZHVsZSBgR2MubWVtcHJvZicgaXMgcmVzdG9yZWQgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudA0K ICAgIEFQSS4gVGhpcyBzdWJtb2R1bGUgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBtZW1vcnkgYWxs b2NhdGlvbg0KICAgIHN0YXRpc3RpY3MgaW5zaWRlIGEgcHJvZ3JhbS4gSW4gT0NhbWwgNSwgZWFj aCBkb21haW4gY2FuIGJlDQogICAgbW9uaXRvcmVkIGluZGVwZW5kZW50bHkgd2hpbGUgY2hpbGQg ZG9tYWlucyBpbmhlcml0IHRoZSBwYXJlbnQNCiAgICBkb21haW4gcHJvZmlsaW5nIHByb2ZpbGUg KGlmIHRoZXJlIGlzIG9uZSBhY3RpdmUpLg0KDQogIOKAoiB1dGYtOCBlbmNvZGVkIFVuaWNvZGUg c291cmNlIGZpbGVzIGFuZCBtb2Rlc3Qgc3VwcG9ydCBvZiBVbmljb2RlDQogICAgaWRlbnRpZmll cnMNCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgdHlwZSBzYWlzb24gPSBIaXZlciB8IMOJ dMOpIHwgUHJpbnRlbXBzIHwgQXV0b21uZSANCiAgICDilJTilIDilIDilIDilIANCiAgICBUaGUg T0NhbWwgbGV4ZXIgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBhIG1vZGVzdCBzdWJzZXQg b2YNCiAgICBVbmljb2RlIGNoYXJhY3RlcnMgaW4gaWRlbnRpZmllcnMuIFRoaXMgaXMgbW9zdGx5 IGludGVuZGVkIGZvcg0KICAgIHBlZGFnb2dpY2FsIHVzZS4gVGhpcyBleHRlbmRlZCBzdXBwb3J0 IHJlcXVpcmVzIHNvdXJjZSBmaWxlcyB0byBiZQ0KICAgIHV0Zi04IGVuY29kZWQgVW5pY29kZSB0 ZXh0Lg0KDQogIOKAoiBNb3JlIHNwYWNlLWVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBEeW5h cnJheQ0KDQogICAgVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGBEeW5hcnJheScgbm93 IHVzZXMgYW4gdW5ib3hlZA0KICAgIHJlcHJlc2VudGF0aW9uIHdoaWNoIGF2b2lkcyB0aGUgbmVl ZCBvZiBzdG9yaW5nIGl0ZW1zIHdyYXBwZWQgaW4gYQ0KICAgIGBTb21lIHgnIGJsb2NrIGFuZCB0 aHVzIHNhdmUgc29tZSBzcGFjZXMgYW5kIGluZGlyZWN0aW9ucy4NCg0KICDigKIgSW1wcm92ZWQg bWV0YWRhdGEgb24gdGhlIHBhaXJzIG9mIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9y DQogICAgbWVybGluLg0KDQogICAgVGhlIG1ldGFkYXRhIHN0b3JlZCBpbnNpZGUgY210IGZpbGVz IGhhcyBiZWVuIGltcHJvdmVkIHRvIGJldHRlcg0KICAgIGRpc3Rpbmd1aXNoIHRoZSBwcm92ZW5h bmNlIG9mIGlkZW50aWZpZXJzIChwcmV2aW91cyB2ZXJzaW9ucyBjb3VsZA0KICAgIGNvbmZ1c2Ug YW4gaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiBpZGVudGlmaWVyKS4gIFNpbWlsYXJseSwg dGhlDQogICAgbWV0YWRhdGEgbm93IHRyYWNrcyBtb3JlIHByZWNpc2VseSB0aGUgYXNzb2NpYXRp b24gYmV0d2Vlbg0KICAgIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMuIEZvciBpbnN0YW5j ZSwgaW4NCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgbW9kdWxlIFggPSBzdHJ1Y3QgbGV0 IHggPSAwIGVuZA0KICAgIOKUgiBtb2R1bGUgTTogc2lnDQogICAg4pSCICAgdmFsIHg6IGludA0K ICAgIOKUgiBlbmQgPSBzdHJ1Y3QNCiAgICDilIIgICBsZXQgeCA9IDENCiAgICDilIIgICBpbmNs dWRlIFgNCiAgICDilIIgZW5kDQogICAg4pSU4pSA4pSA4pSA4pSADQogICAgTWVybGluIGNhbiBu b3cgZGV0ZXJtaW5lIHRoYXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGBNLngnIHZhbHVlIGxpZXMN CiAgICBpbnNpZGUgdGhlIG1vZHVsZSBgWCcuDQoNCiAgQW5kIGEgbG90IG9mIGluY3JlbWVudGFs IGNoYW5nZXM6DQoNCiAg4oCiIEFyb3VuZCAyMCBuZXcgZnVuY3Rpb25zIGluIHRoZSBzdGFuZGFy ZCBsaWJyYXJ5IChpbiB0aGUgYERvbWFpbicsDQogICAgYER5bmFycmF5JywgYEZvcm1hdCcsIGBM aXN0JywgYFF1ZXVlJywgYFN5cycsIGFuZCBgVWNoYXInIG1vZHVsZXMpLg0KICDigKIgTWFueSBm aXhlcyBhbmQgaW1wcm92ZW1lbnRzIGluIHRoZSBydW50aW1lDQogIOKAoiBJbXByb3ZlZCBlcnJv ciBtZXNzYWdlcyBmb3IgZmlyc3QtY2xhc3MgbW9kdWxlcywgZnVuY3RvcnMsIGxhYmVsbGVkDQog ICAgYXJndW1lbnRzLCBhbmQgdHlwZSBjbGFzaGVzLg0KICDigKIgTnVtZXJvdXMgYnVnIGZpeGVz DQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgdW5leHBlY3RlZCBiZWhhdmlvdXJzIG9uIHRoZSBbT0Nh bWwgaXNzdWUgdHJhY2tlcl0uDQoNCiAgVGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIGNhbiBiZSBm b3VuZCBpbiB0aGUgY2hhbmdlbG9nIGJlbG93Lg0KDQogIC9lZGl0b3Igbm90ZTogcGxlYXNlIHZp c2l0DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0zLTAtcmVsZWFzZWQv MTU5MTY+IGZvciB0aGUNCiAgY2hhbmdlbG9nLw0KDQogIEhhcHB5IGhhY2tpbmcsIEZsb3JpYW4g QW5nZWxldHRpIGZvciB0aGUgT0NhbWwgdGVhbS4NCg0KDQpbT0NhbWwgaXNzdWUgdHJhY2tlcl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXM+DQoNCg0KZHJlYW0taHRtbCBh bmQgcHVyZS1odG1sIDMuOS41DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1s LXB1cmUtaHRtbC0zLTktNS8xNTkxNy8xPg0KDQoNCllhd2FyIEFtaW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIYXBweSB0byBhbm5vdW5jZSB0aGF0IGRyZWFtLWh0bWwgYW5kIHB1cmUtaHRtbCAzLjku NSBhcmUgbm93DQogIGF2YWlsYWJsZSBvbiBvcGFtLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgcmVs ZWFzZSB3aXRoIHRocmVlIG1haW4gbmV3DQogIHRoaW5nczoNCg0KICAxLiBUeXBlLXNhZmUgcGF0 aHMgYW5kIHJvdXRpbmcNCiAgMi4gU3VwcG9ydCBmb3Igc3RhdGljIGFzc2V0IGNhY2hpbmcNCiAg My4gSFRNTCBpbXByb3ZlbWVudHMNCg0KDQpUeXBlLXNhZmUgcGF0aHMgYW5kIHJvdXRpbmcNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEFsbG93cyBkZWZpbmluZyBwYXRocyBhcyB2YWx1 ZXMgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSBhIHJvdXRlciBhbmQNCiAgX2Fsc29fIHJlbmRlcmVk IGJ5IHRoZSBIVE1MIG1hcmt1cCBnZW5lcmF0b3IsIHNvIHRoYXQgdGhlIGFjdHVhbA0KICByb3V0 ZWQgcGF0aHMgYXJlIGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZWQgcGF0aHMgaW4gdGhlDQogIGFw cGxpY2F0aW9uLiBUaGVzZSBwYXRocyB1c2UgT0NhbWwncyBidWlsdC1pbiBmb3JtYXQgc3RyaW5n cyByYXRoZXINCiAgdGhhbiBhIG5ldyBEU0w6IGVnIGAvb3JkZXJzLyVzL3ZlcnNpb25zLyVkJy4g VGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0bw0KICBleHRyYWN0IHR5cGUtc2FmZSB2YWx1ZXMgZnJv bSBwYXRoIHNlZ21lbnRzIGFuZCBwYXNzIHRoZW0gdG8gdGhlDQogIGhhbmRsZXI7IHJlbmRlciBt YXJrdXAgd2l0aCBndWFyYW50ZWVkIGNvcnJlY3QgcGF0aHM7IGFuZCByZWZhY3RvciB0aGUNCiAg YXBwJ3MgcGF0aHMgd2l0aG91dCBoYXZpbmcgdG8gaHVudCBmb3IgaGFyZC1jb2RlZCBzdHJpbmdz Lg0KDQogIFNlZSBbdGhlIGRvY3NdIGZvciBkZXRhaWxzLg0KDQoNClt0aGUgZG9jc10NCjxodHRw czovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9kcmVhbS1odG1sL0RyZWFtX2h0bWwv I3R5cGUtc2FmZS1yb3V0aW5nPg0KDQoNClN0YXRpYyBhc3NldHMgc3VwcG9ydA0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgQXV0b21hdGVzIHRoZSBoYW5kbGluZyBvZiBzdGF0aWMgYXNzZXRzIGluIHRoZSBhcHBsaWNh dGlvbiBzbyB0aGF0DQogIHRoZXkgY2FuIGVhc2lseSBiZSBzZXJ2ZWQgYnkgdGhlIHJvdXRlciB3 aXRoIGFuIGltbXV0YWJsZSBjYWNoZSBwb2xpY3kNCiAgYW5kIHRoZWlyIHBhdGhzIGNhbiBiZSBy ZW5kZXJlZCBpbiBtYXJrdXAgd2l0aCBhIGNvbnRlbnQtYmFzZWQNCiAgcmV2aXNpb24gaGFzaCwg Zm9yIGVhc3kgY2FjaGUtYnVzdGluZy4NCg0KICBBZGRlZCBhIG5ldyBDTEkgdG9vbCBgZHJlYW13 b3JrJyB3aGljaCBoZWxwcyB3aXRoIHNjYWZmb2xkaW5nIHRoaXMNCiAgc3RhdGljIGFzc2V0cyBz ZXR1cC4gVGhlIGludGVudGlvbiBpcyB0byB1c2UgaXQgZm9yIG1vcmUgc2NhZmZvbGRpbmcNCiAg dGFza3MgaW4gdGhlIGZ1dHVyZeKAk3N0YXkgdHVuZWQuDQoNCiAgU2VlIFt0aGUgZG9jc10gZm9y IGRldGFpbHMsIGFuZCBbdGhpcyBzY3JlZW4gcmVjb3JkaW5nXSBmb3IgYSBzaG9ydA0KICBkZW1v Lg0KDQoNClt0aGUgZG9jc10NCjxodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRt bC9kcmVhbS1odG1sL0RyZWFtX2h0bWwvI2RyZWFtd29yaz4NCg0KW3RoaXMgc2NyZWVuIHJlY29y ZGluZ10NCjxodHRwczovL3guY29tL3lhd2FyYW1pbi9zdGF0dXMvMTg3MzA5MTE5ODM4MDA2NTEz Mj4NCg0KDQpIVE1MIGltcHJvdmVtZW50cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhhbmtzIHRvIFtSZXp3YW5BcmVmaW4wMV0gZm9y IHByZXR0aWZ5aW5nIHRoZSBnZW5lcmF0ZWQgSFRNTC4gSXQgaXMNCiAgbm93IGZvcm1hdHRlZCBh bmQgbXVjaCBlYXNpZXIgdG8gcmVhZC4gU2VlIHRoZSBbc25hcHNob3RzXSBmb3Igc29tZQ0KICBl eGFtcGxlcy4NCg0KICBMYXN0bHksIGFkZGVkIGBIVE1MLmFzXycgd2hpY2ggaXMgdGhlIFthcyBh dHRyaWJ1dGVdLg0KDQogIEVuam95IQ0KDQoNCltSZXp3YW5BcmVmaW4wMV0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9SZXp3YW5BcmVmaW4wMT4NCg0KW3NuYXBzaG90c10NCjxodHRwczovL2dpdGh1Yi5j b20veWF3YXJhbWluL2RyZWFtLWh0bWwvYmxvYi9lMmE2NmNjMTk5YTI4ZmQzZDRhNTQ0MGExMjRj OTBmNTc4YjhhZTkwL3Rlc3QvcHVyZV9odG1sX3Rlc3QuZXhwZWN0ZWQudHh0Pg0KDQpbYXMgYXR0 cmlidXRlXQ0KPGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hU TUwvRWxlbWVudC9saW5rI2FzPg0KDQoNCkJ1aWxkaW5nIGFuIE9DYW1sIGNyb3NzIGNvbXBpbGVy IHdpdGggT0NhbWwgNS4zDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2J1aWxkaW5nLWFuLW9jYW1sLWNyb3Nz LWNvbXBpbGVyLXdpdGgtb2NhbWwtNS0zLzE1OTE4LzE+DQoNCg0Kc2h5bSBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgY3Jvc3MgY29t cGlsZXIgaXMgYSBjb21waWxlciB0aGF0IHJ1bnMgb24gc29tZSBfaG9zdF8gbWFjaGluZSwgZm9y DQogIGluc3RhbmNlIG9uZSBydW5uaW5nIExpbnV4IG9uIGEgNjQtYml0IEFSTSBwcm9jZXNzb3Is IGFuZCBnZW5lcmF0ZXMNCiAgY29kZSBmb3IgYSBkaWZmZXJlbnQgX3RhcmdldF8gbWFjaGluZSwg Zm9yIGluc3RhbmNlIG9uZSBydW5uaW5nDQogIFdpbmRvd3Mgd2l0aCBhIDY0LWJpdCB4ODYgcHJv Y2Vzc29yLiAgQnVpbGRpbmcgT0NhbWwgY3Jvc3MgY29tcGlsZXJzDQogIHVzZWQgdG8gYmUgcXVp dGUgdHJpY2t5IGFuZCBoYWNraXNoIGJ1dCBtYW55IGluY3JlbWVudGFsIGNoYW5nZXMgdG8NCiAg dGhlIGJ1aWxkIHN5c3RlbSBvdmVyIHRoZSBsYXN0IHllYXJzIGhhdmUgaW1wcm92ZWQgcmFkaWNh bGx5IHRoZQ0KICBzaXR1YXRpb24uIFNvIG11Y2ggc28gdGhhdCwgd2l0aCB0aGUgbW9zdCByZWNl bnQgY2hhbmdlcyAoWzFdLCBbMl0pIGluDQogIHRoZSBkZXZlbG9wbWVudCBicmFuY2ggb2YgdGhl IGNvbXBpbGVyLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnVpbGQNCiAgbWFueSBjcm9zcyBj b21waWxlcnMgd2l0aG91dCBleHRyYSBjaGFuZ2VzIDpjcm9zc2VkX2ZpbmdlcnM6DQoNCiAgVGhp cyBpcyBhbGwgd2VsbCBhbmQgZ29vZCwgeW91IG1pZ2h0IHNheSwgYnV0IHlvdSB3b3VsZCByYXRo ZXIgcGxheQ0KICB3aXRoIHRoZSBicmFuZCBuZXcgWzUuM10gaW5zdGVhZCBvZiBhIGRldmVsb3Bt ZW50IGJyYW5jaCEgU28gSeKAmXZlDQogIGJhY2twb3J0ZWQgdGhlIG5lY2Vzc2FyeSBjaGFuZ2Vz IHRvIDUuMy4NCg0KDQpbMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEz NTI2Pg0KDQpbMl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEzNjc0Pg0K DQpbNS4zXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMy0wLXJlbGVhc2Vk LzE1OTE2Pg0KDQpIb3cgdG8gYnVpbGQgYW5kIHVzZSBhIE9DYW1sIDUuMyBjcm9zcyBjb21waWxl cg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVG8gbWFrZSBpdCBlYXN5IHRvIHRl c3QsIEnigJl2ZSB3cml0dGVuIGFuIGV4YW1wbGUgT1BBTSBmaWxlIHRoYXQgY2FuIGJlDQogIGN1 c3RvbWlzZWQgdG8gc3VpdCB5b3VyIGdvYWwuIEl0IHRha2VzIHRoZSBleGFtcGxlIG9mIGJ1aWxk aW5nIGEgY3Jvc3MNCiAgY29tcGlsZXIgdG8gNjQtYml0IHg4NiBXaW5kb3dzIE1pbkdXLCBpbiBw YXJ0aWN1bGFyIGJlY2F1c2UgdGhhdA0KICBhbHdheXMgcmV2ZWFscyB1bmV4cGVjdGVkIGlzc3Vl cyA6LSkNCg0KICAxLiBTdGFydCBieSBjcmVhdGluZyBhIDUuMy4wIE9QQU0gc3dpdGNoIGlmIHlv dSBoYXZlbuKAmXQgYWxyZWFkeS4NCg0KICAyLiBDaG9vc2UgdGhlIHRhcmdldCB5b3Ugd2FudCB0 byBjcmVhdGUgYSBjcm9zcyBjb21waWxlciBmb3IgYW5kIGZpbmQNCiAgICAgaXRzIFt0YXJnZXQg dHJpcGxldF0uIFRoZSBHQ0MgQyBjcm9zcyBjb21waWxlcnMgYW5kIHRoZSBHTlUgY3Jvc3MNCiAg ICAgYmludXRpbHMgdXNlIHRhcmdldCB0cmlwbGV0cyBhcyBwcmVmaXhlcyBmb3IgdGhlIGNvbW1h bmRzLCBzbyBhbg0KICAgICBlYXN5IHdheSB0byBmaW5kIHlvdXIgdHJpcGxldCBpcyB0byBpbnN0 YWxsIHRoZSB0b29scy4gU286DQoNCiAgMy4gSW5zdGFsbCB0aGUgQyBjcm9zcyBjb21waWxlciBh bmQgdG9vbGNoYWluIGZvciB5b3VyIHRhcmdldC4gTWFueQ0KICAgICBMaW51eCBkaXN0cmlidXRp b25zIHBhY2thZ2Ugc29tZSBjcm9zcyBjb21waWxlcnMuIEZvciBpbnN0YW5jZSwNCiAgICAgdGhl IFtDSSB0ZXN0cyBmb3IgY3Jvc3MgY29tcGlsZXJzXSBpbnN0YWxscyBvbiBVYnVudHU6DQoNCiAg ICAg4oCiIHRoZSBgZ2NjLW1pbmd3LXc2NC14ODYtNjQnIHBhY2thZ2UgKHdoaWNoIGRlcGVuZHMg b24gdGhlDQogICAgICAgbWF0Y2hpbmcgYmludXRpbHMpIHRvIGNyb3NzIGNvbXBpbGUgdG8gNjQt Yml0IHg4NiBXaW5kb3dzIE1pbkdXOw0KICAgICAgIGluIHRoYXQgY2FzZSwgdGhhdCB0YXJnZXQg bWFjaGluZSBpcyBpZGVudGlmaWVkIGJ5IHRoZQ0KICAgICAgIGB4ODZfNjQtdzY0LW1pbmd3MzIn IHRyaXBsZXQsIHNvIGl0IGNhbGxzIGBjb25maWd1cmUnIHdpdGggdGhlDQogICAgICAgYXJndW1l bnQgYC0tdGFyZ2V0PXg4Nl82NC13NjQtbWluZ3czMicsDQogICAgIOKAoiB0aGUgYGdjYy1hYXJj aDY0LWxpbnV4LWdudScgcGFja2FnZSB0byBjcm9zcyBjb21waWxlIHRvIDY0LWJpdA0KICAgICAg IGFybSBMaW51eDsgaW4gdGhhdCBjYXNlLCB0aGUgdGFyZ2V0IG1hY2hpbmUgaXMgaWRlbnRpZmll ZCBieSB0aGUNCiAgICAgICBgYWFyY2g2NC1saW51eC1nbnUnIHRyaXBsZXQuDQoNCiAgNC4gQ3Jl YXRlIGEgbmV3IE9QQU0gcGFja2FnZSBpbnRlcmFjdGl2ZWx5IGZvciBpbnN0YW5jZSBieSBjaG9v c2luZw0KICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSAoYG9jYW1sLXh5eicgb3IgZXZlbiBg b2NhbWwtY3Jvc3MteHl6JyBhcmUNCiAgICAgZ29vZCBjaG9pY2VzIEnigJlkIHNheTsgbXkgW2V4 YW1wbGVdIHVzZXMgYG9jYW1sLWNyb3NzLXdpbmRvd3MnLCBmb3INCiAgICAgaW5zdGFuY2UpIGFu ZCBydW46DQogICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgICDilIIgb3BhbSBwaW4gYWRkIC0tZWRp dCBvY2FtbC1jcm9zcy14eXogLQ0KICAgICDilJTilIDilIDilIDilIANCg0KICAgICBUaGlzIHdp bGwgb3BlbiBhbiBlZGl0b3Igc28gdGhhdCB5b3UgY2FuIGZpbGwgaW4gdGhlIGluc3RydWN0aW9u cw0KICAgICBvbiBob3cgdG8gYnVpbGQgeW91ciBjcm9zcyBjb21waWxlci4gVXNlIG15IFtleGFt cGxlXSB0byBnZXQgeW91DQogICAgIHN0YXJ0ZWQuIEluIHBhcnRpY3VsYXIgeW914oCZbGwgd2Fu dCB0byBjb25maWd1cmUgdGhlIGAtLXRhcmdldCcNCiAgICAgcGFyYW1ldGVyIHdpdGggdGhlIHRy aXBsZXQgZm9yIHlvdXIgdGFyZ2V0ICh0aGF0IGNvdWxkIGJlIHRoZSBvbmx5DQogICAgIGNoYW5n ZSEpLiBJZiB5b3VyIHRvb2xjaGFpbiBhbmQgQyBjb21waWxlciB1c2UgdGhhdCB0cmlwbGV0IGFz IGENCiAgICAgcHJlZml4IGZvciBhbGwgdGhlIGNvbW1hbmRzLCBgY29uZmlndXJlJyB3aWxsIGZp bmQgdGhlbQ0KICAgICBhdXRvbWF0aWNhbGx5LiBPdGhlcndpc2UgeW914oCZbGwgbmVlZCB0byBl eHBsaWNpdGx5IHNldCB0aGVtLCBieQ0KICAgICBhZGRpbmcgYXJndW1lbnRzIHN1Y2ggYXMgYEND PS4uLicgdG8gYGNvbmZpZ3VyZScuIFRoZSBbQ0kgdGVzdHMNCiAgICAgZm9yIGNyb3NzIGNvbXBp bGVyc10gY29udGFpbnMgc3VjaCBhbiBleGFtcGxlIHRvIGNyb3NzIGNvbXBpbGUgdG8NCiAgICAg QW5kcm9pZCB3aGVyZSBgQ0MnLCBgQVInLCBgUEFSVElBTExEJywgYFJBTkxJQicgYW5kIGBTVFJJ UCcgYXJlDQogICAgIGV4cGxpY2l0bHkgc2V04oCmIEluIG90aGVyIHdvcmRzLCBJIHN1Z2dlc3Qg dG8gZXhwZXJpbWVudCBmaXJzdCB3aXRoDQogICAgIGFuIGV4YW1wbGUgd2l0aCBhdXRvbWF0aWMg Y29uZmlndXJhdGlvbiENCg0KICBZb3Ugc2hvdWxkIG5vdyBoYXZlIGEgY3Jvc3MgY29tcGlsZXIh IExldOKAmXMgdXNlIGl0IG9uIGEgc2ltcGxlIHNhbml0eQ0KICBjaGVjayBgdGVzdC5tbCc6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBJcyB0aGUgcHJvcGVyICh0YXJnZXQpIE9TIGlk ZW50aWZpZWQ/ICopDQogIOKUgiBsZXQgXyA9DQogIOKUgiAgIFByaW50Zi5wcmludGYgIlZlcnNp b246ICVzXG5PUzogJXNcblVuaXg6ICViXG5XaW46ICViXG5DeWd3aW46ICViXG4iDQogIOKUgiAg ICAgU3lzLm9jYW1sX3ZlcnNpb24gU3lzLm9zX3R5cGUgU3lzLnVuaXggU3lzLndpbjMyIFN5cy5j eWd3aW4NCiAg4pSCIA0KICDilIIgKCogRG8gdGhlIGNvbXBpbGVyIGxpYnMgd29yaz8gKikNCiAg 4pSCICgqIFRoZSBpbnRlcmZhY2UgZm9yIFtBcmNoXSBpcyBub3QgdGhlIHNhbWUgYWNyb3NzIHBy b2Nlc3NvciBhcmNoaXRlY3R1cmVzLCB0aGUNCiAg4pSCICAgIGZvbGxvd2luZyBhc3N1bWVzIHlv dXIgdGFyZ2V0IGlzIDY0LWJpdCB4ODYgKikNCiAg4pSCIGxldCBfID0NCiAg4pSCICAgUHJpbnRm LnByaW50ZiAiYWxsb3dfdW5hbGlnbmVkX2FjY2VzcyA9ICViXG4iIEFyY2guYWxsb3dfdW5hbGln bmVkX2FjY2VzczsNCiAg4pSCICAgUHJpbnRmLnByaW50ZiAid2luNjQgPSAlYlxuIiBBcmNoLndp bjY0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBwYWNrYWdlIGBvY2FtbC1jcm9zcy14eXon IHdpbGwgaW5zdGFsbCBhbiBgb2NhbWxmaW5kJyB0b29sY2hhaW4NCiAgY2FsbGVkIGB4eXonLiBT byB3ZSBjYW4gY29tcGlsZSBgdGVzdC5tbCcgdGh1czoNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIG9jYW1sZmluZCAtdG9vbGNoYWluIHh5eiBvcHQgLXBhY2thZ2UgY29tcGlsZXItbGlicy5v cHRjb21wIC1saW5rcGtnIHRlc3QubWwgLXZlcmJvc2UNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg d2hlcmUgYC12ZXJib3NlJyBsZXQgeW91IGNoZWNrIHdoYXQgaXMgYWN0dWFsbHkgYmVpbmcgcnVu LiBJZiB5b3VyDQogIHRhcmdldCBpcyBXaW5kb3dzIE1pbkdXIChzbyBjcm9zcyBjb21waWxpbmcg ZnJvbSBzb21lIHVuaXgpLCB5b3UNCiAgcHJvYmFibHkgbmVlZCBhbiBleHRyYSBzdGVwIGJlZm9y ZSB0aGlzIGNvbXBpbGF0aW9uIGNhbiBnbyB0aHJvdWdoOg0KICB0aGUgdG9vbCBgZmxleGxpbmsu ZXhlJyB3aGljaCBpcyB1c2VkIHRvIGxpbmsgdGhlIGZpbmFsIFdpbmRvd3MgYmluYXJ5DQogIGhh cyBiZWVuIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIHBhY2thZ2UgYnV0IGBvY2FtbG9wdCcgd2lsbCBl eHBlY3QgdG8NCiAgZmluZCBhIGNvbW1hbmQgYGZsZXhsaW5rJyAobm90ZSBpbiBwYXJ0aWN1bGFy IHRoZSBhYnNlbmNlIG9mIGAuZXhlJykNCiAgc28gSSBzdWdnZXN0IHRvIGBsbiAtcycgdGhlIGBm bGV4bGluaycgYmluYXJ5IHNvbWV3aGVyZSBpbiB5b3VyDQogIGBQQVRIJy4gRm9yIGluc3RhbmNl LCBpdCBjb3VsZCBiZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxuIC1zICIkKG9wYW0g c2hvdyAtLWxpc3QtZmlsZXMgb2NhbWwtY3Jvc3MteHl6IHwgZ3JlcCBmbGV4bGluay5vcHQuZXhl KSIgfi9iaW4vZmxleGxpbmsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgYW5kIHRoZW4geW91IHdp bGwgYmUgYWJsZSB0byBydW4gdGhlIGBvY2FtbGZpbmQgLXRvb2xjaGFpbiAuLi4nDQogIGNvbW1h bmQgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0uDQoNCg0KW3RhcmdldCB0cmlwbGV0XQ0KPGh0dHBz Oi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYvbWFudWFsL2F1dG9jb25mLTIuNzEvaHRt bF9ub2RlL1NwZWNpZnlpbmctVGFyZ2V0LVRyaXBsZXRzLmh0bWw+DQoNCltDSSB0ZXN0cyBmb3Ig Y3Jvc3MgY29tcGlsZXJzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL3Ry dW5rLy5naXRodWIvd29ya2Zsb3dzL2J1aWxkLWNyb3NzLnltbD4NCg0KW2V4YW1wbGVdDQo8aHR0 cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2h5bS80NGRhMWRhYWVmZTExYzc0ZTZjNDM2M2IxNGFlN2Vl MCNmaWxlLW9jYW1sLWNyb3NzLXdpbmRvd3Mtb3BhbT4NCg0KDQpHb3RjaGFzIGFuZCBkZXRhaWxz DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICAxLiBCZXdhcmUgdGhhdCBoYXZpbmcgYSBgZmxleGxpbmsnIGNvbW1hbmQgaW4gYFBB VEgnIGJyZWFrcyBPQ2FtbA0KICAgICAoNS4zIGFuZCBiZWZvcmUp4oCZcyBgY29uZmlndXJlJyBp ZiB5b3XigJlyZSBub3Qgb24gV2luZG93czsgdGhpcyB3aWxsDQogICAgIGJlIGZpeGVkIGluIDUu NC4NCg0KICAyLiBUaGUgW2V4YW1wbGVdIE9QQU0gcGFja2FnZSBjb250YWlucyBTSEEyNTYgc3Vt cyBmb3IgYC5wYXRjaCcgZmlsZXMNCiAgICAgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgZnJvbSB0aGUg Y29ycmVzcG9uZGluZyBjb21taXRzIGJ1dCB0aGV5IG1pZ2h0DQogICAgIGNoYW5nZSB3aXRob3V0 IG5vdGljZSAodG8gYWRkIGFuIGV4dHJhIGRpZ2l0IHRvIHRoZSBTSEExIHRoZXkNCiAgICAgY29u dGFpbiwgZm9yIGluc3RhbmNlKS4gSWYgeW91IG5vdGljZSB0aGF0LCBwaW5nIG1lIHNvIHRoYXQg SSBjYW4NCiAgICAgdXBkYXRlIHRoZSBTSEEyNTYgc3VtcyBpbiB0aGUgZ2lzdC4NCg0KICAzLiBU aGUgW2V4YW1wbGVdIE9QQU0gcGFja2FnZSBwdWxscyB0aGUgb2ZmaWNpYWwgT0NhbWwgNS4zLjAg YXJjaGl2ZQ0KICAgICBhbG9uZyB3aXRoIHR3byBwYXRjaGVzOg0KICAgICDigKIgdGhlIGZpcnN0 IG9uZSBpcyBhIGxhcmdlIGNvbW1pdCB0aGF0IHNxdWFzaGVzIGFsbCB0aGUgY29tbWl0cw0KICAg ICAgIHRoYXQgSSBiYWNrcG9ydGVkIGZyb20gdXBzdHJlYW0sDQogICAgIOKAoiB0aGUgc2Vjb25k IG9uZSBpcyBhIHNtYWxsIGNvbW1pdCB0aGF0IGFkZHMgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQog ICAgICAgYG9jYW1sZmluZCcgdG9vbGNoYWluIGNvbmZpZ3VyYXRpb24uDQoNCiAgICAgWW91IGNh biBmaW5kIHRoZSBkZXRhaWxlZCBiYWNrcG9ydCBvbiBteSBbYDUuMytvY3Jvc3MnXSBicmFuY2gg YW5kDQogICAgIGl0cyBbY29tcGFyaXNvbl0gd2l0aCB0aGUgb2ZmaWNpYWwgcmVsZWFzZS4gVGhl IHNxdWFzaGVkIGNvbW1pdA0KICAgICBsaXZlcyBvbiBpdHMgW293biBicmFuY2hdLg0KDQoNCltl eGFtcGxlXQ0KPGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NoeW0vNDRkYTFkYWFlZmUxMWM3NGU2 YzQzNjNiMTRhZTdlZTAjZmlsZS1vY2FtbC1jcm9zcy13aW5kb3dzLW9wYW0+DQoNCltgNS4zK29j cm9zcyddIDxodHRwczovL2dpdGh1Yi5jb20vc2h5bS9vY2FtbC90cmVlLzUuMytvY3Jvc3MvPg0K DQpbY29tcGFyaXNvbl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvY29tcGFyZS81 LjMuMC4uLnNoeW06b2NhbWw6NS4zK29jcm9zcz4NCg0KW293biBicmFuY2hdIDxodHRwczovL2dp dGh1Yi5jb20vc2h5bS9vY2FtbC90cmVlLzUuMy4wK29jcm9zcy1zcXVhc2hlZC8+DQoNCg0KUHB4 IGRlcml2aW5nIGRlY29kZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtZGVyaXZpbmctZGVjb2RlcnMvMTU5MjEvMT4NCg0KDQpC ZW4gQmVsbGljayBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgbGl0dGxlIGxhdGUgYnV0IHdhbnRl ZCB0byBzaGFyZSBhIHBhY2thZ2UgSSBoYXZlIHJlbGVhc2VkIQ0KDQogIEZvciB0aG9zZSBmYW1p bGlhciB3aXRoIHRoZSBleGNlbGxlbnQgW29jYW1sLWRlY29kZXJzXSBwYWNrYWdlLCBJIGhhdmUN CiAgd3JpdHRlbiBbcHB4X2Rlcml2aW5nX2RlY29kZXJzXSB0byBhdXRvbWF0aWNhbGx5IGdlbmVy YXRlIHRoZQ0KICBjb3JyZXNwb25kaW5nIGRlY29kZXJzIChhbmQgZW5jb2RlcnMpIGJhc2VkIG9m ZiBvZiB0eXBlIGRlZmluaXRpb25zLg0KDQogIEluIG15IHZpZXcsIHRoaXMgZ2l2ZXMgdGhlIGJl c3Qgb2YgYm90aCB3b3JsZHMgaW4gdGVybXMgb2Y6DQogIDEuIGF1dG9tYXRpY2FsbHkgZ2VuZXJh dGluZyAoZS5nLiBKU09OKSBzZXJpYWxpemF0aW9uIGFuZA0KICAgICBkZXNlcmlhbGl6YXRpb24g YmFzZWQgb2ZmIG9mIGEgdHlwZSBkZWZpbml0aW9uLCBhbmQNCiAgMi4gaGF2aW5nIGEgcmVhZGFi bGUgYW5kIGV4cHJlc3NpdmUgbGFuZ3VhZ2UgZm9yIGhhbmR3cml0aW5nIGVuY29kZXJzDQogICAg IGFuZCBkZWNvZGVycyB3aGVuIG5lY2Vzc2FyeSBieSB1c2luZyBjb21iaW5hdG9ycy4NCg0KICBU aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBSRUFETUUgZGVtb25zdHJhdGUgaG93IHlvdSBjYW4gdXNl IHRoZQ0KICBnZW5lcmF0ZWQgZGVjb2RlciBhcyBhIGJhc2UgcG9pbnQgZnJvbSB3aGljaCB0byBo YW5kIHR3ZWFrIGFuZCBnZXQNCiAgeW91ciBvd24gY3VzdG9tIGRlY29kZXIuDQoNCiAgUGxlYXNl IGxldCBtZSBrbm93IGlmIHlvdSBmaW5kIGl0IHVzZWZ1bCBvciBoYXZlIGFueSBmZWVkYmFjay4g VGhhbmtzIQ0KDQoNCltvY2FtbC1kZWNvZGVyc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0amJy YXkvb2NhbWwtZGVjb2RlcnM+DQoNCltwcHhfZGVyaXZpbmdfZGVjb2RlcnNdDQo8aHR0cDovL2dp dGh1Yi5jb20vYmVuYmVsbGljay9wcHhfZGVyaXZpbmdfZGVjb2RlcnM+DQoNCg0KT3J0YWMgMC41 LjAgdGVzdGluZyBoaWdoZXIgb3JkZXIgZnVuY3Rpb25zDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcnRhYy0wLTUtMC10ZXN0 aW5nLWhpZ2hlci1vcmRlci1mdW5jdGlvbnMvMTU5NDUvMT4NCg0KDQpOaWNvbGFzIE9zYm9ybmUg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSENCg0KICBJJ20g dmVyeSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHRoZSBPcnRhYy0wLjUuMCBw YWNrYWdlcw0KICBmb3Igc3BlY2lmaWNhdGlvbi1kcml2ZW4gdGVzdGluZyENCg0KICBPcnRhYy9R Q2hlY2stU1RNIGlzIGEgdGVzdCBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIFtRQ2hlY2stU1RNXQ0K ICBtb2RlbC1iYXNlZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgdGhlIFtHb3NwZWxdIHNwZWNpZmlj YXRpb24gbGFuZ3VhZ2UNCiAgZm9yIE9DYW1sLg0KDQogIFRoaXMgbmV3IHJlbGVhc2UgYnJpbmdz IHRocmVlIG5ldyBmZWF0dXJlcy4NCg0KICBJbiB0aGUgZWZmb3J0IHRvIGluY3JlYXNlIHRoZSBj b3ZlcmFnZSBvZiB0aGUgZ2VuZXJhdGVkIHRlc3RzIGFuZA0KICB0aGFua3MgdG8gSmFuIE1pZHRn YWFyZCwgd2Ugbm93IHN1cHBvcnQgdGVzdGluZyBoaWdoZXIgb3JkZXINCiAgZnVuY3Rpb25zLiBU aGFua3MgSmFuIQ0KDQogIEl0IGlzIGFsc28gbm93IHBvc3NpYmxlIHRvIHRlc3QgYSBtb2R1bGUg ZXhwb3NlZCBhcyBhIHN1Yi1tb2R1bGUgYnkNCiAgRHVuZSwgc3BlY2lmeWluZyB0aGUgbW9kdWxl J3MgcHJlZml4IGluIGEgQ0xJIG9wdGlvbmFsIGFyZ3VtZW50LiBBDQogIGZlYXR1cmUgdGhhdCB3 ZSd2ZSBiZWVuIGFza2VkIHRvIGFkZC4NCg0KICBBbmQgdG8gdGVzdCBhbiBhY3R1YWwgc3ViLW1v ZHVsZSBkZWZpbmVkIGluc2lkZSBhbiBPQ2FtbCBmaWxlLA0KICBzcGVjaWZ5aW5nIHRoZSBzdWIt bW9kdWxlIGluIGEgQ0xJIG9wdGlvbmFsIGFyZ3VtZW50IGFzIHdlbGwuDQoNCiAgT3J0YWMvRHVu ZSBnZW5lcmF0ZXMgdGhlIER1bmUgYm9pbGVycGxhdGUgZm9yIHlvdS4gSXQgaGFzIGJlZW4gdXBk YXRlZA0KICB0byBzdXBwb3J0IHRoZSB0d28gbmV3IG9wdGlvbmFsIGFyZ3VtZW50cy4NCg0KICBZ b3UgY2FuIGluc3RhbGwgdGhvc2UgcGFja2FnZXMgdmlhIG9wYW06DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCBvcnRhYy1xY2hlY2stc3RtIG9ydGFjLWR1bmUNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlbiB5b3Ugd3JpdGUgc29tZSBHb3NwZWwgc3BlY2lmaWNh dGlvbnMgaW4geW91ciBsaWJyYXJ5J3MgaW50ZXJmYWNlDQogIGZpbGUgYGZvby5tbGknOg0KDQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdHlwZSAnYSB0DQogIOKUgiAoKkAgbXV0YWJsZSBtb2Rl bCBjb250ZW50cyA6ICdhIHNlcXVlbmNlICopDQogIOKUgiANCiAg4pSCIHZhbCBtYWtlIDogaW50 IC0+ICdhIC0+ICdhIHQNCiAg4pSCICgqQCB0ID0gbWFrZSBpIGENCiAg4pSCICAgICBlbnN1cmVz IHQuY29udGVudHMgPSBTZXF1ZW5jZS5pbml0IGkgKGZ1biBfIC0+IGEpICopDQogIOKUgiANCiAg 4pSCIHZhbCBmb3JfYWxsIDogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbA0KICDilIIgKCpA IGIgPSBmb3JfYWxsIHAgdA0KICDilIIgICAgIGVuc3VyZXMgYiA9IFNlcXVlbmNlLmZvbGRfbGVm dCAoZnVuIGFjYyBhIC0+IGFjYyAmJiBwIGEpIHRydWUgdC5jb250ZW50cyAqKQ0KICDilJTilIDi lIDilIDilIANCg0KICBUaGVuIGEgc2ltcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBgZm9vX2NvbmZp Zy5tbCc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlIHN1dCA9IGNoYXIgdA0KICDi lIIgDQogIOKUgiBsZXQgaW5pdF9zdXQgPSBtYWtlIDQyICdhJw0KICDilJTilIDilIDilIDilIAN Cg0KICBBbmQgeW91IGNhbiBnZW5lcmF0ZSBzb21lIHNwZWNpZmljYXRpb24tZHJpdmVuIG1vZGVs LWJhc2VkIHRlc3RzIGZvcg0KICB5b3VyIGxpYnJhcnkganVzdCBieSBydW5uaW5nOg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcnRhYyBxY2hlY2stc3RtIGZvby5tbGkgZm9vX2NvbmZp Zy5tbA0KICDilJTilIDilIDilIDilIANCg0KICBJZiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgdGhl IGdlbmVyYXRpb24gYW5kIHRoZSBydW5uaW5nIG9mIHRoZSB0ZXN0cw0KICB0byB5b3VyIGR1bmUg c2V0dXAgKHdoaWNoIGlzIGhpZ2hseSByZWNvbW1lbmRlZCksIGp1c3QgYWRkIHRoZQ0KICBmb2xs b3dpbmcgc3RhbnphIHRvIHlvdXIgZHVuZSBmaWxlIGluIHlvdXIgdGVzdCBkaXJlY3Rvcnk6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAocnVsZQ0KICDilIIgIChhbGlhcyBydW50ZXN0KQ0K ICDilIIgIChtb2RlIHByb21vdGUpDQogIOKUgiAgKGFjdGlvbg0KICDilIIgICAod2l0aC1zdGRv dXQtdG8NCiAg4pSCICAgIGR1bmUuaW5jDQogIOKUgiAgICAocnVuIG9ydGFjIGR1bmUgcWNoZWNr LXN0bSBmb28ubWxpKSkpKQ0KICDilIIgDQogIOKUgiAoaW5jbHVkZSBkdW5lLmluYykNCiAg4pSU 4pSA4pSA4pSA4pSADQoNCiAgWW91J2xsIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgW09y dGFjL1FDaGVjay1TVE0gZG9jdW1lbnRhdGlvbl0sDQogIHRoZSBbT3J0YWMvRHVuZSBSRUFETUVd IGFuZCB0aGUgW2BleGFtcGxlcycgZm9sZGVyXS4gSSdtIGFsc28gaGFwcHkgdG8NCiAgYW5zd2Vy IHF1ZXN0aW9ucy4NCg0KICBIYXBweSB0ZXN0aW5nIQ0KDQoNCltRQ2hlY2stU1RNXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9tdWx0aWNvcmV0ZXN0cz4NCg0KW0dvc3BlbF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1nb3NwZWwvZ29zcGVsPg0KDQpbT3J0YWMvUUNoZWNr LVNUTSBkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vb2NhbWwtZ29zcGVsLmdpdGh1Yi5pby9vcnRh Yy9vcnRhYy1xY2hlY2stc3RtL2luZGV4Lmh0bWw+DQoNCltPcnRhYy9EdW5lIFJFQURNRV0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZ29zcGVsL29ydGFjL2Jsb2IvbWFpbi9wbHVnaW5zL2R1 bmUtcnVsZXMvUkVBRE1FLm1kPg0KDQpbYGV4YW1wbGVzJyBmb2xkZXJdDQo8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLWdvc3BlbC9vcnRhYy90cmVlL21haW4vZXhhbXBsZXM+DQoNCg0KT3RoZXIg T0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFy ZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9y Zw0KICBibG9nXS4NCg0KICDigKIgW1RoZSBNb3N0IEVsZWdhbnQgQ29uZmlndXJhdGlvbiBMYW5n dWFnZV0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+ DQoNCltUaGUgTW9zdCBFbGVnYW50IENvbmZpZ3VyYXRpb24gTGFuZ3VhZ2VdDQo8aHR0cHM6Ly9j aHNoZXJzaC5jb20vYmxvZy8yMDI1LTAxLTA2LXRoZS1tb3N0LWVsZWdhbnQtY29uZmlndXJhdGlv bi1sYW5ndWFnZS5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2Vd IGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFy Y2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3Ug YWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNj cmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0K DQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltS U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3 bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9p bmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvPg0KDQo= --=-=-= 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 January 07 to 14, 202= 5.

On concurrency models

Deep in this thread, Calascibetta Romain announced

For those interested, we've spent some time writing a book on how to use Miou and = asynchronous programming with Miou =E2=80=94 basically, it introduces Miou'= s design. In addition, resources that may be of interest are:

A next release of Miou is in preparation and additions to this =E2=80=98lit= tle book=E2=80=99 will be made. In particular, there will be an explanation= of how we implemented happy-eyeballs, which remains a good example.

OCaml 5.3.0 released

octachron announced

We have the pleasure of announcing the release of OCaml version 5.3.0. dedi= cated to the memory of John William Mauchly and Paul Verlaine on the anniversary = of their death.

De la musique avant toute chose,
Et pour cela pr=C3=A9f=C3=A8re l=E2=80=99Impair

(Music first and foremost of all!
Choose your measure of odd not even)

Some of the highlights in OCaml 5.3.0 are:

  • Syntax for deep effect handlers

    There is now a dedicated syntax for installing deep effect handler

    match f () w=
    ith
    | x -> x
    | effect Random_=
    float, k -> Effect.Deep.co=
    ntinue k (Random.float 1.0)
    

    This new syntax adds a new effect keyword, which may break exi= sting code. To improve backward compatibility, this new keyword can be disabled with the new -keywords flags if needed for backward compatibility.

  • Restored MSVC port

    It is now possible to use the MSVC toolchain on Windows, restoring the last missing port from OCaml 4 (except for the native compiler support for 32-bit architectures which is not planned)

  • Re-introduced statistical memory profiling (statmemprof)

    The submodule Gc.memprof is restored with a slightly different= API. This submodule can be used to monitor memory allocation statistics inside a program. In OCaml 5, each domain can be monitored independently while child domains inherit the parent domain profiling profile (if there is one active= ).

  • utf-8 encoded Unicode source files and modest support of Unicode identifiers

    type saison =3D Hiver | Ét&#=
    233; | Printemps=
     | Automn=
    e=20
    

    The OCaml lexer has been extended to support a modest subset of Unicode characters in identifiers. This is mostly intended for pedagogical use. This extended support requires source files to be utf-8 encoded Unicode text.

  • More space-efficient implementation of Dynarray

    The internal implementation of Dynarray now uses an unboxed re= presentation which avoids the need of storing items wrapped in a Some x blo= ck and thus save some spaces and indirections.

  • Improved metadata on the pairs of declarations and definitions for merlin.

    The metadata stored inside cmt files has been improved to better distinguis= h the provenance of identifiers (previous versions could confuse an interfa= ce and implementation identifier). Similarly, the metadata now tracks more precisely the association between d= eclarations and definitions. For instance, in

    module X =3D struct let x<=
    /span> =3D 0 end
    module M: sig
      val x: int
    end =3D struct
      let x =3D 1
      include X
    end
    

    Merlin can now determine that the definition of the M.x value = lies inside the module X.

And a lot of incremental changes:

  • Around 20 new functions in the standard library (in the Domain, Dynarray, Format, List, = Queue, Sys, and Uchar modules).
  • Many fixes and improvements in the runtime
  • Improved error messages for first-class modules, functors, labelled arg= uments, and type clashes.
  • Numerous bug fixes

Please report any unexpected behaviours on the OCaml issue tracker.

The full list of changes can be found in the changelog below.

editor note: please visit https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916= for the changelog

Happy hacking, Florian Angeletti for the OCaml team.

dream-html and pure-html 3.9.5

Yawar Amin announced

Happy to announce that dream-html and pure-html 3.9.5 are now available on = opam. This is a significant release with three main new things:

  1. Type-safe paths and routing
  2. Support for static asset caching
  3. HTML improvements

Type-safe paths and routing

Allows defining paths as values that can be handled by a router and also rendered by the HTML markup generator, so th= at the actual routed paths are in sync with the rendered paths in the appli= cation. These paths use OCaml's built-in format strings rather than a new D= SL: eg /orders/%s/versions/%d. This makes it possible to extra= ct type-safe values from path segments and pass them to the handler; render= markup with guaranteed correct paths; and refactor the app's paths without= having to hunt for hard-coded strings.

See the docs for details.

Static assets support

Automates the handling of static assets in the application so that they can= easily be served by the router with an immutable cache policy and their pa= ths can be rendered in markup with a content-based revision hash, for easy = cache-busting.

Added a new CLI tool dreamwork which helps with scaffolding th= is static assets setup. The intention is to use it for more scaffolding tas= ks in the future=E2=80=93stay tuned.

See the docs for details, and this screen recording for a short demo.

HTML improvements

Thanks to RezwanArefin01 = for prettifying the generated HTML. It is now formatted and much easier to = read. See the snaps= hots for some examples.

Lastly, added HTML.as_ which is the as attribute.

Enjoy!

Building an OCaml cross compiler with OCaml 5.3

shym announced

A cross compiler is a compiler that runs on some = host machine, for instance one running Linux on a 64-bit ARM process= or, and generates code for a different target machine, for instance one running Windows with a 64-bit x86 processor. Building OCaml cross compilers used to be quite tricky and hackish but many= incremental changes to the build system over the last years have improved = radically the situation. So much so that, with the most recent changes (1, 2) in the development branch of th= e compiler, it should be possible to build many cross compilers without ext= ra changes :crossed_fingers:

This is all well and good, you might say, but you would rather play with th= e brand new 5.3 instead of a development branch! So I=E2=80=99ve backported the= necessary changes to 5.3.

How to build and use a OCaml 5.3 cross compiler

To make it easy to test, I=E2=80=99ve written an example OPAM file that can= be customised to suit your goal. It takes the example of building a cross = compiler to 64-bit x86 Windows MinGW, in particular because that always rev= eals unexpected issues :-)

  1. Start by creating a 5.3.0 OPAM switch if you haven=E2=80=99t already.
  2. Choose the target you want to create a cross compiler for and find its = target triplet. The GCC C cross c= ompilers and the GNU cross binutils use target triplets as prefixes for the= commands, so an easy way to find your triplet is to install the tools. So:=
  3. Install the C cross compiler and toolchain for your target. Many Linux = distributions package some cross compilers. For instance, the = CI tests for cross compilers installs on Ubuntu:
    • the gcc-mingw-w64-x86-64 package (which depends on the mat= ching binutils) to cross compile to 64-bit x86 Windows MinGW; in that case,= that target machine is identified by the x86_64-w64-mingw32 t= riplet, so it calls configure with the argument --target= =3Dx86_64-w64-mingw32,
    • the gcc-aarch64-linux-gnu package to cross compile to 64-b= it arm Linux; in that case, the target machine is identified by the a= arch64-linux-gnu triplet.
  4. Create a new OPAM package interactively for instance by choosing the name o= f the package (ocaml-xyz or even ocaml-cross-xyz = are good choices I=E2=80=99d say; my example uses ocaml-cross-windows, for instance) and run:

    opam pin add --edit ocaml-cross-xyz -
    

    This will open an editor so that you can fill in the instructions on how to= build your cross compiler. Use my example= to get you started. In particular you=E2=80=99ll want to configure the --target parameter with the triplet for your target (that could b= e the only change!). If your toolchain and C compiler use that triplet as a= prefix for all the commands, configure will find them automat= ically. Otherwise you=E2=80=99ll need to explicitly set them, by adding arg= uments such as CC=3D... to configure. The CI tests for cross compilers contains such an example to cross co= mpile to Android where CC, AR, PARTIALLD, RANLIB and STRIP are explicitly set…= In other words, I suggest to experiment first with an example with automat= ic configuration!

You should now have a cross compiler! Let=E2=80=99s use it on a simple sani= ty check test.ml:

(* Is the =
proper (target) OS identified? *)
let _ =3D
  Printf.printf "Version: %s\nOS: %s\nUnix: %b\nWin: %b\nCygwin: %b\n"
    Sys.ocaml_version Sys.os_type Sys.unix Sys.win32 Sys.cygwin

(* Do the compiler libs work?<=
span style=3D"color: #8f6f4a; font-style: italic;"> *)
(* The interface for [Arch] is not th=
e same across processor architectures, the
   following assumes yo=
ur target is 64-bit x86 *)
let _ =3D
  Printf.printf "allow_unaligned_access =3D %b\n" Arch.allow_unaligned_access;
  Printf.printf "win64 =3D %b\n" Arch.win64

The package ocaml-cross-xyz will install an ocamlfind toolchain called xyz. So we can compile test.ml thus:

ocamlfind -toolchain xyz opt -package compiler-libs.optcomp -linkpkg test.m=
l -verbose

where -verbose let you check what is actually being run. If yo= ur target is Windows MinGW (so cross compiling from some unix), you probabl= y need an extra step before this compilation can go through: the tool flexlink.exe which is used to link the final Windows binary has bee= n built as part of the package but ocamlopt will expect to fin= d a command flexlink (note in particular the absence of = .exe) so I suggest to ln -s the flexlink b= inary somewhere in your PATH. For instance, it could be:

ln -s "$(opam show --list-files ocaml-cross-xyz | grep flexlink.opt.exe)" ~=
/bin/flexlink

and then you will be able to run the ocamlfind -toolchain ... = command to compile your program.

Gotchas and details

  1. Beware that having a flexlink command in PATH= breaks OCaml (5.3 and before)=E2=80=99s configure if you=E2= =80=99re not on Windows; this will be fixed in 5.4.
  2. The example OPAM package contains SHA2= 56 sums for .patch files generated on the fly from the corresp= onding commits but they might change without notice (to add an extra digit = to the SHA1 they contain, for instance). If you notice that, ping me so tha= t I can update the SHA256 sums in the gist.
  3. The example OPAM package pulls the officia= l OCaml 5.3.0 archive along with two patches:

    • the first one is a large commit that squashes all the commits that I ba= ckported from upstream,
    • the second one is a small commit that adds the generation of the = ocamlfind toolchain configuration.

    You can find the detailed backport on my 5.3+ocross branch and its c= omparison with the official release. The squashed commit lives on its <= a href=3D"https://github.com/shym/ocaml/tree/5.3.0+ocross-squashed/">own br= anch.

Ppx deriving decoders

Ben Bellick announced

A little late but wanted to share a package I have released!

For those familiar with the excellent ocaml-decoders package, I have written ppx_deriving_decoders= to automatically generate the corresponding decoders (and encoders) based = off of type definitions.=20

In my view, this gives the best of both worlds in terms of:

  1. automatically generating (e.g. JSON) serialization and deserialization = based off of a type definition, and
  2. having a readable and expressive language for handwriting encoders and = decoders when necessary by using combinators.

The instructions in the README demonstrate how you can use the generated de= coder as a base point from which to hand tweak and get your own custom deco= der.

Please let me know if you find it useful or have any feedback. Thanks!

Ortac 0.5.0 testing higher order functions

Nicolas Osborne announced

Hi everyone!

I'm very pleased to announce the release of the Ortac-0.5.0 packages for sp= ecification-driven testing!

Ortac/QCheck-STM is a test generator based on the QCheck-STM model-based testing fra= mework and the Gospel specification language for OCaml.

This new release brings three new features.

In the effort to increase the coverage of the generated tests and thanks to= Jan Midtgaard, we now support testing higher order functions. Thanks Jan!

It is also now possible to test a module exposed as a sub-module by Dune, s= pecifying the module's prefix in a CLI optional argument. A feature that we= 've been asked to add.

And to test an actual sub-module defined inside an OCaml file, specifying t= he sub-module in a CLI optional argument as well.

Ortac/Dune generates the Dune boilerplate for you. It has been updated to s= upport the two new optional arguments.

You can install those packages via opam:

$ opam install ortac-qcheck-stm ortac-dune

Then you write some Gospel specifications in your library's interface file = foo.mli:

type 'a t
(*@ mutable model contents : 'a sequenc=
e *)

val make : int -> 'a -> 'a t
(*@ t =3D make i a
    ensures t.contents =
=3D Sequence.init i (fun _ -> a) *)

val for_all : ('a -> bool) -> 'a t -> bool
(*@ b =3D for_all p t
    ensures b =3D Seque=
nce.fold_left (fun acc a -> acc && p a) true t.contents *)

Then a simple configuration file foo_config.ml:

type sut =3D char t

let init_sut =3D make 42 'a'

And you can generate some specification-driven model-based tests for your l= ibrary just by running:

$ ortac qcheck-stm foo.mli foo_config.ml

If you want to integrate the generation and the running of the tests to you= r dune setup (which is highly recommended), just add the following stanza t= o your dune file in your test directory:

(rule
 (alias runtest)
 (mode promote)
 (action
  (with-stdout-to
   dune.inc
   (run ortac dune qcheck-stm foo.mli))))

(include dune.inc)

You'll find more information in the Ortac/QCheck-STM documentation, t= he Ortac/Dune README and the examples folder. = I'm also happy to answer questions.

Happy testing!

Other OCaml News

From the ocaml.org blog

Here are links from many OCaml blogs aggregated at the ocaml.org blog.

Old CWN

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

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--