From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr 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 BECAD800DB for ; Thu, 9 Mar 2017 19:33:22 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.36,136,1486422000"; d="ml'?scan'208";a="263914785" Received: from bou78-2-82-240-46-163.fbx.proxad.net (HELO MP-41019.local) ([82.240.46.163]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES128-SHA; 09 Mar 2017 19:33:22 +0100 To: KC Sivaramakrishnan References: From: =?UTF-8?Q?Fran=c3=a7ois_Pottier?= Cc: caml users Message-ID: <58C19FF4.1030200@inria.fr> Date: Thu, 9 Mar 2017 19:33:24 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------020202010108040703000804" Subject: Re: [Caml-list] [ANN] New release of visitors This is a multi-part message in MIME format. --------------020202010108040703000804 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Dear KC, On 09/03/2017 12:53, KC Sivaramakrishnan wrote: > Thanks for the wonderful library and the excellent documentation. I have > a feature request. Could you provide a python-style generator for > traversing the data structure on demand? For a binary tree: > > type 'a t = Leaf | Node of 'a t * 'a * 'a t > > I envision a `mk_gen` function: > > val mk_gen : 'a t -> (unit -> 'a option) > (** [mk_gen t] returns a generator function [f], which when invoked > performs 1-step of the traversal and returns [Some v], where [v] > is the node value. [f] returns [None] when the traversal is done. *) Thanks for this excellent question, which I had not thought about. A quick answer might be that, if you are using OCaml + effect handlers, it should be fairly easy for you to perform control inversion and turn a producer-controlled traversal (as performed by an [iter] visitor) into a consumer-controlled traversal. That said, I was able to come up with a solution in pure OCaml. It is somewhat unexpected and (I think) quite nice, so I am posting it (with comments) on the list (see attached file). If there is demand, most of this code could be made part of the VisitorsRuntime library. Best regards, -- François Pottier francois.pottier@inria.fr http://gallium.inria.fr/~fpottier/ --------------020202010108040703000804 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="delayed_tree.ml" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="delayed_tree.ml" KCogVG8gcGxheSB3aXRoIHRoaXMgY29kZSBpbiBhbiBPQ2FtbCB0b3BsZXZl bCwgbGF1bmNoIFtvY2FtbF0gYW5kIHR5cGUgdGhpczoKICAgI3VzZSAidG9w ZmluZCI7OwogICAjcmVxdWlyZSAidmlzaXRvcnMucHB4Ijs7CiAgICNyZXF1 aXJlICJ2aXNpdG9ycy5ydW50aW1lIjs7CiAqKQoKKCogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gKikKCigqIFN1cHBvc2Ugd2UgaGF2ZSBhbiBh cmJpdHJhcnkgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBlbGVtZW50 cwogICBvZiB0eXBlIFsnYV0uIEhlcmUsIGl0IGlzIGEgYmluYXJ5IHRyZWUs IGJ1dCBpdCBjb3VsZCBiZSBhbnl0aGluZzogKikKCnR5cGUgJ2Egc29tZXRy ZWUgPQogIHwgTGVhZgogIHwgTm9kZSBvZiAnYSBzb21ldHJlZSAqICdhICog J2Egc29tZXRyZWUKCigqIFdlIHdvdWxkIGxpa2UgdG8gZW51bWVyYXRlIHRo ZSBlbGVtZW50cyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLgogICBNb3JlIHBy ZWNpc2VseSwgd2Ugd291bGQgbGlrZSB0byBjb25zdHJ1Y3QgYW4gaXRlcmF0 b3IsIHRoYXQgaXMsCiAgIGFuIGFuIG9uLWRlbWFuZCBwcm9kdWNlciBvZiBl bGVtZW50cy4gSGVyZSBpcyBhIHNpbXBsZSBkZWZpbml0aW9uCiAgIG9mIGEg c3RhdGVmdWwgaXRlcmF0b3I6ICopCgp0eXBlICdhIGl0ZXJhdG9yID0KICB1 bml0IC0+ICdhIG9wdGlvbgoKKCogVGhlIHF1ZXN0aW9uIGlzLCBjYW4gd2Ug Y29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgdHlwZSBbJ2Egc29tZXRy ZWVdLAogICBiYXNlZCBvbiBhbiBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCB2 aXNpdG9yLCBzbyB0aGF0IHRoZSBjb25zdHJ1Y3Rpb24gaXMKICAgZW50aXJl bHkgaW5kZXBlbmRlbnQgb2YgdGhlIHR5cGUgWydhIHNvbWV0cmVlXT8gKikK CigqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICopCgooKiBGb3Ig c3RhcnRlcnMsIGxldCB1cyBmaXJzdCBkZWZpbmUgY2FzY2FkZXMsIHdoaWNo IGFyZSBhIG1vcmUgcGxlYXNhbnQga2luZAogICBvZiBpdGVyYXRvcnMuIEEg Y2FzY2FkZSBpcyBhIHBlcnNpc3RlbnQgKHN0YXRlbGVzcykgaXRlcmF0b3Iu IEl0IGNhbiBiZQogICB0aG91Z2h0IG9mIGFzIGEgZGVsYXllZCBsaXN0LCB0 aGF0IGlzLCBhIGxpc3Qgd2hvc2UgZWxlbWVudHMgYXJlIGNvbXB1dGVkCiAg IG9ubHkgb24gZGVtYW5kLiAqKQoKKCogQ2FzY2FkZXMgY291bGQgKHNob3Vs ZCkgYmUgcGFydCBvZiBhIHNlcGFyYXRlIGxpYnJhcnkuIFRoZXJlIGlzIGlu IGZhY3QgYQogICBwcm9wb3NhbCB0byBhZGQgdGhlbSB0byBPQ2FtbCdzIHN0 YW5kYXJkIGxpYnJhcnk6IHNlZSB0aGUgZGlzY3Vzc2lvbiBhdAogICBodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDAyICopCgp0eXBl ICdhIGNhc2NhZGUgPQogIHVuaXQgLT4gJ2EgaGVhZAoKYW5kICdhIGhlYWQg PQogIHwgTmlsCiAgfCBDb25zIG9mICdhICogJ2EgY2FzY2FkZQoKKCogQSBk ZWxheWVkIGNvbXB1dGF0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGEgZnVuY3Rp b24gb2YgdHlwZSBbdW5pdCAtPiBfXS4KICAgVGh1cywgbm8gbWVtb2l6YXRp b24gdGFrZXMgcGxhY2UuIEl0IGlzIGVhc3kgdG8gaW1wbGVtZW50IGEgZnVu Y3Rpb24KICAgW21lbW86ICdhIGNhc2NhZGUgLT4gJ2EgY2FzY2FkZV0gdGhh dCB0dXJucyBhIG5vbm1lbW9pemluZyBjYXNjYWRlIGludG8KICAgYSBtZW1v aXppbmcgb25lLCBzbyBtZW1vaXphdGlvbiBjYW4gYmUgcmVxdWVzdGVkIGEg cG9zdGVyaW9yaSwgaWYKICAgZGVzaXJlZC4gKikKCigqIFRoZSBlbXB0eSBj YXNjYWRlLiAqKQoKbGV0IG5pbCA6ICdhIGNhc2NhZGUgPQogIGZ1biAoKSAt PiBOaWwKCigqIEZvcmNpbmcgYSBjYXNjYWRlIHJldmVhbHMgaXRzIGhlYWQu ICopCgpsZXQgZm9yY2UgeHMgPQogIHhzKCkKCigqIEEgY2FzY2FkZSBjYW4g YmUgZWFzaWx5IGNvbnZlcnRlZCB0byBhIHN0YXRlZnVsIGl0ZXJhdG9yLiAq KQoKbGV0IGNhc2NhZGVfdG9faXRlcmF0b3IgKHhzIDogJ2EgY2FzY2FkZSkg OiAnYSBpdGVyYXRvciA9CiAgbGV0IHMgPSByZWYgeHMgaW4KICBmdW4gKCkg LT4KICAgIG1hdGNoIGZvcmNlICFzIHdpdGgKICAgIHwgTmlsIC0+CiAgICAg ICAgKCogV3JpdGluZyBbbmlsXSBpbnRvIFtzXSBtYXkgc2VlbSBzdXBlcmZs dW91cywgYnV0IGlzIGluIGZhY3QKICAgICAgICAgICBuZWNlc3NhcnkgdG8g Z3VhcmFudGVlIHRoYXQgdGhlIGNvbXB1dGF0aW9uIHRoYXQganVzdCBsZWQg dG8KICAgICAgICAgICBhIFtOaWxdIG91dGNvbWUgaXMgbm90IHJlcGVhdGVk IGluIHRoZSBmdXR1cmUuICopCiAgICAgICAgcyA6PSBuaWw7CiAgICAgICAg Tm9uZQogICAgfCBDb25zICh4LCB4cykgLT4KICAgICAgICBzIDo9IHhzOwog ICAgICAgIFNvbWUgeAoKKCogQmVjYXVzZSBjYXNjYWRlcyBhcmUgY2xvc2Ug Y291c2lucyBvZiBsaXN0cywgdGhleSBhcmUgZWFzeSB0byB3b3JrIHdpdGgu CiAgIENvbnN0cnVjdGluZyBhIGNhc2NhZGUgZm9yIGEgdHJlZS1saWtlIGRh dGEgc3RydWN0dXJlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwKICAgd2hlcmVhcyBk aXJlY3RseSBjb25zdHJ1Y3RpbmcgYSBzdGF0ZWZ1bCBpdGVyYXRvciB3b3Vs ZCBiZSBtb3JlIGludm9sdmVkLiAqKQoKKCogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0gKikKCigqIE5vdywgY2FuIHdlIHVzZSBzb21lIGtpbmQg b2YgdmlzaXRvciB0byB0dXJuIGEgdHJlZSBvZiB0eXBlIFsnYSBzb21ldHJl ZV0KICAgaW50byBhIGNhc2NhZGUgb2YgdHlwZSBbJ2EgY2FzY2FkZV0/ICop CgooKiBBdCBmaXJzdCBzaWdodCwgdGhpcyBkb2VzIG5vdCBzZWVtIHZlcnkg ZWFzeSwgZm9yIHR3byByZWFzb25zOiAxLSBhIHZpc2l0b3IKICAgdXN1YWxs eSB0cmF2ZXJzZXMgYSB0cmVlIGluIGFuIGVhZ2VyIG1hbm5lciwgd2hlcmVh cyB3ZSBuZWVkIHRoZSB0cmF2ZXJzYWwKICAgdG8gbWFrZSBwcm9ncmVzcyBv bmx5IGFzIGNhc2NhZGUgZWxlbWVudHMgYXJlIGRlbWFuZGVkOyBhbmQgMi0g YSB2aXNpdG9yCiAgIHBlcmZvcm1zIGEgYm90dG9tLXVwIGNvbXB1dGF0aW9u LCB3aXRob3V0IGEgbGVmdC10by1yaWdodCBiaWFzIChhc3N1bWluZwogICBt dXRhYmxlIHN0YXRlIGlzIG5vdCB1c2VkKSwgd2hlcmVhcyBhIGNhc2NhZGUg ZW51bWVyYXRlcyBlbGVtZW50cyBpbiBhCiAgIGxlZnQtdG8tcmlnaHQgbWFu bmVyLiAoT3IgaW4gYSByaWdodC10by1sZWZ0IG1hbm5lci4gQXMgd2lsbCBi ZSBhcHBhcmVudAogICBiZWxvdywgYm90aCBkaXJlY3Rpb25zIGFyZSBwb3Nz aWJsZS4pICopCgooKiBUaGUgdHJpY2sgaXMgdG8gdXNlIGFub3RoZXIgaW50 ZXJtZWRpYXRlIHN0ZXAuIEluc3RlYWQgb2YgdHVybmluZyBhIHRyZWUKICAg ZGlyZWN0bHkgaW50byBhIGNhc2NhZGUsIHdlIGZpcnN0IHRyYW5zZm9ybSBp dCBpbnRvIGEgZ2VuZXJpYyB0cmVlLWxpa2UKICAgc3RydWN0dXJlOiBhICpk ZWxheWVkIHRyZWUqLiBQcm9ibGVtIDEgaXMgc29sdmVkIGJlY2F1c2UsIGJ5 IGludHJvZHVjaW5nCiAgIGRlbGF5cyBpbnRvIHRoZSBuZXcgdHJlZSwgd2Ug YWxsb3cgaXRzIGNvbnN0cnVjdGlvbiB0byBiZSBjYXJyaWVkIG91dCBvbgog ICBkZW1hbmQuIFByb2JsZW0gMiBpcyBzb2x2ZWQgYmVjYXVzZSB0aGlzIHRy ZWUtdG8tdHJlZSB0cmFuc2Zvcm1hdGlvbiBjYW4gYmUKICAgY2FycmllZCBv dXQgaW4gYSBwdXJlbHkgYm90dG9tLXVwIG1hbm5lciBieSBhIFtyZWR1Y2Vd IHZpc2l0b3IuIFRoZW4sCiAgIGZpbmFsbHksIGl0IGlzIHN0cmFpZ2h0Zm9y d2FyZCB0byB0cmFuc2Zvcm0gYSBkZWxheWVkIHRyZWUgaW50byBhCiAgIGNh c2NhZGUuICopCgooKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq KQoKKCogQSBkZWxheWVkIHRyZWUgY29udGFpbnMgb3JkaW5hcnkgbm9kZXMg b2YgYXJpdHkgMCwgMSwgYW5kIDIuIEZ1cnRoZXJtb3JlLAogICBpdCBjb250 YWlucyBbRFREZWxheV0gbm9kZXMsIG9mIGFyaXR5IDEsIHdob3NlIGNoaWxk IGlzIGRlbGF5ZWQsIHRoYXQgaXMsCiAgIGNvbXB1dGVkIG9ubHkgb24gZGVt YW5kLiAqKQoKdHlwZSAnYSBkZWxheWVkX3RyZWUgPQogIHwgRFRaZXJvCiAg fCBEVE9uZSBvZiAnYQogIHwgRFRUd28gb2YgJ2EgZGVsYXllZF90cmVlICog J2EgZGVsYXllZF90cmVlCiAgfCBEVERlbGF5IG9mICh1bml0IC0+ICdhIGRl bGF5ZWRfdHJlZSkKCigqIEEgZGVsYXllZCB0cmVlIGlzIGNvbnZlcnRlZCB0 byBhIGNhc2NhZGUgYXMgZm9sbG93cy4gV2UgbWF5IGNob29zZSwgYXQgdGhp cwogICBwb2ludCwgYmV0d2VlbiBsZWZ0LXRvLXJpZ2h0IGFuZCByaWdodC10 by1sZWZ0IHRyYXZlcnNhbHMuIEFzIHVzdWFsLCB3aGVuCiAgIGJ1aWxkaW5n IGEgY2FzY2FkZSwgb25lIG11c3QgdGFrZSBhIGNvbnRpbnVhdGlvbiBba10g YXMgYW4gYXJndW1lbnQsIHNvIGFzCiAgIHRvIGF2b2lkIG5haXZlIGFuZCBj b3N0bHkgY2FzY2FkZSBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMuICopCgps ZXQgcmVjIGRlbGF5ZWRfdHJlZV90b19jYXNjYWRlIChkdCA6ICdhIGRlbGF5 ZWRfdHJlZSkgKGsgOiAnYSBjYXNjYWRlKQo6ICdhIGNhc2NhZGUgPQogIGZ1 biAoKSAtPiBkZWxheWVkX3RyZWVfdG9faGVhZCBkdCBrCgphbmQgZGVsYXll ZF90cmVlX3RvX2hlYWQgKGR0IDogJ2EgZGVsYXllZF90cmVlKSAoayA6ICdh IGNhc2NhZGUpIDogJ2EgaGVhZCA9CiAgbWF0Y2ggZHQgd2l0aAogIHwgRFRa ZXJvIC0+CiAgICAgIGZvcmNlIGsKICB8IERUT25lIHggLT4KICAgICBDb25z ICh4LCBrKQogIHwgRFRUd28gKGR0MSwgZHQyKSAtPgogICAgIGRlbGF5ZWRf dHJlZV90b19oZWFkIGR0MSAoZGVsYXllZF90cmVlX3RvX2Nhc2NhZGUgZHQy IGspCiAgfCBEVERlbGF5IGR0IC0+CiAgICAgZGVsYXllZF90cmVlX3RvX2hl YWQgKGZvcmNlIGR0KSBrCgpsZXQgZGVsYXllZF90cmVlX3RvX2Nhc2NhZGUg KGR0IDogJ2EgZGVsYXllZF90cmVlKSA6ICdhIGNhc2NhZGUgPQogIGRlbGF5 ZWRfdHJlZV90b19jYXNjYWRlIGR0IG5pbAoKbGV0IGRlbGF5ZWRfdHJlZV90 b19pdGVyYXRvciAoZHQgOiAnYSBkZWxheWVkX3RyZWUpIDogJ2EgaXRlcmF0 b3IgPQogIGNhc2NhZGVfdG9faXRlcmF0b3IgKGRlbGF5ZWRfdHJlZV90b19j YXNjYWRlIGR0KQoKKCogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g KikKCigqIFdlIG5vdyBzZXQgdXAgZm91ciBjb25zdHJ1Y3RvciBmdW5jdGlv bnMgYW5kIGNvbnN0cnVjdG9yIG1ldGhvZHMsIHdoaWNoCiAgIGNvbnN0cnVj dCBkZWxheWVkIHRyZWVzLCBhbmQgd2hpY2ggd2Ugd2lsbCB1c2UgaW4gYSBb cmVkdWNlXSB2aXNpdG9yLiAqKQoKKCogVGhlIHR5cGUgWydhIGRlbGF5XSBp cyBhIHN5bm9ueW0gZm9yIFsnYV0uIEl0IGlzIHVzZWQgYXMgYSBkZWNvcmF0 aW9uLCBpbiBhCiAgIHR5cGUgZGVmaW5pdGlvbiwgdG8gaW5kaWNhdGUgdGhh dCBhIGNhbGwgdG8gdGhlIG1ldGhvZCBbdmlzaXRfZGVsYXldIGlzCiAgIGRl c2lyZWQuICopCgp0eXBlICdhIGRlbGF5ID0gJ2EKCmNsYXNzIFsnc2VsZl0g ZGVsYXllZF90cmVlX21vbm9pZCA9IG9iamVjdCAoXyA6ICdzZWxmKQoKICAo KiBEZWxheWVkIHRyZWVzIGZvcm0gYSBtb25vaWQsIGluIHRoZSBzZW5zZSB0 aGF0IHdlIGNvbmNhdGVuYXRlIHRoZW0gdXNpbmcKICAgICBbRFRUd29dLCBh bmQgdGhlIG5ldXRyYWwgZWxlbWVudCBpcyBbRFRaZXJvXS4gV2UgcGFja2Fn ZSB0aGVzZSB0d28gZGF0YQogICAgIGNvbnN0cnVjdG9ycyBpbiB0aGUgbWV0 aG9kcyBbemVyb10gYW5kIFtwbHVzXSwgd2hpY2ggYXJlIGF1dG9tYXRpY2Fs bHkKICAgICBjYWxsZWQgaW4gYW4gYXV0b21hdGljYWxseS1nZW5lcmF0ZWQg W3JlZHVjZV0gdmlzaXRvci4gKikKCiAgbWV0aG9kIHplcm8gPQogICAgRFRa ZXJvCgogIG1ldGhvZCBwbHVzIHMxIHMyID0KICAgIG1hdGNoIHMxLCBzMiB3 aXRoCiAgICB8IERUWmVybywgcwogICAgfCBzLCBEVFplcm8gLT4KICAgICAg ICAoKiBUaGlzIG9wdGltaXphdGlvbiBpcyBub3QgbWFuZGF0b3J5LiBJdCBo ZWxwcyBhbGxvY2F0ZSBmZXdlciBub2Rlcy4gKikKICAgICAgICBzCiAgICB8 IF8sIF8gLT4KICAgICAgICBEVFR3byAoczEsIHMyKQoKICAoKiBUaGUgdmlz aXRvciBtZXRob2QgW3Zpc2l0X2RlbGF5XSBkZWxheXMgdGhlIHZpc2l0IG9m IGEgc3VidHJlZSBieQogICAgIGNvbnN0cnVjdGluZyBhbmQgcmV0dXJuaW5n IGEgW0RURGVsYXldIG5vZGUsIHdoaWNoIGNhcnJpZXMgYSBkZWxheWVkCiAg ICAgcmVjdXJzaXZlIGNhbGwgdG8gYSB2aXNpdG9yLiAqKQoKICBtZXRob2Qg dmlzaXRfZGVsYXk6ICdlbnYgJ2EgLgogICAgKCdlbnYgLT4gJ2EgLT4gJ2Ig ZGVsYXllZF90cmVlKSAtPgogICAgJ2VudiAtPiAnYSBkZWxheSAtPiAnYiBk ZWxheWVkX3RyZWUKICA9IGZ1biB2aXNpdF8nYSBlbnYgeCAtPgogICAgICBE VERlbGF5IChmdW4gKCkgLT4gdmlzaXRfJ2EgZW52IHgpCgplbmQKCigqIFRo ZSB2aXNpdG9yIGZ1bmN0aW9uIFt5aWVsZF0gd2lsbCBiZSBpbnZva2VkIGF0 IGVsZW1lbnRzIG9mIHR5cGUgWydhXS4KICAgSXQgY29uc3RydWN0cyBhIG9u ZS1lbGVtZW50IGRlbGF5ZWQgdHJlZS4gKikKCmxldCB5aWVsZCBfZW52IHgg PQogIERUT25lIHgKCigqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t ICopCgooKiBJdCBpcyBub3cgdGltZSB0byBnZW5lcmF0ZSBhIFtyZWR1Y2Vd IHZpc2l0b3IgZm9yIHRoZSB0eXBlIFsnYSBzb21ldHJlZV0uCiAgIFRoaXMg aXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgY29kZSB3aGljaCBpcyBzcGVjaWZp YyBvZiBbc29tZXRyZWVdLgogICBFdmVyeXRoaW5nIGVsc2UgaXMgZ2VuZXJp Yy4gKikKCigqIFdlIG11c3QgaW5zZXJ0IFtkZWxheV1zIGludG8gdGhlIHN0 cnVjdHVyZSBvZiB0aGUgdHlwZSBbJ2Egc29tZXRyZWVdIHNvIGFzCiAgIHRv IGluZGljYXRlIHdoZXJlIFt2aXNpdF9kZWxheV0gc2hvdWxkIGJlIGNhbGxl ZCBhbmQgKHRoZXJlZm9yZSkgd2hlcmUKICAgW0RURGVsYXldIG5vZGVzIHNo b3VsZCBiZSBhbGxvY2F0ZWQuIFRvIGRvIHRoaXMsIHdlIHdyaXRlIGEgY29w eSBvZiB0aGUKICAgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZSBbJ2Egc29tZXRy ZWVdLCB3aXRoIGV4dHJhIGRlbGF5cyBpbiBpdC4gVGhlIG5ldyB0eXBlCiAg IGlzIGFjdHVhbGx5IGNvbnNpZGVyZWQgZXF1YWwgdG8gWydhIHNvbWV0cmVl XSBieSBPQ2FtbC4gSXRzIHJvbGUgaXMgcHVyZWx5CiAgIHRvIGNhcnJ5IGEg W0BAZGVyaXZpbmcgdmlzaXRvcnNdIGFubm90YXRpb24uICopCgooKiBJbiB0 aGUgZGF0YSBjb25zdHJ1Y3RvciBbTm9kZV0sIHRoZSBsZWZ0LWhhbmQgW2Rl bGF5XSBpcyBpbiBmYWN0CiAgIHN1cGVyZmx1b3VzLiBXaXRoIG9yIHdpdGhv dXQgaXQsIG91ciBpdGVyYXRvcnMgd2lsbCBlYWdlcmx5IGRlc2NlbmQgYWxv bmcKICAgdGhlIGxlZnRtb3N0IGJyYW5jaCBvZiBhIHRyZWUsIGFueXdheS4g KikKCnR5cGUgJ2EgbXl0cmVlID0gJ2Egc29tZXRyZWUgPQogIHwgTGVhZgog IHwgTm9kZSBvZiAnYSBteXRyZWUgZGVsYXkgKiAnYSAqICdhIG15dHJlZSBk ZWxheQoKYW5kICdhIG15dHJlZV9kZWxheSA9CiAgJ2EgbXl0cmVlIGRlbGF5 CgpbQEBkZXJpdmluZyB2aXNpdG9ycyB7IHZhcmlldHkgPSAicmVkdWNlIjsg cG9seW1vcnBoaWMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgIGNv bmNyZXRlID0gdHJ1ZTsgYW5jZXN0b3JzID0gWyJkZWxheWVkX3RyZWVfbW9u b2lkIl0gfV0KCigqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICop CgooKiBGb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcywgbGV0IHVzIG1ha2Ug b3VyIHZpc2l0b3IgdmVyYm9zZS4gKikKCmNsYXNzIFsnc2VsZl0gdmVyYm9z ZV9yZWR1Y2UgPSBvYmplY3QgKF8gOiAnc2VsZikKICBpbmhlcml0IFtfXSBy ZWR1Y2UgYXMgc3VwZXIKICBtZXRob2QhIHZpc2l0X0xlYWYgdmlzaXRfJ2Eg ZW52ID0KICAgIFByaW50Zi5wcmludGYgIlZpc2l0aW5nIGEgbGVhZi5cbiUh IjsKICAgIHN1cGVyI3Zpc2l0X0xlYWYgdmlzaXRfJ2EgZW52CiAgbWV0aG9k ISB2aXNpdF9Ob2RlIHZpc2l0XydhIGVudiB0MSB4IHQyID0KICAgIFByaW50 Zi5wcmludGYgIlZpc2l0aW5nIGEgbm9kZS5cbiUhIjsKICAgIHN1cGVyI3Zp c2l0X05vZGUgdmlzaXRfJ2EgZW52IHQxIHggdDIKZW5kCgooKiBJbiBwcm9k dWN0aW9uLCBvbmUgc2hvdWxkIHJlbW92ZSBbdmVyYm9zZV9yZWR1Y2VdIGFu ZCB1c2UgW3JlZHVjZV0KICAgaW5zdGVhZC4gKikKCmxldCBzb21ldHJlZV90 b19kZWxheWVkX3RyZWUgKHQgOiAnYSBzb21ldHJlZSkgPQogIG5ldyB2ZXJi b3NlX3JlZHVjZSAjIHZpc2l0X215dHJlZV9kZWxheSB5aWVsZCAoKSB0CiAg ICAoKiBXZSB1c2UgW3Zpc2l0X215dHJlZV9kZWxheV0sIGV2ZW4gdGhvdWdo IFt2aXNpdF9teXRyZWVdIHdvdWxkIHdvcmsKICAgICAgIGp1c3QgYXMgd2Vs bCwgc28gYXMgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGEgZGVsYXllZCB0cmVl IHdob3NlIHJvb3QKICAgICAgIGlzIGEgW0RURGVsYXldIG5vZGUuICopCgoo KiBQcm9ibGVtIHNvbHZlZCEgKikKCmxldCBzb21ldHJlZV90b19pdGVyYXRv ciAodCA6ICdhIHNvbWV0cmVlKSA6ICdhIGl0ZXJhdG9yID0KICBkZWxheWVk X3RyZWVfdG9faXRlcmF0b3IgKHNvbWV0cmVlX3RvX2RlbGF5ZWRfdHJlZSB0 KQoKKCogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKikKCigqIERl bW8uICopCgpsZXQgdCA6IGludCBzb21ldHJlZSA9CiAgTm9kZSAoTm9kZSAo TGVhZiwgMSwgTGVhZiksIDIsIE5vZGUgKExlYWYsIDMsIExlYWYpKQoKbGV0 IGkgOiBpbnQgaXRlcmF0b3IgPQogIHNvbWV0cmVlX3RvX2l0ZXJhdG9yIHQK CigqIFRyYW5zY3JpcHQgb2YgYW4gT0NhbWwgdG9wbGV2ZWwgc2Vzc2lvbjoK CiAgIyBpKCk7OwogIFZpc2l0aW5nIGEgbm9kZS4KICBWaXNpdGluZyBhIG5v ZGUuCiAgVmlzaXRpbmcgYSBsZWFmLgogIC0gOiBpbnQgb3B0aW9uID0gU29t ZSAxCiAgIyBpKCk7OwogIFZpc2l0aW5nIGEgbGVhZi4KICAtIDogaW50IG9w dGlvbiA9IFNvbWUgMgogICMgaSgpOzsKICBWaXNpdGluZyBhIG5vZGUuCiAg VmlzaXRpbmcgYSBsZWFmLgogIC0gOiBpbnQgb3B0aW9uID0gU29tZSAzCiAg IyBpKCk7OwogIFZpc2l0aW5nIGEgbGVhZi4KICAtIDogaW50IG9wdGlvbiA9 IE5vbmUKICAjIGkoKTs7CiAgLSA6IGludCBvcHRpb24gPSBOb25lCgogKikK --------------020202010108040703000804--