From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=AWL,NO_REAL_NAME autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by yquem.inria.fr (Postfix) with ESMTP id 70DFCBBAF; Tue, 10 Jun 2008 16:28:00 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkwAAHgsTkjPLfooo2dsb2JhbACQZiqBAAEBAQEBAQcFCAcRnTU X-IronPort-AV: E=Sophos;i="4.27,617,1204498800"; d="diff'?ml'?scan'208";a="13559288" Received: from discorde.inria.fr ([192.93.2.38]) by mail1-smtp-roc.national.inria.fr with ESMTP; 10 Jun 2008 16:28:00 +0200 Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id m5AERx1Q030199 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK); Tue, 10 Jun 2008 16:28:00 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkwAAHgsTkjPLfooo2dsb2JhbACQZiqBAAEBAQEBAQcFCAcRnTU X-IronPort-AV: E=Sophos;i="4.27,617,1204498800"; d="diff'?ml'?scan'208";a="13559283" Received: from parmail06.sgcib.com ([207.45.250.40]) by mail1-smtp-roc.national.inria.fr with ESMTP; 10 Jun 2008 16:27:59 +0200 X-IronPort-AV: i="4.27,617,1204498800"; d="diff'?ml'?scan'208"; a="111740204:sNHT83881784" Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C8CB05.CE164985" X-MimeOLE: Produced By Microsoft Exchange V6.5 Subject: RE: [Caml-list] First release of Oug: reference graph from ocaml code Date: Tue, 10 Jun 2008 16:25:17 +0200 Message-ID: <0172C3AE3A0E964797AF43E206C1048F015DD793@FRCOR-EXMB06.europe.am.socgen> In-Reply-To: <20080610094002.639b2355@alcazar.inria.fr> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [Caml-list] First release of Oug: reference graph from ocaml code Thread-Index: AcjKzJSWKzElQegrRjS4qWztansn8QAOBc/w References: <20080603183856.1f30687a@alcazar.inria.fr><0172C3AE3A0E964797AF43E206C1048F015DD78F@FRCOR-EXMB06.europe.am.socgen><20080609134309.26fc56f3@alcazar.inria.fr><0172C3AE3A0E964797AF43E206C1048F015DD792@FRCOR-EXMB06.europe.am.socgen> <20080610094002.639b2355@alcazar.inria.fr> From: To: Cc: X-OriginalArrivalTime: 10 Jun 2008 14:25:17.0694 (UTC) FILETIME=[CE53E9E0:01C8CB05] X-NAI-Spam-Score: -2.5 X-Miltered: at discorde with ID 484E8F6F.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; ocaml:01 environement:01 execvp:01 execvp:01 redefined:01 maxence:01 guesdon:01 maxence:01 guesdon:01 ocaml:01 ocamlc:01 patched:01 unauthorised:98 subsidiaries:98 interdite:98 X-Attachments: type="application/octet-stream" name="conf_script.diff" name="conf_script.diff" type="application/octet-stream" name="checkocaml_win.ml" name="checkocaml_win.ml" This is a multi-part message in MIME format. ------_=_NextPart_001_01C8CB05.CE164985 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Here is an adaptation of your script to handle both windows and unix enviro= nement. The idea is to replace call to fork with create_process. I mainly define a Win32Exe module, defining both functions execvp_to_list and execvp_redirect. The win32 users should simply open the module. Some variable were also redefined to support both cases (path separator, ..= .). I also had some exceptions when the call to Unix.single_write was called, s= o I replaced it to Unix.write in the win32 case. The rest is kept unchanged. I am adding the modified checkocaml.ml -> checkocaml_win.ml along with the Diff file: diff -w checkocaml_win.ml checkocaml.ml > conf_script.diff Please feel free to contact me if you need more precisions. Sincerely, Rabih Chaar -----Message d'origine----- De=A0: Maxence Guesdon [mailto:maxence.guesdon@inria.fr]=20 Envoy=E9=A0: mardi 10 juin 2008 09:40 =C0=A0: EL CHAAR Rabih SGAM/AI/SAM Cc=A0: caml-list@inria.fr Objet=A0: Re: [Caml-list] First release of Oug: reference graph from ocaml = code On Mon, 9 Jun 2008 20:03:08 +0200 wrote: > Thanks for yor reply. > After some investigations, the tool seems to be only targetting a unix ve= rsion of ocaml. Indeed. I have no Microsoft Windows. > Some things in checkocaml.ml are easy to patch, like the separator ":" or= ";" according to Sys.os_type. Also the distribution generates ocamlc.exe, = which fails the search in function find_in_path. >=20 > Nevertheless, there are some calls to fork which is not supported in MSVC= distrib. I didn't look more thoroughly to see if this can be patched. >=20 > Is there a plan to deliver a portable version of the tool? Not from me, but I can integrate another contributed configuration script. Regards, Maxence Guesdon This message and any attachments (the "message") are confidential, intended= solely for the addressee(s), and may contain legally privileged informatio= n=2E=20 Any unauthorised use or dissemination is prohibited.=20 E-mails are susceptible to alteration.=20 Neither Societe Generale Asset Management nor any of its subsidiaries or af= filiates shall be liable for the message if altered, changed or falsified.=20 =20 Find out more about Societe Generale Asset Management's proposal on www.sga= m=2Ecom =20 ********=20 =20 Ce message et toutes les pieces jointes (ci-apres le "message") sont confid= entiels et susceptibles de contenir des informations couvertes par le secre= t professionnel. Ce message est etabli a l'intention exclusive de ses destinataires. Toute utilisation ou diffusion non autorisee est interdite.=20 Tout message electronique est susceptible d'alteration. Societe Generale As= set Management et ses filiales declinent toute responsabilite au titre de c= e message s'il a ete altere, deforme ou falsifie.=20 Decouvrez l'offre et les services de Societe Generale Asset Management sur = le site www.sgam.fr ------_=_NextPart_001_01C8CB05.CE164985 Content-Type: application/octet-stream; name="conf_script.diff" Content-Transfer-Encoding: base64 Content-Description: conf_script.diff Content-Disposition: attachment; filename="conf_script.diff" MzZkMzUKPCBsZXQgXyA9IFByaW50ZXhjLnJlY29yZF9iYWNrdHJhY2UgdHJ1ZQo4Myw5MGQ4MQo8 ICAgKCogdGFraW5nIG91dCBzcGFjZXMgYXQgZW5kIDogcHJvYmxlbXMgb2NjdXJpbmcgdW5kZXIg d2luZG93cyBidWlsZCAqKQo8ICAgbGV0IHJlYyB0cmltX3JpZ2h0IHMgPQo8ICAgICBsZXQgbGVu Z3RoID0gU3RyaW5nLmxlbmd0aCBzIGluCjwgICAgIG1hdGNoIHMuW2xlbmd0aC0xXSB3aXRoCjwg ICAgIHwnICd8J1xuJ3wnXHInfCdcdCcgLT4gdHJpbV9yaWdodCAoU3RyaW5nLnN1YiBzIDAgKGxl bmd0aC0xKSkKPCAgICAgfF8gLT4gcyBpbgo8ICAgbGV0IHN1ZiA9IHRyaW1fcmlnaHQgc3VmIGlu CjwgICBsZXQgcyA9IHRyaW1fcmlnaHQgcyBpbgoxMzAsMTM0YzEyMQo8IGxldCBwYXRoX3NlcCA9 CjwgICBtYXRjaCAoU3lzLm9zX3R5cGUgPSAiV2luMzIiKXdpdGgKPCAgIHxmYWxzZSAtPiI6Igo8 ICAgfHRydWUgLT4gIjsiOzsKPCAKLS0tCj4gbGV0IHBhdGhfc2VwID0gIjoiOzsKMTUzLDE1NmMx NDAKPCBsZXQgZ2V0X3BhdGggKCkgPQo8ICAgbGV0IHMgPSBsaXN0X29mX3BhdGggKGdldGVudiAi UEFUSCIpIGluCjwgKCogICBMaXN0Lml0ZXIgcHJpbnRfZW5kbGluZSBzOyAqKQo8ICAgczs7Ci0t LQo+IGxldCBnZXRfcGF0aCAoKSA9IGxpc3Rfb2ZfcGF0aCAoZ2V0ZW52ICJQQVRIIik7OwoyMzMs MjM4ZDIxNgo8ICgqIHBhdGNoIHNpbmdsZV93cml0ZSByYWlzaW5nIGV4Y2VwdGlvbnMgdW5kZXIg d2luZG93cyAqKQo8IGxldCBzaW5nbGVfd3JpdGUgPQo8ICAgbWF0Y2ggKFN5cy5vc190eXBlID0g IldpbjMyIil3aXRoCjwgICB8dHJ1ZSAtPiB3cml0ZQo8ICAgfGZhbHNlIC0+IHNpbmdsZV93cml0 ZQo8IAozMDZkMjgzCjwgCjM5OCw1MjRkMzc0CjwgCjwgKCogd3JhcHBpbmcgZXhlY3V0aW9uIGFu ZCBmb3JrIHVzZSB0byBiZSB3aW5kb3dzIGNvbXBsaWFudCwKPCAgICB1c2luZyB0aGVyZWZvcmUg Y3JlYXRlX3Byb2Nlc3MgKikKPCBtb2R1bGUgV2luRXhlYyA9CjwgICBzdHJ1Y3QKPCAgICAgbGV0 IHJlYWRfdGV4dF9maWxlIGYgPQo8ICAgICAgIGxldCBpYyA9IG9wZW5faW4gZiBpbgo8ICAgICAg IGxldCByZWMgcmVhZCBzID0KPCAgICAgICAgIHRyeQo8ICAgICAgICAgICBsZXQgbGluZSA9IGlu cHV0X2xpbmUgaWMgaW4KPCAgICAgICAgICAgcmVhZCAobGluZTo6cykKPCAgICAgICAgIHdpdGgg RW5kX29mX2ZpbGUgLT4KPCAgICAgICAgICAgKExpc3QucmV2IHMpIGluCjwgICAgICAgbGV0IHMg PSByZWFkIFtdIGluCjwgICAgICAgY2xvc2VfaW4gaWM7CjwgICAgICAgcwo8IAo8ICAgICBsZXQg Y2xlYXIgZiA9CjwgICAgICAgdHJ5CjwgICAgICAgICBTeXMucmVtb3ZlIGYKPCAgICAgICB3aXRo IF8gLT4gKCkKPCAKPCAgICAgbGV0IGRlZmF1bHRfdGVtcF9kaXIgPSAiQzovdGVtcC8iCjwgICAg IGxldCBleGVjdnBfdG9fbGlzdCBjbWQgYXJncyA9CjwgICAgICAgKCogd2UgY3JlYXRlIGZpbGUg YmFzZWQgc3RkaW4gYW5kIHN0ZG91dCwgZ2l2aW5nIHRoZSB0ZW1wIGRpciAqKQo8ICAgICAgIGxl dCBkaXIgPQo8ICAgICAgICAgdHJ5CjwgICAgICAgICAgIFVuaXguZ2V0ZW52ICJURU1QIgo8ICAg ICAgICAgd2l0aCBfIC0+IGRlZmF1bHRfdGVtcF9kaXIgaW4KPCAgICAgICBsZXQgbWFrZUZpbGUg ZGlyIHRhZyA9CjwgICAgICAgICBsZXQgbWFrZUFkZGVuZCAoKT0KPCAgICAgICAgICAgbGV0IGFk ZGVuZCA9IFJhbmRvbS5pbnQgMjAwMDAgaW4KPCAgICAgICAgICAgRGlnZXN0LnRvX2hleCAoRGln ZXN0LnN0cmluZyAoTWFyc2hhbC50b19zdHJpbmcgYWRkZW5kIFtdKSkgaW4KPCAgICAgICAgIGxl dCBmaWxlID0gcmVmIChkaXJebWFrZUFkZGVuZCgpXnRhZykgaW4KPCAgICAgICAgIHdoaWxlIChT eXMuZmlsZV9leGlzdHMgIWZpbGUpIGRvCjwgICAgICAgICAgIGZpbGUgOj0gZGlyXm1ha2VBZGRl bmQoKV50YWc7CjwgICAgICAgICBkb25lOwo8ICAgICAgICAgIWZpbGUgaW4KPCAgICAgICBsZXQg b3V0cHV0ID0gbWFrZUZpbGUgZGlyICJvdXRwdXQudHh0IiBpbgo8ICAgICAgIGxldCBlcnJvciA9 IG1ha2VGaWxlIGRpciAiZXJyLnR4dCIgaW4KPCAgICAgICBsZXQgKHNpbCxzb3Isc2VyKSA9Cjwg ICAgICAgICBsZXQgc2lsLCBzaXIgPSBwaXBlICgpIGluCjwgICAgICAgICBsZXQgc29yID0gVW5p eC5vcGVuZmlsZSBvdXRwdXQgW09fV1JPTkxZO09fQ1JFQVRdIDBvNjQwIGluCjwgICAgICAgICBs ZXQgc2VyID0gVW5peC5vcGVuZmlsZSBlcnJvciBbT19XUk9OTFk7T19DUkVBVF0gMG82NDAgaW4K PCAgICAgICAgIChzaWwsc29yLHNlcikgaW4KPCAgICAgICBsZXQgcGlkID0KPCAgICAgICAgIGNy ZWF0ZV9wcm9jZXNzX2VudiBjbWQgKEFycmF5LmFwcGVuZCBbfCBjbWQgfF0gYXJncykgKFVuaXgu ZW52aXJvbm1lbnQoKSkKPCAgICAgICAgICAgc2lsIHNvciBzZXIgaW4KPCAgICAgICBsZXQgXyxz dGF0dXMgPSBVbml4LndhaXRwaWQgW10gcGlkIGluCjwgICAgICAgVW5peC5jbG9zZSBzb3I7Cjwg ICAgICAgVW5peC5jbG9zZSBzZXI7CjwgICAgICAgbWF0Y2ggc3RhdHVzIHdpdGgKPCAgICAgICB8 IFdFWElURUQgMCAtPgo8ICAgICAgICAgICBsZXQgcmVzID0gcmVhZF90ZXh0X2ZpbGUgb3V0cHV0 IGluCjwgICAgICAgICAgIGNsZWFyIG91dHB1dDsKPCAgICAgICAgICAgY2xlYXIgZXJyb3I7Cjwg ICAgICAgICAgIHJlcwo8ICAgICAgIHwgV0VYSVRFRCBpIC0+CjwgICAgICAgICAgIGxldCBlcnJv clRyYWNlID1yZWFkX3RleHRfZmlsZSBlcnJvciBpbgo8ICAgICAgICAgICAoKiB3ZSBjYW4gcHJp bnQgdGhlIGVycm9yIHRyYWNlIGlmIG5lZWRlZCAqKQo8ICAgICAgICAgICBjbGVhciBvdXRwdXQ7 CjwgICAgICAgICAgIGNsZWFyIGVycm9yOwo8ICAgICAgICAgICByYWlzZSBFeGVjX2ZhaWx1cmUK PCAgICAgICB8IF8gLT4KPCAgICAgICAgICAgY2xlYXIgb3V0cHV0Owo8ICAgICAgICAgICBjbGVh ciBlcnJvcjsKPCAgICAgICAgICAgcmFpc2UgRXhlY19mYWlsdXJlCjwgCjwgICAgIGxldCBleGVj dnBfcmVkaXJlY3QgcmVkaXJlY3Rpb25zIGNtZCBhcmdzICA9CjwgICAgICAgbGV0IHBlcm0gPSAw bzY0MCBpbgo8ICAgICAgIGxldCB0ZW1wX2ZpbGUgPQo8ICAgICAgICAgaWYgTGlzdC5leGlzdHMg KGZ1bmN0aW9uIEluX2Zyb21fc3RyaW5nIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2UpCjwgICAgICAg ICAgICAgcmVkaXJlY3Rpb25zCjwgICAgICAgICB0aGVuIFNvbWUgKGNyZWF0ZV90ZW1wX2ZpbGUg fmV4dDogIi5pbiIgKCkpCjwgICAgICAgICBlbHNlIE5vbmUgaW4KPCAgICAgICBsZXQgcmVjIG1h a2VfcmVkaXJlY3QgcmQgPQo8ICAgICAgICAgbWF0Y2ggcmQgd2l0aAo8ICAgICAgICAgICBJbl9m cm9tX2ZpbGUgZmlsZSAtPgo8ICAgICAgICAgICAgIGxldCBkZXNjX2ZpbGUgPSBvcGVuZmlsZSBm aWxlIFtPX1JET05MWV0gcGVybSBpbgo8ICAgICAgICAgICAgIHRyeV9maW5hbGl6ZSAoZHVwMiBk ZXNjX2ZpbGUpIHN0ZGluIGNsb3NlIGRlc2NfZmlsZQo8ICAgICAgICAgfCBPdXRfdG9fZmlsZSBm aWxlIC0+CjwgICAgICAgICAgICAgbGV0IGRlc2NfZmlsZSA9IG9wZW5maWxlIGZpbGUgW09fV1JP TkxZO09fQ1JFQVQ7T19UUlVOQ10gcGVybSBpbgo8ICAgICAgICAgICAgIHRyeV9maW5hbGl6ZSAo ZHVwMiBkZXNjX2ZpbGUpIHN0ZG91dCBjbG9zZSBkZXNjX2ZpbGUKPCAgICAgICAgIHwgRXJyX3Rv X2ZpbGUgZmlsZSAgLT4KPCAgICAgICAgICAgICBsZXQgZGVzY19maWxlID0gb3BlbmZpbGUgZmls ZSBbT19XUk9OTFk7T19DUkVBVDtPX1RSVU5DXSBwZXJtIGluCjwgICAgICAgICAgICAgdHJ5X2Zp bmFsaXplIChkdXAyIGRlc2NfZmlsZSkgc3RkZXJyIGNsb3NlIGRlc2NfZmlsZQo8ICAgICAgICAg fCBPdXRfYXBwZW5kX3RvX2ZpbGUgZmlsZSAtPgo8ICAgICAgICAgICAgIGxldCBkZXNjX2ZpbGUg PSBvcGVuZmlsZSBmaWxlIFtPX1dST05MWTtPX0FQUEVORDtPX0NSRUFUXSBwZXJtIGluCjwgICAg ICAgICAgICAgdHJ5X2ZpbmFsaXplIChkdXAyIGRlc2NfZmlsZSkgc3Rkb3V0IGNsb3NlIGRlc2Nf ZmlsZQo8ICAgICAgICAgfCBFcnJfdG9fb3V0IC0+IGR1cDIgc3Rkb3V0IHN0ZGVycgo8ICAgICAg ICAgfCBJbl9mcm9tX3N0cmluZyBzIC0+CjwgICAgICAgICAgICAgYmVnaW4gbWF0Y2ggdGVtcF9m aWxlIHdpdGgKPCAgICAgICAgICAgICAgIFNvbWUgdG1wIC0+CjwgICAgICAgICAgICAgICAgIGZp bGVfb2Zfc3RyaW5nIH5maWxlOiB0bXAgfmNvbnRlbnRzOiBzOwo8ICAgICAgICAgICAgICAgICBt YWtlX3JlZGlyZWN0IChJbl9mcm9tX2ZpbGUgdG1wKTsKPCAgICAgICAgICAgICB8IE5vbmUgLT4g YXNzZXJ0IGZhbHNlCjwgICAgICAgICAgICAgZW5kCjwgICAgICAgICB8IE91dF9udWxsIC0+Cjwg ICAgICAgICAgICAgbWFrZV9yZWRpcmVjdCAoT3V0X3RvX2ZpbGUgIi9kZXYvbnVsbCIpCjwgICAg ICAgICB8IEVycl9udWxsIC0+CjwgICAgICAgICAgICAgbWFrZV9yZWRpcmVjdCAoRXJyX3RvX2Zp bGUgIi9kZXYvbnVsbCIpCjwgICAgICAgICB8IFNpbGVudCAtPgo8ICAgICAgICAgICAgIG1ha2Vf cmVkaXJlY3QgT3V0X251bGw7CjwgICAgICAgICAgICAgbWFrZV9yZWRpcmVjdCBFcnJfdG9fb3V0 Owo8ICAgICAgIGluCjwgICAgICAgKCogd2Ugc2F2ZSBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIgdG8g cmVzdG9yZSB0aGVtIGFmdGVyIGZvcmsgKikKPCAgICAgICBsZXQgc3Rkb3V0X2JhY2sgPSBVbml4 LmR1cCBVbml4LnN0ZG91dCBpbgo8ICAgICAgIGxldCBzdGRlcnJfYmFjayA9IFVuaXguZHVwIFVu aXguc3RkZXJyIGluCjwgICAgICAgbGV0IHN0ZGluX2JhY2sgPSBVbml4LmR1cCBVbml4LnN0ZGlu IGluCjwgICAgICAgTGlzdC5pdGVyIG1ha2VfcmVkaXJlY3QgcmVkaXJlY3Rpb25zOwo8ICAgICAg IGxldCBwaWQgPSBjcmVhdGVfcHJvY2VzcyBjbWQgKEFycmF5LmFwcGVuZCBbfGNtZHxdIGFyZ3Mp IFVuaXguc3RkaW4gVW5peC5zdGRvdXQgVW5peC5zdGRlcnIgaW4KPCAgICAgICBsZXQgXyxyZXMg PSB3YWl0cGlkIFtdIHBpZCBpbgo8ICAgICAgIGJlZ2luIG1hdGNoIHRlbXBfZmlsZSB3aXRoCjwg ICAgICAgfFNvbWUgdG1wIC0+IHVubGlua19mIHRtcAo8ICAgICAgIHwgXyAtPiAoKQo8ICAgICAg IGVuZDsKPCAgICAgICAoKiByZXN0b3J0aW5nIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciAqKQo8ICAg ICAgIFVuaXguZHVwMiBzdGRvdXRfYmFjayBVbml4LnN0ZG91dDsKPCAgICAgICBVbml4LmR1cDIg c3RkZXJyX2JhY2sgVW5peC5zdGRlcnI7CjwgICAgICAgVW5peC5kdXAyIHN0ZGluX2JhY2sgVW5p eC5zdGRpbjsKPCAgICAgICByZXM7Owo8IGVuZAo8IAo8ICgqIHVuZGVyIHdpbmRvd3MsIHJlcGxh Y2UgdGhlIHR3byBmdW5jdGlvbnMgYnkgdGhvc2UgcHJvdmlkZWQgYnkgV2luRXhlYyBtb2R1bGUg KikKPCBvcGVuIFdpbkV4ZWM7Owo8IAo8IAo3NTYsNzYxZDYwNQo8IAo8IGxldCBleGVfZXh0ZW5z aW9uID0KPCAgIG1hdGNoIChTeXMub3NfdHlwZT0iV2luMzIiKSB3aXRoCjwgICB8dHJ1ZSAtPiAi LmV4ZSIKPCAgIHxmYWxzZSAtPiAiIjs7CjwgCjc2M2M2MDcKPCAgIGxldCBvY2FtbGMgPSBvY2Ft bF9wcm9nICgib2NhbWxjIl5leGVfZXh0ZW5zaW9uKSBpbgotLS0KPiAgIGxldCBvY2FtbGMgPSBv Y2FtbF9wcm9nICJvY2FtbGMiIGluCjc3MSw3NzNjNjE1LDYxNwo8ICAgICBvY2FtbCA9IG9jYW1s X3Byb2cgKCJvY2FtbCJeZXhlX2V4dGVuc2lvbikgOwo8ICAgICBvY2FtbG9wdCA9IG9jYW1sX3By b2cgfmVycjogd2l0aG9wdCAoIm9jYW1sb3B0Il5leGVfZXh0ZW5zaW9uKSA7CjwgICAgIG9jYW1s ZG9jID0gb2NhbWxfcHJvZyAoIm9jYW1sZG9jIl5leGVfZXh0ZW5zaW9uKSA7Ci0tLQo+ICAgICBv Y2FtbCA9IG9jYW1sX3Byb2cgIm9jYW1sIiA7Cj4gICAgIG9jYW1sb3B0ID0gb2NhbWxfcHJvZyB+ ZXJyOiB3aXRob3B0ICJvY2FtbG9wdCIgOwo+ICAgICBvY2FtbGRvYyA9IG9jYW1sX3Byb2cgIm9j YW1sZG9jIiA7Cjc3NSw3ODJjNjE5LDYyNgo8ICAgICBvY2FtbHlhY2MgPSBvY2FtbF9wcm9nICgi b2NhbWx5YWNjIl5leGVfZXh0ZW5zaW9uKSA7CjwgICAgIG9jYW1sbGV4ID0gb2NhbWxfcHJvZyAo Im9jYW1sbGV4Il5leGVfZXh0ZW5zaW9uKSA7CjwgICAgIG9jYW1sZGVwID0gb2NhbWxfcHJvZyAo Im9jYW1sZGVwIl5leGVfZXh0ZW5zaW9uKSA7CjwgICAgIG9jYW1sbWtsaWIgPSBvY2FtbF9wcm9n ICgib2NhbWxta2xpYiJeZXhlX2V4dGVuc2lvbikgOwo8ICAgICBvY2FtbG1rdG9wID0gb2NhbWxf cHJvZyAoIm9jYW1sbWt0b3AiXmV4ZV9leHRlbnNpb24pIDsKPCAgICAgb2NhbWxwcm9mID0gb2Nh bWxfcHJvZyAoIm9jYW1scHJvZiJeZXhlX2V4dGVuc2lvbikgOwo8ICAgICBjYW1scDQgPSBvY2Ft bF9wcm9nICgiY2FtbHA0Il5leGVfZXh0ZW5zaW9uKSA7CjwgICAgIG9jYW1sZmluZCA9IG9jYW1s X3Byb2cgfmVycjogb2NhbWxmaW5kICgib2NhbWxmaW5kIl5leGVfZXh0ZW5zaW9uKSA7Ci0tLQo+ ICAgICBvY2FtbHlhY2MgPSBvY2FtbF9wcm9nICJvY2FtbHlhY2MiIDsKPiAgICAgb2NhbWxsZXgg PSBvY2FtbF9wcm9nICJvY2FtbGxleCIgOwo+ICAgICBvY2FtbGRlcCA9IG9jYW1sX3Byb2cgIm9j YW1sZGVwIiA7Cj4gICAgIG9jYW1sbWtsaWIgPSBvY2FtbF9wcm9nICJvY2FtbG1rbGliIiA7Cj4g ICAgIG9jYW1sbWt0b3AgPSBvY2FtbF9wcm9nICJvY2FtbG1rdG9wIiA7Cj4gICAgIG9jYW1scHJv ZiA9IG9jYW1sX3Byb2cgIm9jYW1scHJvZiIgOwo+ICAgICBjYW1scDQgPSBvY2FtbF9wcm9nICJj YW1scDQiIDsKPiAgICAgb2NhbWxmaW5kID0gb2NhbWxfcHJvZyB+ZXJyOiBvY2FtbGZpbmQgIm9j YW1sZmluZCIgOwo5ODRjODI4CjwgICB0cnkgb2NhbWxfcHJvZyB+ZXJyOiB0cnVlICgib2NhbWxi dWlsZCJeZXhlX2V4dGVuc2lvbikKLS0tCj4gICB0cnkgb2NhbWxfcHJvZyB+ZXJyOiB0cnVlICJv Y2FtbGJ1aWxkIgo= ------_=_NextPart_001_01C8CB05.CE164985 Content-Type: application/octet-stream; name="checkocaml_win.ml" Content-Transfer-Encoding: base64 Content-Description: checkocaml_win.ml Content-Disposition: attachment; filename="checkocaml_win.ml" KCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKikKKCogICAgICAgICAgICAgICAgT3VnICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgQ29weXJpZ2h0IChDKSAyMDA4IEluc3RpdHV0 IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgICAgICAgICAgKikKKCogICAg ZXQgZW4gQXV0b21hdGlxdWUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKikKKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkgICAgICAgKikKKCogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAgICAgICAgICAgICAgICAgICAgKikKKCogICAgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2Yg dGhlICAgICAgICAgKikKKCogICAgTGljZW5zZSwgb3IgYW55IGxhdGVyIHZlcnNpb24uICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKikKKCogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKikKKCogICAgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAg ICAgICAgKikKKCogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAgKikKKCogICAgR05VIExpYnJhcnkgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAg ICAgKikKKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgICAgICAgICAg KikKKCogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0 byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKikKKCogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkg VGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgICAgICAgICAgICAgICAgICAgKikK KCogICAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCog ICAgQ29udGFjdDogTWF4ZW5jZS5HdWVzZG9uQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKikKKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKikKCigqKiBEZXRlY3Rpb24gb2YgT0NhbWwgdG9vbHMgYW5kIGxp YnJhcmllcy4gKikKCigqICRJZCQgKikKCigqYz09bT1bT0NhbWxfY29uZl09MC4zPXQ9PSopCgoK b3BlbiBTeXMKb3BlbiBVbml4CgpsZXQgXyA9IFByaW50ZXhjLnJlY29yZF9iYWNrdHJhY2UgdHJ1 ZQooKiogezI6Y29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9ufQogICAgWW91IGNhbiBjaGFuZ2Ug dGhlc2UgdmFsdWVzIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHNvbWUgZnVuY3Rpb25zLiAq KQoKKCoqIFRoZSBwcmVmaXggb2YgdGhlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkLiAqKQpsZXQg dGVtcF9maWxlc19wcmVmaXggPSByZWYgImNvbmZpZ19jaGVjayIKCigqKiBUaGUgZGVmYXVsdCBl eHRlbnNpb24gZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZC4gKikKbGV0IHRlbXBfZmls ZXNfZXh0ID0gcmVmICJtbCIKCigqKiBTZXQgdGhpcyB0byBbdHJ1ZV0gdG8gZW5hYmxlIGRlYnVn IG1vZGUuCiAgICBUZW1wb3JhcnkgZmlsZXMgYXJlIG5vdCBkZWxldGVkIHdoZW4gaXQgaXMgZW5h YmxlZC4gKikKbGV0IGRlYnVnID0gcmVmIGZhbHNlCgooKiogVGhlIGZ1bmN0aW9uIHVzZWQgdG8g cHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMgYW5kIG90aGVyIGluZm9ybWF0aW9uLiAqKQpsZXQgcHJp bnQgPSByZWYgKGZ1biBzIC0+IHByaW50X3N0cmluZyBzOyBmbHVzaCBQZXJ2YXNpdmVzLnN0ZG91 dCkKCigqKiBbIXN0cmluZ19vZl9ib29sIGJdIHNob3VsZCByZXR1cm4gYSBtZXNzYWdlIGFjY29y ZGluZyB0byB0aGUgZ2l2ZW4gYm9vbGVhbi4KICAgIERlZmF1bHQgYXJlIHllcy9uby4gKikKbGV0 IHN0cmluZ19vZl9ib29sID0gcmVmIChmdW5jdGlvbiB0cnVlIC0+ICJ5ZXMiIHwgZmFsc2UgLT4g Im5vIikKCigqKiBUaGUgbmFtZSBvZiB0aGUgbG9nIGZpbGUuICopCmxldCBsb2dfZmlsZSA9IHJl ZiAiY29uZmlnX2NoZWNrLmxvZyIKCigqKiBUaGUgZnVuY3Rpb24gdG8gcHJpbnQgYSBnaXZlbiBm YXRhbCBlcnJvciBtZXNzYWdlLiBTaG91bGQgZXhpdCB0aGUKICAgIGNvbmZpZ3VyYXRpb24gcHJv Y2Vzcy4gKikKbGV0IGZhdGFsX2Vycm9yID0gcmVmCiAgICAoZnVuIHMgLT4KICAgICAgcHJlcnJf ZW5kbGluZSBzOwogICAgICBwcmVycl9lbmRsaW5lIChQcmludGYuc3ByaW50ZiAiWW91IHdheSBo YXZlIGEgbG9vayBhdCAlcyBmb3IgZGV0YWlscy4iICFsb2dfZmlsZSk7CiAgICAgIGV4aXQgMQog ICAgKQoKCigqKiB7Mjp1dGlscyBVdGlsaXRpZXMgZnVuY3Rpb25zfSAqKQoKbGV0IHRyeV9maW5h bGl6ZSBmIHggZmluYWxseSB5ID0KICBsZXQgcmVzID0gdHJ5IGYgeCB3aXRoIGV4biAtPiBmaW5h bGx5IHk7IHJhaXNlIGV4biBpbgogIGZpbmFsbHkgeTsKICByZXM7OwoKbGV0IHJlYyByZXN0YXJ0 X29uX0VJTlRSIGYgeCA9CiAgdHJ5IGYgeCB3aXRoIFVuaXhfZXJyb3IgKEVJTlRSLCBfLCBfKSAt PiByZXN0YXJ0X29uX0VJTlRSIGYgeAoKCigqKiBbaXNfc3VmZml4IH5zdWYgc10gcmV0dXJucyBb dHJ1ZV0gaWYgdGhlIHN0cmluZyBbc3VmXSBpcyBhIHN1ZmZpeCBvZiBbc10uICopCmxldCBpc19z dWZmaXggfnN1ZiBzID0KICAoKiB0YWtpbmcgb3V0IHNwYWNlcyBhdCBlbmQgOiBwcm9ibGVtcyBv Y2N1cmluZyB1bmRlciB3aW5kb3dzIGJ1aWxkICopCiAgbGV0IHJlYyB0cmltX3JpZ2h0IHMgPQog ICAgbGV0IGxlbmd0aCA9IFN0cmluZy5sZW5ndGggcyBpbgogICAgbWF0Y2ggcy5bbGVuZ3RoLTFd IHdpdGgKICAgIHwnICd8J1xuJ3wnXHInfCdcdCcgLT4gdHJpbV9yaWdodCAoU3RyaW5nLnN1YiBz IDAgKGxlbmd0aC0xKSkKICAgIHxfIC0+IHMgaW4KICBsZXQgc3VmID0gdHJpbV9yaWdodCBzdWYg aW4KICBsZXQgcyA9IHRyaW1fcmlnaHQgcyBpbgogIGxldCBsZW5fc3VmID0gU3RyaW5nLmxlbmd0 aCBzdWYgaW4KICBsZXQgbGVuX3MgPSBTdHJpbmcubGVuZ3RoIHMgaW4KICBsZW5fcyA+PSBsZW5f c3VmICYmCiAgU3RyaW5nLnN1YiBzIChsZW5fcyAtIGxlbl9zdWYpIGxlbl9zdWYgPSBzdWYKCgoo KiogW2NyZWF0ZV90ZW1wX2ZpbGVzID9leHQgP2NvbnRlbnRzICgpXSBjcmVhdGVzIGEgdGVtcG9y YXJ5IGVtcHR5IGZpbGUgYW5kCiAgICByZXR1cm5zIGl0cyBuYW1lLiBUaGUgcHJlZml4IG9mIHRo ZSBmaWxlIGlzIHNwZWNpZmllZCBieSB7IXRlbXBfZmlsZXNfcHJlZml4fS4KICAgIEBwYXJhbSBl eHQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBleHRlbnNpb24gZGlmZmVyZW50IGZyb20geyF0 ZW1wX2ZpbGVzX2V4dH0uCiAgICBAcGFyYW0gY29udGVudHMgY2FuIGJlIHVzZWQgdG8gc3BlY2lm eSB0aGUgY29udGVudCBvZiB0aGUgZmlsZS4KICopCmxldCBjcmVhdGVfdGVtcF9maWxlID8oZXh0 PSAhdGVtcF9maWxlc19leHQpID8oY29udGVudHM9IiIpICgpID0KICBsZXQgKGZpbGUsb2MpID0g RmlsZW5hbWUub3Blbl90ZW1wX2ZpbGUKICAgICAgIXRlbXBfZmlsZXNfcHJlZml4ICgiLiIgXiBl eHQpCiAgaW4KICBvdXRwdXRfc3RyaW5nIG9jIGNvbnRlbnRzOwogIGNsb3NlX291dCBvYzsKICBm aWxlCgoKbGV0IHJlbW92ZV9lbXB0eV9zdHJpbmdzID0gTGlzdC5maWx0ZXIgKCg8PikgIiIpCgps ZXQgc3RyaW5nX29mX2luY2x1ZGVzIGwgPQogIFN0cmluZy5jb25jYXQgIiAiIChMaXN0Lm1hcCAo ZnVuIHMgLT4gIi1JICJeKEZpbGVuYW1lLnF1b3RlIHMpKSAocmVtb3ZlX2VtcHR5X3N0cmluZ3Mg bCkpCgooKiogSWYgdGhlIGdpdmVuIGZpbGVuYW1lIGhhcyBhIFsuY21vXSAocmVzcC4gWy5jbWFd KSBleHRlbnNpb24sCiAgICB0aGVuIHJldHVybiB0aGUgc2FtZSBmaWxlbmFtZSB3aXRoIGEgWy5j bXhdIChyZXNwLiBbLmNteGFdKSBleHRlbnNpb24uKikKbGV0IGJ5dGVfZXh0X3RvX29wdCBmID0K ICBpZiBGaWxlbmFtZS5jaGVja19zdWZmaXggZiAiLmNtbyIgdGhlbgogICAgUHJpbnRmLnNwcmlu dGYgIiVzLmNteCIgKEZpbGVuYW1lLmNob3BfZXh0ZW5zaW9uIGYpCiAgZWxzZQogICAgaWYgRmls ZW5hbWUuY2hlY2tfc3VmZml4IGYgIi5jbWEiIHRoZW4KICAgICAgUHJpbnRmLnNwcmludGYgIiVz LmNteGEiIChGaWxlbmFtZS5jaG9wX2V4dGVuc2lvbiBmKQogICAgZWxzZQogICAgICBmCgooKiog ezI6cGF0aCBIYW5kbGluZyBQQVRIfSAqKQoKZXhjZXB0aW9uIFBhdGggb2Ygc3RyaW5nICogc3Ry aW5nOzsKbGV0IHBhdGhfc2VwID0KICBtYXRjaCAoU3lzLm9zX3R5cGUgPSAiV2luMzIiKXdpdGgK ICB8ZmFsc2UgLT4iOiIKICB8dHJ1ZSAtPiAiOyI7OwoKbGV0IHBhdGhfc2VwX3JlZ2V4cCA9IFN0 ci5yZWdleHAgKFN0ci5xdW90ZSBwYXRoX3NlcCk7OwoKKCoqIFtsaXN0X29mX3BhdGggc3RyaW5n XSByZXR1cm5zIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGZyb20gdGhlIGdpdmVuIHN0cmluZyBp biBwYXRoIGZvcm1hdC4gKikKbGV0IGxpc3Rfb2ZfcGF0aCA9IFN0ci5zcGxpdCBwYXRoX3NlcF9y ZWdleHA7OwoKKCoqIFtwYXRoX29mX2xpc3QgcGF0aHNdIGJ1aWxkcyBhIHN0cmluZyBpbiBwYXRo IGZvcm1hdC4KICAgIEByYWlzZSBQYXRoIGlmIGEgcGF0aCBjb250YWlucyB0aGUgc2VwYXJhdG9y LiAqKQpsZXQgcGF0aF9vZl9saXN0IHBhdGhzID0KICAoKiBVbiBub20gZGUgZmljaGllciBkYW5z IHVuIGNoZW1pbiBuZSBkb2l0IHBhcyBjb250ZW5pciBsZSBz6XBhcmF0ZXVyLi4uICopCiAgbGV0 IGNoZWNrIHMgPQogICAgaWYgU3RyLnN0cmluZ19tYXRjaCBwYXRoX3NlcF9yZWdleHAgcyAwIHRo ZW4KICAgICAgbGV0IHBvcyA9IFN0ci5tYXRjaF9iZWdpbm5pbmcoKSBpbgogICAgICBsZXQgbWVz ID0gUHJpbnRmLnNwcmludGYgIlNlcGFyYXRvciBzdHJpbmcgZm91bmQgYXQgcG9zaXRpb24gJWQi IHBvcyBpbgogICAgICByYWlzZSAoUGF0aCAocywgbWVzKSkgaW4KICBMaXN0Lml0ZXIgY2hlY2sg cGF0aHM7CiAgU3RyaW5nLmNvbmNhdCBwYXRoX3NlcCBwYXRoczs7CgooKiogW2dldF9wYXRoICgp XSByZXR1cm5zIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGluZGljYXRlZCBieSB0aGUgW1BBVEhd IGVudmlyb25lbWVudCB2YXJpYWJsZS4gKikKbGV0IGdldF9wYXRoICgpID0KICBsZXQgcyA9IGxp c3Rfb2ZfcGF0aCAoZ2V0ZW52ICJQQVRIIikgaW4KKCogICBMaXN0Lml0ZXIgcHJpbnRfZW5kbGlu ZSBzOyAqKQogIHM7OwoKKCoqIFtmaW5kX2luX3BhdGggcHJlZGljYXRlIHBhdGhzIGZpbGVdIHJl dHVybnMgdGhlIGxpc3Qgb2YgY29tcGxldGUgZmlsZW5hbWVzIGJ1aWxkCiAgICBmcm9tIHRoZSBk aXJlY3RvcmllcyBhbmQgdGhlIGZpbGVuYW1lLCBhbmQgdmVyaWZ5aW5nIHRoZSBnaXZlbiBwcmVk aWNhdGUuICopCmxldCBmaW5kX2luX3BhdGggcCBwYXRocyBmaWxlID0KICBMaXN0LmZpbmRfYWxs IHAgKExpc3QubWFwIChmdW4gcCAtPiBGaWxlbmFtZS5jb25jYXQgcCBmaWxlKSBwYXRocyk7OwoK KCoqIHsyOmZpbGVzIEhhbmRsaW5nIGZpbGVzfSAqKQoKKCoqIFZhcmlvdXMgdGVzdHMgb2YgYSBm aWxlLiAqKQp0eXBlIGZpbGV0ZXN0ID0KICB8IEZleGlzdHMgKCoqIGZpbGUgZXhpc3RzICopCiAg fCBGcmVhZGFibGUgKCoqIGZpbGUgZXhpc3RzIGFuZCBpcyByZWFkYWJsZSAqKQogIHwgRndyaXRh YmxlICgqKiBmaWxlIGV4aXN0cyBhbmQgaXMgd3JpdGFibGUgKikKICB8IEZleGVjdXRhYmxlICgq KiBmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZSAqKQogIHwgRmRpciAoKiogZmlsZSBleGlz dHMgYW5kIGlzIGEgZGlyZWN0b3J5ICopCiAgfCBGcmVnICgqKiBmaWxlIGV4aXN0cyBhbmQgaXMg YSByZWd1bGFyIGZpbGUgKikKICB8IEZsbmsgKCoqIGZpbGUgZXhpc3RzIGFuZCBpcyBhIHN5bWJv bGljIGxpbmsgKikKICB8IEZub25lbXB0eSAoKiBmaWxlKiBleGlzdHMgYW5kIGlzIG5vbiBlbXB0 eSAqKQogIHwgRm5ld2VyIG9mIHN0cmluZyAoKiogZmlsZXMgZXhpc3RzIGFuZCBpcyBuZXdlciB0 aGFuICopCiAgfCBGb2xkZXIgb2Ygc3RyaW5nICgqKiBmaWxlcyBleGlzdHMgYW5kIGlzIG9sZGVy IHRoYW4gKikKICB8IEZlcXVhbCBvZiBzdHJpbmcgKCoqIGZpbGVzIGlzIGlkZW50aWNhbCAoc2Ft cyBzdF9pbm8gYW5kIHN0X2RldikgdGhhbiAqKQoKbGV0IGFjY2Vzc19tYXAgPQogIFsgRnJlYWRh YmxlLCBSX09LOyBGd3JpdGFibGUsIFdfT0s7IEZleGVjdXRhYmxlLCBYX09LOyBGZXhpc3RzLCBG X09LOyBdCgpsZXQgYWNjZXNzX29rX2Vycm9ycyA9CiAgWyBFQUNDRVMgOyBFUk9GUzsgRU5PRU5U OyBFTk9URElSOyBFTE9PUCBdCjs7CgooKiogW3Rlc3RmaWxlIGZsYWdzIGZpbGVuYW1lXSB0ZXN0 cyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIHZlcmlmaWVzIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLiAq KQpsZXQgdGVzdGZpbGUgZmxhZ3MgZmlsZW5hbWUgPQogIGxldCByZWMgc3BsaXQgKCAoZm91bmQs IGxlZnQpIGFzIGJvdGgpID0gZnVuY3Rpb24KICAgICAgW10gLT4gYm90aAogICAgfCBoIDo6IHQg LT4KICAgICAgICBsZXQgZm91bmRfbGVmdCA9CiAgICAgICAgICB0cnkgTGlzdC5hc3NvYyBoIGFj Y2Vzc19tYXAgIDo6IGZvdW5kLCBsZWZ0CiAgICAgICAgICB3aXRoIE5vdF9mb3VuZCAtPiBmb3Vu ZCwgaDo6bGVmdCBpbgogICAgICAgIHNwbGl0IGZvdW5kX2xlZnQgdAogIGluCiAgbGV0IGFjY2Vz c19mbGFncywgZmxhZ3MgPSBzcGxpdCAoW10sW10pIGZsYWdzIGluCiAgbGV0IGFjY2Vzc19mbGFn cyA9IGlmIGFjY2Vzc19mbGFncyA9IFtdIHRoZW4gWyBGX09LIF0gZWxzZSBhY2Nlc3NfZmxhZ3Mg aW4KICB0cnkKICAgIGFjY2VzcyBmaWxlbmFtZSBhY2Nlc3NfZmxhZ3M7CiAgICBmbGFncyA9IFtd IHx8CiAgICBiZWdpbgogICAgICBsZXQgc3QgPSAoaWYgTGlzdC5tZW0gRmxuayBmbGFncyB0aGVu IHN0YXQgZWxzZSBsc3RhdCkgZmlsZW5hbWUgaW4KICAgICAgbGV0IHJlYyB0ZXN0ID0gZnVuY3Rp b24KICAgICAgICB8IEZkaXIgLT4gc3Quc3Rfa2luZCA9IFNfRElSCiAgICAgICAgfCBGcmVnIC0+ IHN0LnN0X2tpbmQgPSBTX1JFRwogICAgICAgIHwgRmxuayAtPiBzdC5zdF9raW5kID0gU19MTksK ICAgICAgICB8IEZub25lbXB0eSAtPiBzdC5zdF9zaXplID4gMAogICAgICAgIHwgRm5ld2VyIHN0 cmluZyAtPiBzdC5zdF9tdGltZSA+IChzdGF0IHN0cmluZykuc3RfbXRpbWUKICAgICAgICB8IEZv bGRlciBzdHJpbmcgLT4gc3Quc3RfbXRpbWUgPCAoc3RhdCBzdHJpbmcpLnN0X210aW1lCiAgICAg ICAgfCBGZXF1YWwgc3RyaW5nIC0+CiAgICAgICAgICAgIGxldCBzdCcgPSBzdGF0IHN0cmluZyBp bgogICAgICAgICAgICBzdC5zdF9pbm8gPSBzdCcuc3RfaW5vICYmIHN0LnN0X2RldiA9IHN0Jy5z dF9kZXYKICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlCiAgICAgIGluCiAgICAgIExpc3QuZm9y X2FsbCB0ZXN0IGZsYWdzCiAgICBlbmQ7CiAgd2l0aCBVbml4LlVuaXhfZXJyb3IgKGVyciwgXywg Xykgd2hlbiAgTGlzdC5tZW0gZXJyIGFjY2Vzc19va19lcnJvcnMgLT4KICAgIGZhbHNlCjs7Cgps ZXQgYnVmZmVyX3NpemUgPSA0MDk2CmxldCBzdHJpbmdfZnJvbV9kZXNjciBmZCA9CiAgbGV0IHJl YyByZWFkZmQgYWNjdSA9CiAgICBsZXQgc3RyID0gU3RyaW5nLmNyZWF0ZSBidWZmZXJfc2l6ZSBp bgogICAgbWF0Y2ggcmVzdGFydF9vbl9FSU5UUiAocmVhZCBmZCBzdHIgMCkgYnVmZmVyX3NpemUg d2l0aAogICAgfCAwIC0+IFN0cmluZy5jb25jYXQgIiIgIGFjY3UKICAgIHwgbiAtPgogICAgICAg IGxldCBzdHIgPSBpZiBuIDwgYnVmZmVyX3NpemUgdGhlbiBTdHJpbmcuc3ViIHN0ciAwIG4gZWxz ZSBzdHIgaW4KICAgICAgICByZWFkZmQgKHN0ciA6OiBhY2N1KSBpbgogIHJlYWRmZCBbXQo7OwoK KCogcGF0Y2ggc2luZ2xlX3dyaXRlIHJhaXNpbmcgZXhjZXB0aW9ucyB1bmRlciB3aW5kb3dzICop CmxldCBzaW5nbGVfd3JpdGUgPQogIG1hdGNoIChTeXMub3NfdHlwZSA9ICJXaW4zMiIpd2l0aAog IHx0cnVlIC0+IHdyaXRlCiAgfGZhbHNlIC0+IHNpbmdsZV93cml0ZQoKbGV0IGRlc2NyX2Zyb21f c3RyaW5nIHN0ciBmZCA9CiAgbGV0IHJlYyB3cml0ZWZkIG9mZnNldCBsZWZ0ID0KICAgIGlmIGxl ZnQgPiAwIHRoZW4KICAgICAgbGV0IG4gPSByZXN0YXJ0X29uX0VJTlRSIChzaW5nbGVfd3JpdGUg ZmQgc3RyIG9mZnNldCkgbGVmdCBpbgogICAgICB3cml0ZWZkIChvZmZzZXQgKyBuKSAobGVmdCAt IG4pIGluCiAgd3JpdGVmZCAwIChTdHJpbmcubGVuZ3RoIHN0cikKOzsKCmxldCBwZXJtID0gMG82 NDA7OwoKCigqKiBbc3RyaW5nX29mX2ZpbGVzXSByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUg Z2l2ZW4gZmlsZSBhcyBhIHN0cmluZy4KICAgIEByYWlzZSBVbml4LlVuaXhfZXJyb3IgaWYgYW4g ZXJyb3Igb2NjdXJzLgogKikKbGV0IHN0cmluZ19vZl9maWxlIGZpbGUgPQogIGxldCBmZCA9IG9w ZW5maWxlIGZpbGUgWyBPX1JET05MWSBdIDAgaW4KICB0cnlfZmluYWxpemUgc3RyaW5nX2Zyb21f ZGVzY3IgZmQgY2xvc2UgZmQKOzsKCigqKiBbZmlsZV9vZl9zdHJpbmcgfmNvbnRlbnRzIH5maWxl XSBjcmVhdGVzIHRoZSBnaXZlbiBmaWxlIHdpdGggdGhlIGdpdmVuIHN0cmluZyBbc3RyXSBhcyBj b250ZW50cy4KICAgIEByYWlzZSBVbml4LlVuaXhfZXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJzLgog KikKbGV0IGZpbGVfb2Zfc3RyaW5nIH5jb250ZW50cyB+ZmlsZSA9CiAgbGV0IGZkID0gb3BlbmZp bGUgZmlsZSBbIE9fV1JPTkxZOyBPX0NSRUFUOyBPX1RSVU5DIF0gcGVybSBpbgogIHRyeV9maW5h bGl6ZSAoZGVzY3JfZnJvbV9zdHJpbmcgY29udGVudHMpIGZkIGNsb3NlIGZkCjs7CgooKiogW2lu cHV0X2xpbmVzIGNoYW5uZWxdIHJldHVybiB0aGUgbGlzdCBvZiBsaW5lcyBmcm9tIHRoZSBnaXZl biBjaGFubmVsLgogICAgVGhlIGZ1bmN0aW9uIGlzIHRhaWwtcmVjdXJzaXZlLgogKikKbGV0IGlu cHV0X2xpbmVzIGNoYW4gPQogIGxldCByZWMgYWxsIGxpbmVzID0KICAgICgqIGludGVybWVkaWF0 ZSByZXN1bHQgdG8gYmUgdGFpbCByZWMgKikKICAgIG1hdGNoIHRyeSBTb21lIChpbnB1dF9saW5l IGNoYW4pIHdpdGggRW5kX29mX2ZpbGUgLT4gTm9uZSB3aXRoCiAgICAgIFNvbWUgbCAtPiBhbGwg KGw6OmxpbmVzKQogICAgfCBOb25lIC0+IExpc3QucmV2IGxpbmVzIGluCiAgYWxsIFtdCgooKiog W3VubGlua19mIGZpbGVdIHJlbW92ZXMgdGhlIGdpdmVuIFtmaWxlXSBpZiBpdCBleGlzdHMuCiAg ICBJZiB0aGUgZmlsZXMgaXMgYSBbLm1sXSBmaWxlIChyZXNwLiBhIFsubWxpXSBmaWxlKSwgdGhl bgogICAgaXQgYWxzbyByZW1vdmVzIHRoZSBbLmNtb10sIFsuY214XSwgWy5vXSBhbmQgWy5jbWld IGZpbGVzCiAgICAocmVzcC4gdGhlIFsuY21pXSBmaWxlKSBpZiB0aGV5IGV4aXN0LgogICAgQHJh aXNlIFVuaXguVW5peF9lcnJvciBpZiBhbiBlcnJvciBvY2N1cnMuCiAqKQpsZXQgdW5saW5rX2Yg ZmlsZSA9CiAgaWYgIWRlYnVnIHRoZW4gKCkKICBlbHNlCiAgICBsZXQgZmlsZXMgPQogICAgICBp ZiBGaWxlbmFtZS5jaGVja19zdWZmaXggZmlsZSAiLm1saSIgdGhlbgogICAgICAgIFtmaWxlOyAo RmlsZW5hbWUuY2hvcF9leHRlbnNpb24gZmlsZSleIi5jbWkiXQogICAgICBlbHNlCiAgICAgICAg aWYgRmlsZW5hbWUuY2hlY2tfc3VmZml4IGZpbGUgIi5tbCIgdGhlbgogICAgICAgICAgbGV0IGJh c2UgPSBGaWxlbmFtZS5jaG9wX2V4dGVuc2lvbiBmaWxlIGluCiAgICAgICAgICBbZmlsZTsgYmFz ZV4iLmNtaSIgOyBiYXNlXiIuY21vIiA7IGJhc2VeIi5jbXgiOyBiYXNlXiIubyIgXQoJZWxzZQog ICAgICAgICAgW2ZpbGVdCiAgICBpbgogICAgbGV0IGYgZmlsZSA9CiAgICAgIHRyeSB1bmxpbmsg ZmlsZSB3aXRoIFVuaXhfZXJyb3IgKEVOT0VOVCwgXywgXykgLT4gKCkKICAgIGluCiAgICBMaXN0 Lml0ZXIgZiBmaWxlcwoKCgooKiogezI6ZXhlYyBIYW5kbGluZyBwcm9jZXNzZXN9ICopCgpleGNl cHRpb24gRXhlY19mYWlsdXJlOzsKCmxldCBleGVjdnBfdG9fbGlzdCBjbWQgYXJncyA9CiAgbGV0 IGRlc2NfcmVhZCwgZGVzY193cml0ZSA9IHBpcGUgKCkgaW4KICBtYXRjaCBmb3JrKCkgd2l0aAog ICAgMCAtPgogICAgICBsZXQgZXhlYyAoKSA9CiAgICAgICAgY2xvc2UgZGVzY19yZWFkOwogICAg ICAgIGR1cDIgZGVzY193cml0ZSBzdGRvdXQ7CiAgICAgICAgY2xvc2UgZGVzY193cml0ZTsKICAg ICAgICBleGVjdnAgY21kIChBcnJheS5hcHBlbmQgW3wgY21kIHxdIGFyZ3MpIGluCiAgICAgIGhh bmRsZV91bml4X2Vycm9yIGV4ZWMgKCkKICB8IHBpZCAtPgogICAgICBjbG9zZSBkZXNjX3dyaXRl OwogICAgICBsZXQgY2hhbiA9IGluX2NoYW5uZWxfb2ZfZGVzY3IgZGVzY19yZWFkIGluCiAgICAg IGxldCBhZnRlciAoKSA9CiAgICAgICAgY2xvc2VfaW4gY2hhbjsKICAgICAgICBtYXRjaCByZXN0 YXJ0X29uX0VJTlRSICh3YWl0cGlkIFtdKSBwaWQgd2l0aAogICAgICAgICAgXywgV0VYSVRFRCAw IC0+ICgpCiAgICAgICAgfCBfLCBfIC0+IHJhaXNlIEV4ZWNfZmFpbHVyZSBpbgogICAgICB0cnlf ZmluYWxpemUgaW5wdXRfbGluZXMgY2hhbiBhZnRlciAoKTs7Cgp0eXBlIHJlZGlyZWN0aW9uID0K ICB8IEluX2Zyb21fZmlsZSBvZiBzdHJpbmcgICAgICAgICgqKiA8IGZpbGUgKikKICB8IE91dF90 b19maWxlIG9mIHN0cmluZyAgICAgICAgICgqKiA+IGZpbGUgKikKICB8IEVycl90b19maWxlIG9m IHN0cmluZyAgICAgICAgICgqKiAyPiBmaWxlICopCiAgfCBPdXRfYXBwZW5kX3RvX2ZpbGUgb2Yg c3RyaW5nICAoKiogPj4gZmlsZSAqKQogIHwgRXJyX3RvX291dCAgICAgICAgICAgICAgICAgICAg KCoqIDI+JjEgKikKICB8IEluX2Zyb21fc3RyaW5nIG9mIHN0cmluZyAgICAgICgqKiA8PEVORCAq KQogIHwgRXJyX251bGwgICAgICAgICAgICAgICAgICAgICAgKCoqIDI+L2Rldi9udWxsICAqKQog IHwgT3V0X251bGwgICAgICAgICAgICAgICAgICAgICAgKCoqID4vZGV2L251bGwgKikKICB8IFNp bGVudCAgICAgICAgICAgICAgICAgICAgICAgICgqKiA+L2Rldi9udWxsIDI+JjEgKikKOzsKCmxl dCBleGVjdnBfcmVkaXJlY3QgcmVkaXJlY3Rpb25zIGNtZCBhcmdzICA9CiAgbGV0IHBlcm0gPSAw bzY0MCBpbgogIGxldCB0ZW1wX2ZpbGUgPQogICAgaWYgTGlzdC5leGlzdHMgKGZ1bmN0aW9uIElu X2Zyb21fc3RyaW5nIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2UpCiAgICAgICAgcmVkaXJlY3Rpb25z CiAgICB0aGVuIFNvbWUgKGNyZWF0ZV90ZW1wX2ZpbGUgfmV4dDogIi5pbiIgKCkpCiAgICBlbHNl IE5vbmUgaW4KICBsZXQgcmVjIG1ha2VfcmVkaXJlY3QgcmQgPQogICAgbWF0Y2ggcmQgd2l0aAog ICAgICBJbl9mcm9tX2ZpbGUgZmlsZSAtPgogICAgICAgIGxldCBkZXNjX2ZpbGUgPSBvcGVuZmls ZSBmaWxlIFtPX1JET05MWV0gcGVybSBpbgogICAgICAgIHRyeV9maW5hbGl6ZSAoZHVwMiBkZXNj X2ZpbGUpIHN0ZGluIGNsb3NlIGRlc2NfZmlsZQogICAgfCBPdXRfdG9fZmlsZSBmaWxlIC0+CiAg ICAgICAgbGV0IGRlc2NfZmlsZSA9IG9wZW5maWxlIGZpbGUgW09fV1JPTkxZO09fQ1JFQVQ7T19U UlVOQ10gcGVybSBpbgogICAgICAgIHRyeV9maW5hbGl6ZSAoZHVwMiBkZXNjX2ZpbGUpIHN0ZG91 dCBjbG9zZSBkZXNjX2ZpbGUKICAgIHwgRXJyX3RvX2ZpbGUgZmlsZSAgLT4KICAgICAgICBsZXQg ZGVzY19maWxlID0gb3BlbmZpbGUgZmlsZSBbT19XUk9OTFk7T19DUkVBVDtPX1RSVU5DXSBwZXJt IGluCiAgICAgICAgdHJ5X2ZpbmFsaXplIChkdXAyIGRlc2NfZmlsZSkgc3RkZXJyIGNsb3NlIGRl c2NfZmlsZQogICAgfCBPdXRfYXBwZW5kX3RvX2ZpbGUgZmlsZSAtPgogICAgICAgIGxldCBkZXNj X2ZpbGUgPSBvcGVuZmlsZSBmaWxlIFtPX1dST05MWTtPX0FQUEVORDtPX0NSRUFUXSBwZXJtIGlu CiAgICAgICAgdHJ5X2ZpbmFsaXplIChkdXAyIGRlc2NfZmlsZSkgc3Rkb3V0IGNsb3NlIGRlc2Nf ZmlsZQogICAgfCBFcnJfdG9fb3V0IC0+IGR1cDIgc3Rkb3V0IHN0ZGVycgogICAgfCBJbl9mcm9t X3N0cmluZyBzIC0+CiAgICAgICAgYmVnaW4gbWF0Y2ggdGVtcF9maWxlIHdpdGgKICAgICAgICAg IFNvbWUgdG1wIC0+CiAgICAgICAgICAgIGZpbGVfb2Zfc3RyaW5nIH5maWxlOiB0bXAgfmNvbnRl bnRzOiBzOwogICAgICAgICAgICBtYWtlX3JlZGlyZWN0IChJbl9mcm9tX2ZpbGUgdG1wKTsKICAg ICAgICB8IE5vbmUgLT4gYXNzZXJ0IGZhbHNlCiAgICAgICAgZW5kCiAgICB8IE91dF9udWxsIC0+ CiAgICAgICAgbWFrZV9yZWRpcmVjdCAoT3V0X3RvX2ZpbGUgIi9kZXYvbnVsbCIpCiAgICB8IEVy cl9udWxsIC0+CiAgICAgICAgbWFrZV9yZWRpcmVjdCAoRXJyX3RvX2ZpbGUgIi9kZXYvbnVsbCIp CiAgICB8IFNpbGVudCAtPgogICAgICAgIG1ha2VfcmVkaXJlY3QgT3V0X251bGw7CiAgICAgICAg bWFrZV9yZWRpcmVjdCBFcnJfdG9fb3V0OwogIGluCiAgbWF0Y2ggZm9yayAoKSB3aXRoCiAgICAw IC0+CiAgICAgIGxldCBleGVjICgpID0KICAgICAgICBMaXN0Lml0ZXIgbWFrZV9yZWRpcmVjdCBy ZWRpcmVjdGlvbnM7CiAgICAgICAgZXhlY3ZwIGNtZCAoQXJyYXkuYXBwZW5kIFt8Y21kfF0gYXJn cyk7CiAgICAgIGluCiAgICAgIGhhbmRsZV91bml4X2Vycm9yIGV4ZWMgKCk7CiAgfCBwaWQgLT4K ICAgICAgbGV0IHJlcyA9IHNuZCAod2FpdHBpZCBbXSBwaWQpIGluCiAgICAgIGJlZ2luIG1hdGNo IHRlbXBfZmlsZSB3aXRoCiAgICAgICAgU29tZSB0bXAgLT4gdW5saW5rX2YgdG1wCiAgICAgIHwg XyAtPiAoKQogICAgICBlbmQ7CiAgICAgIHJlcwo7OwoKCmxldCBleGVjdnAgY21kIGFyZyA9CiAg bWF0Y2ggZm9yaygpIHdpdGgKICB8IDAgLT4gVW5peC5leGVjdnAgY21kIChBcnJheS5jb25jYXQg WyBbfCBjbWQgfF07IGFyZyBdKQogIHwgcCAtPiBzbmQod2FpdHBpZCBbXSBwKQoKCigqIHdyYXBw aW5nIGV4ZWN1dGlvbiBhbmQgZm9yayB1c2UgdG8gYmUgd2luZG93cyBjb21wbGlhbnQsCiAgIHVz aW5nIHRoZXJlZm9yZSBjcmVhdGVfcHJvY2VzcyAqKQptb2R1bGUgV2luRXhlYyA9CiAgc3RydWN0 CiAgICBsZXQgcmVhZF90ZXh0X2ZpbGUgZiA9CiAgICAgIGxldCBpYyA9IG9wZW5faW4gZiBpbgog ICAgICBsZXQgcmVjIHJlYWQgcyA9CiAgICAgICAgdHJ5CiAgICAgICAgICBsZXQgbGluZSA9IGlu cHV0X2xpbmUgaWMgaW4KICAgICAgICAgIHJlYWQgKGxpbmU6OnMpCiAgICAgICAgd2l0aCBFbmRf b2ZfZmlsZSAtPgogICAgICAgICAgKExpc3QucmV2IHMpIGluCiAgICAgIGxldCBzID0gcmVhZCBb XSBpbgogICAgICBjbG9zZV9pbiBpYzsKICAgICAgcwoKICAgIGxldCBjbGVhciBmID0KICAgICAg dHJ5CiAgICAgICAgU3lzLnJlbW92ZSBmCiAgICAgIHdpdGggXyAtPiAoKQoKICAgIGxldCBkZWZh dWx0X3RlbXBfZGlyID0gIkM6L3RlbXAvIgogICAgbGV0IGV4ZWN2cF90b19saXN0IGNtZCBhcmdz ID0KICAgICAgKCogd2UgY3JlYXRlIGZpbGUgYmFzZWQgc3RkaW4gYW5kIHN0ZG91dCwgZ2l2aW5n IHRoZSB0ZW1wIGRpciAqKQogICAgICBsZXQgZGlyID0KICAgICAgICB0cnkKICAgICAgICAgIFVu aXguZ2V0ZW52ICJURU1QIgogICAgICAgIHdpdGggXyAtPiBkZWZhdWx0X3RlbXBfZGlyIGluCiAg ICAgIGxldCBtYWtlRmlsZSBkaXIgdGFnID0KICAgICAgICBsZXQgbWFrZUFkZGVuZCAoKT0KICAg ICAgICAgIGxldCBhZGRlbmQgPSBSYW5kb20uaW50IDIwMDAwIGluCiAgICAgICAgICBEaWdlc3Qu dG9faGV4IChEaWdlc3Quc3RyaW5nIChNYXJzaGFsLnRvX3N0cmluZyBhZGRlbmQgW10pKSBpbgog ICAgICAgIGxldCBmaWxlID0gcmVmIChkaXJebWFrZUFkZGVuZCgpXnRhZykgaW4KICAgICAgICB3 aGlsZSAoU3lzLmZpbGVfZXhpc3RzICFmaWxlKSBkbwogICAgICAgICAgZmlsZSA6PSBkaXJebWFr ZUFkZGVuZCgpXnRhZzsKICAgICAgICBkb25lOwogICAgICAgICFmaWxlIGluCiAgICAgIGxldCBv dXRwdXQgPSBtYWtlRmlsZSBkaXIgIm91dHB1dC50eHQiIGluCiAgICAgIGxldCBlcnJvciA9IG1h a2VGaWxlIGRpciAiZXJyLnR4dCIgaW4KICAgICAgbGV0IChzaWwsc29yLHNlcikgPQogICAgICAg IGxldCBzaWwsIHNpciA9IHBpcGUgKCkgaW4KICAgICAgICBsZXQgc29yID0gVW5peC5vcGVuZmls ZSBvdXRwdXQgW09fV1JPTkxZO09fQ1JFQVRdIDBvNjQwIGluCiAgICAgICAgbGV0IHNlciA9IFVu aXgub3BlbmZpbGUgZXJyb3IgW09fV1JPTkxZO09fQ1JFQVRdIDBvNjQwIGluCiAgICAgICAgKHNp bCxzb3Isc2VyKSBpbgogICAgICBsZXQgcGlkID0KICAgICAgICBjcmVhdGVfcHJvY2Vzc19lbnYg Y21kIChBcnJheS5hcHBlbmQgW3wgY21kIHxdIGFyZ3MpIChVbml4LmVudmlyb25tZW50KCkpCiAg ICAgICAgICBzaWwgc29yIHNlciBpbgogICAgICBsZXQgXyxzdGF0dXMgPSBVbml4LndhaXRwaWQg W10gcGlkIGluCiAgICAgIFVuaXguY2xvc2Ugc29yOwogICAgICBVbml4LmNsb3NlIHNlcjsKICAg ICAgbWF0Y2ggc3RhdHVzIHdpdGgKICAgICAgfCBXRVhJVEVEIDAgLT4KICAgICAgICAgIGxldCBy ZXMgPSByZWFkX3RleHRfZmlsZSBvdXRwdXQgaW4KICAgICAgICAgIGNsZWFyIG91dHB1dDsKICAg ICAgICAgIGNsZWFyIGVycm9yOwogICAgICAgICAgcmVzCiAgICAgIHwgV0VYSVRFRCBpIC0+CiAg ICAgICAgICBsZXQgZXJyb3JUcmFjZSA9cmVhZF90ZXh0X2ZpbGUgZXJyb3IgaW4KICAgICAgICAg ICgqIHdlIGNhbiBwcmludCB0aGUgZXJyb3IgdHJhY2UgaWYgbmVlZGVkICopCiAgICAgICAgICBj bGVhciBvdXRwdXQ7CiAgICAgICAgICBjbGVhciBlcnJvcjsKICAgICAgICAgIHJhaXNlIEV4ZWNf ZmFpbHVyZQogICAgICB8IF8gLT4KICAgICAgICAgIGNsZWFyIG91dHB1dDsKICAgICAgICAgIGNs ZWFyIGVycm9yOwogICAgICAgICAgcmFpc2UgRXhlY19mYWlsdXJlCgogICAgbGV0IGV4ZWN2cF9y ZWRpcmVjdCByZWRpcmVjdGlvbnMgY21kIGFyZ3MgID0KICAgICAgbGV0IHBlcm0gPSAwbzY0MCBp bgogICAgICBsZXQgdGVtcF9maWxlID0KICAgICAgICBpZiBMaXN0LmV4aXN0cyAoZnVuY3Rpb24g SW5fZnJvbV9zdHJpbmcgXyAtPiB0cnVlIHwgXyAtPiBmYWxzZSkKICAgICAgICAgICAgcmVkaXJl Y3Rpb25zCiAgICAgICAgdGhlbiBTb21lIChjcmVhdGVfdGVtcF9maWxlIH5leHQ6ICIuaW4iICgp KQogICAgICAgIGVsc2UgTm9uZSBpbgogICAgICBsZXQgcmVjIG1ha2VfcmVkaXJlY3QgcmQgPQog ICAgICAgIG1hdGNoIHJkIHdpdGgKICAgICAgICAgIEluX2Zyb21fZmlsZSBmaWxlIC0+CiAgICAg ICAgICAgIGxldCBkZXNjX2ZpbGUgPSBvcGVuZmlsZSBmaWxlIFtPX1JET05MWV0gcGVybSBpbgog ICAgICAgICAgICB0cnlfZmluYWxpemUgKGR1cDIgZGVzY19maWxlKSBzdGRpbiBjbG9zZSBkZXNj X2ZpbGUKICAgICAgICB8IE91dF90b19maWxlIGZpbGUgLT4KICAgICAgICAgICAgbGV0IGRlc2Nf ZmlsZSA9IG9wZW5maWxlIGZpbGUgW09fV1JPTkxZO09fQ1JFQVQ7T19UUlVOQ10gcGVybSBpbgog ICAgICAgICAgICB0cnlfZmluYWxpemUgKGR1cDIgZGVzY19maWxlKSBzdGRvdXQgY2xvc2UgZGVz Y19maWxlCiAgICAgICAgfCBFcnJfdG9fZmlsZSBmaWxlICAtPgogICAgICAgICAgICBsZXQgZGVz Y19maWxlID0gb3BlbmZpbGUgZmlsZSBbT19XUk9OTFk7T19DUkVBVDtPX1RSVU5DXSBwZXJtIGlu CiAgICAgICAgICAgIHRyeV9maW5hbGl6ZSAoZHVwMiBkZXNjX2ZpbGUpIHN0ZGVyciBjbG9zZSBk ZXNjX2ZpbGUKICAgICAgICB8IE91dF9hcHBlbmRfdG9fZmlsZSBmaWxlIC0+CiAgICAgICAgICAg IGxldCBkZXNjX2ZpbGUgPSBvcGVuZmlsZSBmaWxlIFtPX1dST05MWTtPX0FQUEVORDtPX0NSRUFU XSBwZXJtIGluCiAgICAgICAgICAgIHRyeV9maW5hbGl6ZSAoZHVwMiBkZXNjX2ZpbGUpIHN0ZG91 dCBjbG9zZSBkZXNjX2ZpbGUKICAgICAgICB8IEVycl90b19vdXQgLT4gZHVwMiBzdGRvdXQgc3Rk ZXJyCiAgICAgICAgfCBJbl9mcm9tX3N0cmluZyBzIC0+CiAgICAgICAgICAgIGJlZ2luIG1hdGNo IHRlbXBfZmlsZSB3aXRoCiAgICAgICAgICAgICAgU29tZSB0bXAgLT4KICAgICAgICAgICAgICAg IGZpbGVfb2Zfc3RyaW5nIH5maWxlOiB0bXAgfmNvbnRlbnRzOiBzOwogICAgICAgICAgICAgICAg bWFrZV9yZWRpcmVjdCAoSW5fZnJvbV9maWxlIHRtcCk7CiAgICAgICAgICAgIHwgTm9uZSAtPiBh c3NlcnQgZmFsc2UKICAgICAgICAgICAgZW5kCiAgICAgICAgfCBPdXRfbnVsbCAtPgogICAgICAg ICAgICBtYWtlX3JlZGlyZWN0IChPdXRfdG9fZmlsZSAiL2Rldi9udWxsIikKICAgICAgICB8IEVy cl9udWxsIC0+CiAgICAgICAgICAgIG1ha2VfcmVkaXJlY3QgKEVycl90b19maWxlICIvZGV2L251 bGwiKQogICAgICAgIHwgU2lsZW50IC0+CiAgICAgICAgICAgIG1ha2VfcmVkaXJlY3QgT3V0X251 bGw7CiAgICAgICAgICAgIG1ha2VfcmVkaXJlY3QgRXJyX3RvX291dDsKICAgICAgaW4KICAgICAg KCogd2Ugc2F2ZSBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIgdG8gcmVzdG9yZSB0aGVtIGFmdGVyIGZv cmsgKikKICAgICAgbGV0IHN0ZG91dF9iYWNrID0gVW5peC5kdXAgVW5peC5zdGRvdXQgaW4KICAg ICAgbGV0IHN0ZGVycl9iYWNrID0gVW5peC5kdXAgVW5peC5zdGRlcnIgaW4KICAgICAgbGV0IHN0 ZGluX2JhY2sgPSBVbml4LmR1cCBVbml4LnN0ZGluIGluCiAgICAgIExpc3QuaXRlciBtYWtlX3Jl ZGlyZWN0IHJlZGlyZWN0aW9uczsKICAgICAgbGV0IHBpZCA9IGNyZWF0ZV9wcm9jZXNzIGNtZCAo QXJyYXkuYXBwZW5kIFt8Y21kfF0gYXJncykgVW5peC5zdGRpbiBVbml4LnN0ZG91dCBVbml4LnN0 ZGVyciBpbgogICAgICBsZXQgXyxyZXMgPSB3YWl0cGlkIFtdIHBpZCBpbgogICAgICBiZWdpbiBt YXRjaCB0ZW1wX2ZpbGUgd2l0aAogICAgICB8U29tZSB0bXAgLT4gdW5saW5rX2YgdG1wCiAgICAg IHwgXyAtPiAoKQogICAgICBlbmQ7CiAgICAgICgqIHJlc3RvcnRpbmcgc3RkaW4sIHN0ZG91dCwg c3RkZXJyICopCiAgICAgIFVuaXguZHVwMiBzdGRvdXRfYmFjayBVbml4LnN0ZG91dDsKICAgICAg VW5peC5kdXAyIHN0ZGVycl9iYWNrIFVuaXguc3RkZXJyOwogICAgICBVbml4LmR1cDIgc3RkaW5f YmFjayBVbml4LnN0ZGluOwogICAgICByZXM7OwplbmQKCigqIHVuZGVyIHdpbmRvd3MsIHJlcGxh Y2UgdGhlIHR3byBmdW5jdGlvbnMgYnkgdGhvc2UgcHJvdmlkZWQgYnkgV2luRXhlYyBtb2R1bGUg KikKb3BlbiBXaW5FeGVjOzsKCgooKiogW2V4ZWNfYW5kX2dldF9maXJzdF9saW5lIGNvbSBhcmdz XSB0cmllcyB0byBleGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIHdpdGgKICAgIHRoZSBnaXZlbiBh cmd1bWVudHMsIGFuZCByZWFkIHRoZSBmaXJzdCBsaW5lIHByaW50ZWQgYnkgdGhlIGNvbW1hbmRl IG9uIGl0cwogICAgc3RhbmRhcmQgb3V0cHV0LiBJZiBhbnkgZXJyb3Igb2NjdXJzIG9yIHRoZSBw cm9ncmFtIGRvZXNuJ3QgcHJpbnQgYW55dGhpbmcgb24gc3Rkb3V0LAogICAgdGhlIGZ1bmN0aW9u IHJldHVybnMgWyIiXS4qKQpsZXQgZXhlY19hbmRfZ2V0X2ZpcnN0X2xpbmUgY29tIGFyZ3MgPQog IG1hdGNoCiAgICBoYW5kbGVfdW5peF9lcnJvcgogICAgICAoZnVuICgpIC0+IGV4ZWN2cF90b19s aXN0IGNvbSBhcmdzKSAoKQogIHdpdGgKICAgIFtdIC0+ICIiCiAgfCBoIDo6IF8gLT4gaAoKKCoq IFtleGVjX3N0YXR1c19vayBzdF0gcmV0dXJucyBbdHJ1ZV0gaWYgdGhlIGdpdmVuIHJldHVybiBz dGF0dXMgaXMgW1VuaXguV0VYSVRFRCAwXS4gKikKbGV0IGV4ZWNfc3RhdHVzX29rID0gZnVuY3Rp b24KICAgIFVuaXguV0VYSVRFRCAwIC0+IHRydWUKICB8IF8gLT4gZmFsc2UKCgooKiogezIgV3Jp dGluZyB0byBsb2cgZmlsZX0gKikKCmxldCBzdHJpbmdfb2ZfZGF0ZSB0ID0KICBsZXQgZCA9IFVu aXgubG9jYWx0aW1lIHQgaW4KICBQcmludGYuc3ByaW50ZiAiJTAyZC8lMDJkLyUwMmQgJTAyZDol MDJkOiUwMmQiCiAgICAoZC5Vbml4LnRtX3llYXIgKyAxOTAwKSAoZC5Vbml4LnRtX21vbisxKSBk LlVuaXgudG1fbWRheQogICAgZC5Vbml4LnRtX2hvdXIgZC5Vbml4LnRtX21pbiBkLlVuaXgudG1f c2VjCgooKiogW2FkZF90b19sb2cgc3RyXSB3cml0ZXMgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUg eyFsb2dfZmlsZX0sCiAgICB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIGF0IHRoZSBiZWdpbm5pbmcg b2YgdGhlIGxpbmUgYW5kIGFuIGVuZGluZyBuZXcgbGluZS4qKQpsZXQgYWRkX3RvX2xvZyBzID0K ICBsZXQgb2MgPSBvcGVuX291dF9nZW4KICAgICAgW09wZW5fd3Jvbmx5IDsgT3Blbl9hcHBlbmQg OyBPcGVuX2NyZWF0IDsgT3Blbl90ZXh0IF0KICAgICAgMG82NDQgIWxvZ19maWxlCiAgaW4KICBQ cmludGYuZnByaW50ZiBvYyAiJXM6ICVzXG4iCiAgICAoc3RyaW5nX29mX2RhdGUgKFVuaXgudGlt ZSgpKSkKICAgIHM7CiAgY2xvc2Vfb3V0IG9jCgooKiogezIgSGFuZGxpbmcgdmVyc2lvbiBudW1i ZXJzIH0gKikKCnR5cGUgdmVyc2lvbiA9IGludCBsaXN0CgooKiogW3YxIDw8IHYyXSByZXR1cm5z IFt0cnVlXSBpZiB2ZXJzaW9uIFt2MV0gaXMgc3RyaWN0bHkgaW5mZXJpb3IgdG8gdmVyc2lvbiBb djJdLiAqKQpsZXQgKDw8KSB2MSB2MiA9CiAgbGV0IHJlYyBpdGVyID0gZnVuY3Rpb24KICAgICAg KFtdLCBbXSkgLT4gZmFsc2UKICAgIHwgKFtdLCBfKSAtPiB0cnVlCiAgICB8IChfLFtdKSAtPiBm YWxzZQogICAgfCAoaDE6OnExLCBoMjo6cTIpIC0+CiAgICAgICAgKGgxIDwgaDIpIG9yCiAgICAg ICAgKGgxID0gaDIgJiYgKGl0ZXIgKHExLHEyKSkpCiAgaW4KICBpdGVyICh2MSx2MikKCigqKiBU aGUgZHVtbXkgdmVyc2lvbiBudW1iZXIgPSBbWzBdXS4gKikKbGV0IGR1bW15X3ZlcnNpb24gPSBb MF0KCigqKiBbdmVyc2lvbl9vZl9zdHJpbmcgc10gcmV0dXJucyBhIHZlcnNpb24gbnVtYmVyIGZy b20gdGhlIGdpdmVuIHN0cmluZyBbc10uCiAgICBbc10gbXVzdCBiIGluIHRoZSBmb3JtIFtYWy5Z Wy5aWy4uLl1dXV0uIElmIHRoZSBzdHJpbmcgaXMgbm90IGNvcnJlY3QsCiAgICB0aGVuIHRoZSBk dW1teSB2ZXJzaW9uIGlzIHJldHVybmVkLiAqKQpsZXQgdmVyc2lvbl9vZl9zdHJpbmcgcyA9CiAg bGV0IGwgPSBTdHIuc3BsaXQgKFN0ci5yZWdleHBfc3RyaW5nICIuIikgcyBpbgogIHRyeSBMaXN0 Lm1hcCBpbnRfb2Zfc3RyaW5nIGwKICB3aXRoIEZhaWx1cmUgXyAtPiBkdW1teV92ZXJzaW9uCgoo KiogW3N0cmluZ19vZl92ZXJzaW9uIHZdIHJldHVybnMgYSBzdHJpbmcgdG8gZGlzcGxheSB0aGUg Z2l2ZW4gdmVyc2lvbi4KICAgIEZvciBleGFtcGxlLCBbc3RyaW5nX29mX3ZlcnNpb24gWzE7Mjsz XSA9ICIxLjIuMyJdLiAqKQpsZXQgc3RyaW5nX29mX3ZlcnNpb24gdiA9CiAgU3RyaW5nLmNvbmNh dCAiLiIgKExpc3QubWFwIHN0cmluZ19vZl9pbnQgdikKCigqKiB7MiBIYW5kbGluZyBPQ2FtbCBj b25maWd1cmF0aW9ufSAqKQoKKCoqIFJlcHJlc2VudGF0aW9uIG9mIHRoZSAobG9jYWxseSBkZXRl Y3RlZCkgb2NhbWwgY29uZmlndXJhdGlvbi4gKikKdHlwZSBvY2FtbF9jb25mID0KICAgIHsKICAg ICBvY2FtbCA6IHN0cmluZyA7CiAgICAgb2NhbWxjIDogc3RyaW5nIDsKICAgICBvY2FtbG9wdCA6 IHN0cmluZyA7CiAgICAgb2NhbWxkZXAgOiBzdHJpbmcgOwogICAgIG9jYW1sZG9jIDogc3RyaW5n IDsKICAgICBvY2FtbGRvY19vcHQgOiBzdHJpbmcgOwogICAgIG9jYW1sbGV4IDogc3RyaW5nIDsK ICAgICBvY2FtbHlhY2MgOiBzdHJpbmcgOwogICAgIG9jYW1sbWtsaWIgOiBzdHJpbmcgOwogICAg IG9jYW1sbWt0b3AgOiBzdHJpbmcgOwogICAgIG9jYW1scHJvZiA6IHN0cmluZyA7CiAgICAgY2Ft bHA0IDogc3RyaW5nOwogICAgIG9jYW1sZmluZCA6IHN0cmluZyA7CiAgICAgdmVyc2lvbl9zdHJp bmcgOiBzdHJpbmcgOwogICAgIHZlcnNpb24gOiB2ZXJzaW9uIDsKICAgfQoKCgpleGNlcHRpb24g UHJvZ3JhbV9ub3RfZm91bmQgb2Ygc3RyaW5nCgooKiogW29jYW1sX3Byb2cgZmlsZV0gcmV0dXJu IHRoZSBmaXJzdCBleGVjdXRhYmxlIGNhbGxlZCBbZmlsZV0gaW4KICAgIHRoZSBkaXJlY3Rvcmll cyBvZiB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICAgIEBwYXJhbSBlcnIgY2FuIGJl IHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciBub3QgZmluZGluZyB0aGUgcHJvZ3JhbQogICAgc2hv dWxkIHJhaXNlIHRoZSBbUHJvZ3JhbV9ub3RfZm91bmRdIGV4Y2VwdGlvbiAoW2Vycj10cnVlXSwg ZGVmYXVsdCkKICAgIG9yIHJhdGhlciByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIChbZXJyPWZhbHNl XSkuCiAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIG1lc3NhZ2VzIGluZGljYXRpbmcgd2hhdCBwcm9n cmFtIGlzIHNlYXJjaGVkLCBhbmQgdGhlIHJlc3VsdCwKICAgIHVzaW5nIHRoZSB7IXByaW50fSBm dW5jdGlvbi4KICopCmxldCBvY2FtbF9wcm9nID8oZXJyPXRydWUpIGZpbGUgPQogICFwcmludCAo UHJpbnRmLnNwcmludGYgImNoZWNraW5nIGZvciAlcy4uLiAiIGZpbGUpOwogIG1hdGNoCiAgICBo YW5kbGVfdW5peF9lcnJvcgogICAgICAoZnVuICgpIC0+IGZpbmRfaW5fcGF0aCAodGVzdGZpbGUg W0ZleGVjdXRhYmxlXSkgKGdldF9wYXRoKCkpIGZpbGUpCiAgICAgICgpCiAgd2l0aAogICAgW10g LT4KICAgICAgIXByaW50ICJub1xuIjsKICAgICAgaWYgZXJyIHRoZW4gcmFpc2UgKFByb2dyYW1f bm90X2ZvdW5kIGZpbGUpIGVsc2UgIiIKICB8IHMgOjogXyAtPgogICAgICAhcHJpbnQgKHNeIlxu Iik7IHMKOzsKCigqKiBbb2NhbWxfbGliZGlyIGNvbmZdIHVzZXMgdGhlIFtvY2FtbGNdIHByb2dy YW0gb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24KICAgIHRvIHJldHJpZXZlIHRoZSBsaWJyYXJ5 IGRpcmVjdG9yeS4KICAgIFJldHVybiBbIiJdIGlmIGFueSBlcnJvciBvY2N1cnMuKikKbGV0IG9j YW1sX2xpYmRpciBjb25mID0KICBtYXRjaAogICAgaGFuZGxlX3VuaXhfZXJyb3IKICAgICAgKGZ1 biAoKSAtPiBleGVjdnBfdG9fbGlzdCBjb25mLm9jYW1sYyBbfCAiLXYiIHxdKQogICAgICAoKQog IHdpdGgKICAgIFtdIHwgW19dIC0+ICIiCiAgfCBfIDo6IGwgOjogXyAtPgogICAgICB0cnkKCWxl dCBwID0gU3RyaW5nLmluZGV4IGwgJzonIGluCglTdHJpbmcuc3ViIGwgKHArMikgKFN0cmluZy5s ZW5ndGggbCAtIHAgLSAyKQogICAgICB3aXRoCglJbnZhbGlkX2FyZ3VtZW50IF8KICAgICAgfAlO b3RfZm91bmQgLT4KCSAgIiIKOzsKCigqKiBbdmVyc2lvbl9vZl9vY2FtbF92ZXJzaW9uX3N0cmlu ZyBzdHJdIHJldHVybnMgYSB7IXR5cGU6dmVyc2lvbn0gdmFsdWUgZnJvbQogICAgdGhlIHN0cmlu ZyByZXByZXNlbnRpbmcgYW4gb2NhbWwgdmVyc2lvbiAod2hpY2ggY2FuIGNvbnRhaW4gJysnLCBh IGRhdGUsIC4uLikuICopCmxldCB2ZXJzaW9uX29mX29jYW1sX3ZlcnNpb25fc3RyaW5nIHMgPQog IGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW4KICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgbGVu IGluCiAgbGV0IHJlYyBpdGVyIG4gPQogICAgaWYgbiA8IGxlbiB0aGVuCiAgICAgIG1hdGNoIHMu W25dIHdpdGgKCScwJy4uJzknIHwgJy4nIC0+IEJ1ZmZlci5hZGRfY2hhciBiIHMuW25dOyBpdGVy IChuKzEpCiAgICAgIHwgXyAtPiAoKQogIGluCiAgaXRlciAwOwogIHZlcnNpb25fb2Zfc3RyaW5n IChCdWZmZXIuY29udGVudHMgYikKCigqKiBbY2hlY2tfdmVyc2lvbiB2ZXJzaW9uIHByb2ddIHRy aWVzIHRvIHJ1biBbcHJvZyAtdmVyc2lvbl0gYW5kIHJldHVybgogICAgd2hldGhlciB0aGUgZ2l2 ZW4gdmVyc2lvbiBzdHJpbmcgaXMgYSBzdWZmaXggb2YgdGhlIGZpcnN0IGxpbmUgcHJpbnRlZC4K ICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayB0aGF0IGFuIG9jYW1sIHByb2dyYW0g aGFzIHRoZSBjb3JyZWN0CiAgICB2ZXJzaW9uIG51bWJlci4KICAgIEBwYXJhbSBvbl9lcnIgY2Fu IGJlIHVzZWQgdG8gaW5kaWNhdGUgYW5vdGhlciBmdW5jdGlvbiB0byBjYWxsIGl0CiAgICB0aGUg cHJvZ3JhbSBpcyBub3QgaW4gdGhlIGNvcnJlY3QgdmVyc2lvbi4gRGVmYXVsdCBpcyBbIV17IWZh dGFsX2Vycm9yfS4KICopCmxldCBjaGVja192ZXJzaW9uID8ob25fZXJyPSAhZmF0YWxfZXJyb3Ip IHZlcnNpb24gcHJvZyA9CiAgbWF0Y2ggcHJvZyB3aXRoCiAgICAiIiAtPiAoKQogIHwgXyAtPgog ICAgICBtYXRjaCBoYW5kbGVfdW5peF9lcnJvcgoJICAoZnVuICgpIC0+IGV4ZWN2cF90b19saXN0 IHByb2cgW3wgIi12ZXJzaW9uIiB8XSkgKCkKICAgICAgd2l0aAoJW10gLT4KCSAgbGV0IHMgPSBQ cmludGYuc3ByaW50ZiAiY291bGQgbm90IGdldCB2ZXJzaW9uIG9mICVzIiBwcm9nIGluCgkgIG9u X2VyciBzCiAgICAgIHwgcyA6OiBfIC0+CgkgIGlmIG5vdCAoaXNfc3VmZml4IH5zdWY6IHZlcnNp b24gcykgdGhlbgoJICAgIGxldCBzID0gUHJpbnRmLnNwcmludGYgIiVzIGlzIG5vdCB2ZXJzaW9u ICVzIiBwcm9nIHZlcnNpb24gaW4KCSAgICBvbl9lcnIgcwoKKCoqIFtjaGVja19jb25mX3ZlcnNp b24gY29uZl0gdmVyaWZpZXMgdGhhdCBlYWNoIHByb2dyYW0gb2YgdGhlIGdpdmVuIGNvbmZpZ3Vy YXRpb24KICAgIGlzIG9mIHRoZSBjb3JyZWN0IHZlcnNpb24uCiAgICBJZiBhIHByb2dyYW0gaXMg bm90IGluIHRoZSBjb3JyZWN0IHZlcnNpb24sIFshXXshZmF0YWxfZXJyb3J9IGlzIGNhbGxlZC4K ICopCmxldCBjaGVja19jb25mX3ZlcnNpb25zIGNvbmYgPQogIExpc3QuaXRlciAoY2hlY2tfdmVy c2lvbiBjb25mLnZlcnNpb25fc3RyaW5nKQogICAgWyBjb25mLm9jYW1sb3B0IDsgY29uZi5vY2Ft bGRlcCA7IGNvbmYub2NhbWxkb2MgOwogICAgICBjb25mLm9jYW1sbGV4IDsgY29uZi5vY2FtbHlh Y2MgOyBjb25mLm9jYW1sbWtsaWIgOwogICAgICBjb25mLm9jYW1sbWt0b3AgOwogICAgICAoKiBu b3QgeWV0IGNvbmYub2NhbWxwcm9mIDsgKikKICAgIF0KCigqKiBbY2hlY2tfZm9yX29wdF9wcm9n IHZlcnNpb24gcHJvZ10gY2hlY2tzIHdoZXRoZXIgdGhlIFtwcm9nLm9wdF0gcHJvZ3JhbQogICAg aXMgaW4gdGhlIHJlcXVpcmVkIHZlcnNpb24sIGFuZCBpZiBzbyByZXR1cm5zIHRoaXMgcHJvZ3Jh bSBuYW1lOyBlbHNlCiAgICBpdCByZXR1cm5zIHRoZSBnaXZlbiBwcm9ncmFtIG5hbWUuICopCmxl dCBjaGVja19mb3Jfb3B0X3Byb2cgdmVyc2lvbiBwcm9nID0KICBtYXRjaCBwcm9nIHdpdGgKICAg ICIiIC0+ICIiCiAgfCBfIC0+CiAgICAgIGxldCBvcHQgPSBQcmludGYuc3ByaW50ZiAiJXMub3B0 IiAoRmlsZW5hbWUuYmFzZW5hbWUgcHJvZykgaW4KICAgICAgdHJ5CglsZXQgb3B0ID0gb2NhbWxf cHJvZyBvcHQgaW4KCWNoZWNrX3ZlcnNpb24KCSAgfm9uX2VycjooZnVuIG0gLT4gIXByaW50ICht XiJcbiIpOyByYWlzZSAoUHJvZ3JhbV9ub3RfZm91bmQgIiIpKQoJICB2ZXJzaW9uIG9wdDsKCSFw cmludCAoUHJpbnRmLnNwcmludGYgIndlIGNhbiB1c2UgJXNcbiIgb3B0KTsKCW9wdAogICAgICB3 aXRoCglQcm9ncmFtX25vdF9mb3VuZCBfIC0+IHByb2cKCigqKiBbZ2V0X29wdF9jb25mIGNvbmZd IHJldHVybnMgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB3aGVyZSBzb21lIHByb2dyYW0KICAgIG5h bWVzIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGUgIm9wdCIgdmVyc2lvbiAoWyIuLi4uL29jYW1s Yy5vcHQiXSBpbnN0ZWFkCiAgICBvZiBbIi4uLi4vb2NhbWxjIl0gZm9yIGV4YW1wbGUpLgogICAg VG8gZG8gc28sIHRoZSBmdW5jdGlvbiB2ZXJpZmllcyBpZiB0aGUgIi5vcHQiIHByb2dyYW0gZm91 bmQgZm9yIGVhY2ggcHJvZ3JhbQogICAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW4gdGhlIHNh bWUgdmVyc2lvbiBvZiB0aGUgYnl0ZWNvZGUgcHJvZ3JhbS4KICAgIEZvciBbb2NhbWxkb2NdLCB0 aGUgcHJvZ3JhbSBpbiB0aGUgW29jYW1sZG9jXSBmaWVsZCBpcyBub3QgcmVwbGFjZWQgYnV0IHRo ZSBbb2NhbWxkb2Nfb3B0XQogICAgZmllbGQgaXMgc2V0IHRvIFsiLi4uLi9vY2FtbGRvYy5vcHQi XSwgYmVjYXVzZSBib3RoIGJ5dGVjb2RlIGFuZCBuYXRpdmUgdmVyc2lvbnMKICAgIGNhbiBiZSB1 c2VkIChmb3IgZXhhbXBsZSB0aGUgYnl0ZWNvZGUgdmVyc2lvbiBpcyByZXF1aXJlZCB0byB1c2Ug Y3VzdG9tIGdlbmVyYXRvcnMpLiopCmxldCBnZXRfb3B0X2NvbmYgY29uZiA9CiAgbGV0IGYgPSBj aGVja19mb3Jfb3B0X3Byb2cgY29uZi52ZXJzaW9uX3N0cmluZyBpbgogIHsgY29uZiB3aXRoCiAg ICBvY2FtbGMgPSBmIGNvbmYub2NhbWxjIDsKICAgIG9jYW1sb3B0ID0gZiBjb25mLm9jYW1sb3B0 IDsKICAgIG9jYW1sZG9jX29wdCA9IGYgY29uZi5vY2FtbGRvYyA7CiAgICBvY2FtbGxleCA9IGYg Y29uZi5vY2FtbGxleCA7CiAgICBvY2FtbGRlcCA9IGYgY29uZi5vY2FtbGRlcCA7CiAgfQoKKCoq IFtvY2FtbF9jb25mICgpXSBkZXRlY3RzIGFuZCByZXR1cm5zIHRoZSBPYmplY3RpdmUgQ2FtbCBj b25maWd1cmF0aW9uIGZvdW5kIGZyb20gdGhlIFBBVEguCiAgICBUaGUgZnVuY3Rpb24gY2hlY2tz IHRoYXQgdGhlIHByb2dyYW1zIGZvdW5kIGFyZSBpbiB0aGUgc2FtZSB2ZXJzaW9uIChzZWUgeyFj aGVja19jb25mX3ZlcnNpb25zfSksCiAgICBhbmQgcmVmZXIgdG8gdGhlICIub3B0IiBwcm9ncmFt cyB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZSAoc2VlIHshZ2V0X29wdF9jb25mfSkuCiAgICBAcGFy YW0gd2l0aG9wdCBjYW4gYmUgdXNlZCB0byByYWlzZSBhIHshUHJvZ3JhbV9ub3RfZm91bmR9IGV4 Y2VwdGlvbiBpZiB0aGUgbmF0aXZlIGNvZGUgY29tcGlsZXIgaXMgbm90IGZvdW5kOwogICAgZGVm YXVsdCBpcyBbZmFsc2VdLgogICAgQHBhcmFtIG9jYW1sZmluZCBjYW4gYmUgdXNlZCB0byBlbmQg dXAgd2l0aCBhIHshUHJvZ3JhbV9ub3RfZm91bmR9IGV4Y2VwdGlvbiBpZiB0aGUgW29jYW1sZmlu ZF0gdG9vbCBpcyBub3QgZm91bmQ7CiAgICBkZWZhdWx0IGlzIFtmYWxzZV0uCiAgICBAcmFpc2Ug UHJvZ3JhbV9ub3QgZm91bmQgaWYgYSByZXF1aXJlZCBwcm9ncmFtIGNhbm5vdCBiZSBmb3VuZC4K ICopCgpsZXQgZXhlX2V4dGVuc2lvbiA9CiAgbWF0Y2ggKFN5cy5vc190eXBlPSJXaW4zMiIpIHdp dGgKICB8dHJ1ZSAtPiAiLmV4ZSIKICB8ZmFsc2UgLT4gIiI7OwoKbGV0IG9jYW1sX2NvbmYgPyh3 aXRob3B0PWZhbHNlKSA/KG9jYW1sZmluZD1mYWxzZSkgKCkgPQogIGxldCBvY2FtbGMgPSBvY2Ft bF9wcm9nICgib2NhbWxjIl5leGVfZXh0ZW5zaW9uKSBpbgogIGxldCB2ZXJzaW9uX3N0cmluZyA9 IGV4ZWNfYW5kX2dldF9maXJzdF9saW5lICBvY2FtbGMgW3wgIi12ZXJzaW9uIiB8XSBpbgogIGxl dCB2ZXJzaW9uID0gdmVyc2lvbl9vZl9vY2FtbF92ZXJzaW9uX3N0cmluZyB2ZXJzaW9uX3N0cmlu ZyBpbgogICFwcmludCAoUHJpbnRmLnNwcmludGYgImZvdW5kIE9DYW1sIHZlcnNpb24gJXMgKCVz KVxuIiAoc3RyaW5nX29mX3ZlcnNpb24gdmVyc2lvbikgdmVyc2lvbl9zdHJpbmcpOwogIGxldCBj b25mID0gewogICAgb2NhbWxjID0gb2NhbWxjIDsKICAgIHZlcnNpb25fc3RyaW5nID0gdmVyc2lv bl9zdHJpbmcgOwogICAgdmVyc2lvbiA9IHZlcnNpb24gOwogICAgb2NhbWwgPSBvY2FtbF9wcm9n ICgib2NhbWwiXmV4ZV9leHRlbnNpb24pIDsKICAgIG9jYW1sb3B0ID0gb2NhbWxfcHJvZyB+ZXJy OiB3aXRob3B0ICgib2NhbWxvcHQiXmV4ZV9leHRlbnNpb24pIDsKICAgIG9jYW1sZG9jID0gb2Nh bWxfcHJvZyAoIm9jYW1sZG9jIl5leGVfZXh0ZW5zaW9uKSA7CiAgICBvY2FtbGRvY19vcHQgPSAi IiA7CiAgICBvY2FtbHlhY2MgPSBvY2FtbF9wcm9nICgib2NhbWx5YWNjIl5leGVfZXh0ZW5zaW9u KSA7CiAgICBvY2FtbGxleCA9IG9jYW1sX3Byb2cgKCJvY2FtbGxleCJeZXhlX2V4dGVuc2lvbikg OwogICAgb2NhbWxkZXAgPSBvY2FtbF9wcm9nICgib2NhbWxkZXAiXmV4ZV9leHRlbnNpb24pIDsK ICAgIG9jYW1sbWtsaWIgPSBvY2FtbF9wcm9nICgib2NhbWxta2xpYiJeZXhlX2V4dGVuc2lvbikg OwogICAgb2NhbWxta3RvcCA9IG9jYW1sX3Byb2cgKCJvY2FtbG1rdG9wIl5leGVfZXh0ZW5zaW9u KSA7CiAgICBvY2FtbHByb2YgPSBvY2FtbF9wcm9nICgib2NhbWxwcm9mIl5leGVfZXh0ZW5zaW9u KSA7CiAgICBjYW1scDQgPSBvY2FtbF9wcm9nICgiY2FtbHA0Il5leGVfZXh0ZW5zaW9uKSA7CiAg ICBvY2FtbGZpbmQgPSBvY2FtbF9wcm9nIH5lcnI6IG9jYW1sZmluZCAoIm9jYW1sZmluZCJeZXhl X2V4dGVuc2lvbikgOwogIH0gaW4KICBjaGVja19jb25mX3ZlcnNpb25zIGNvbmY7CiAgZ2V0X29w dF9jb25mIGNvbmYKCigqKiBbcHJpbnRfY29uZiBjb25mXSBwcmludHMgdGhlIGdpdmVuIGNvbmZp Z3VyYXRpb24gdXNpbmcgWyFdeyFwcmludH0uICopCmxldCBwcmludF9jb25mIGMgPQogIGxldCBz cCA9IFByaW50Zi5zcHJpbnRmIGluCiAgIXByaW50IChzcCAiT2JqZWN0aXZlLUNhbWwgdmVyc2lv biAlcyAoJXMpXG4iIChzdHJpbmdfb2ZfdmVyc2lvbiBjLnZlcnNpb24pIGMudmVyc2lvbl9zdHJp bmcpOwogICFwcmludCAoc3AgImludGVycHJldGVyOiAgICAgICAgICAgICAgICAlc1xuIiBjLm9j YW1sKTsKICAhcHJpbnQgKHNwICJieXRlY29kZSBjb21waWxlcjogICAgICAgICAgJXNcbiIgYy5v Y2FtbGMpOwogICFwcmludCAoc3AgIm5hdGl2ZSBjb2RlIGNvbXBpbGVyOiAgICAgICAlc1xuIiBj Lm9jYW1sb3B0KTsKICAhcHJpbnQgKHNwICJkb2N1bWVudGF0aW9uIGdlbmVyYXRvcihzKTogJXMl c1xuIiBjLm9jYW1sZG9jCgkgICAgKGlmIGMub2NhbWxkb2Nfb3B0IDw+ICIiICYmIGMub2NhbWxk b2Nfb3B0IDw+IGMub2NhbWxkb2MgdGhlbgoJICAgICAgc3AgIiwgJXMiIGMub2NhbWxkb2Nfb3B0 IGVsc2UgIiIKCSAgICApCgkgKTsKICAhcHJpbnQgKHNwICJsZXhlciBnZW5lcmF0b3I6ICAgICAg ICAgICAgJXNcbiIgYy5vY2FtbGxleCk7CiAgIXByaW50IChzcCAicGFyc2VyIGdlbmVyYXRvcjog ICAgICAgICAgICVzXG4iIGMub2NhbWx5YWNjKTsKICAhcHJpbnQgKHNwICJkZXBlbmRlbmNpZXMg Z2VuZXJhdG9yOiAgICAgJXNcbiIgYy5vY2FtbGRlcCk7CiAgIXByaW50IChzcCAibGlicmFyeSBi dWlsZGVyOiAgICAgICAgICAgICVzXG4iIGMub2NhbWxta2xpYik7CiAgIXByaW50IChzcCAidG9w bGV2ZWwgYnVpbGRlcjogICAgICAgICAgICVzXG4iIGMub2NhbWxta3RvcCk7CiAgIXByaW50IChz cCAicHJvZmlsZXI6ICAgICAgICAgICAgICAgICAgICVzXG4iIGMub2NhbWxwcm9mKTsKICAhcHJp bnQgKHNwICJjYW1scDQ6ICAgICAgICAgICAgICAgICAgICAgJXNcbiIgYy5jYW1scDQpOwogICht YXRjaCBjLm9jYW1sZmluZCB3aXRoICIiIC0+ICgpIHwgcyAtPgogICAgIXByaW50IChzcCAib2Nh bWxmaW5kOiAgICAgICAgICAgICAgICAgICVzXG4iIHMpKQoKCigqKiB7Mjpjb21waWxpbmcgVGVz dGluZyBjb21waWxhdGlvbiBhbmQgbGlua30gKikKCnR5cGUgY29tcGlsYXRpb25fbW9kZSA9IFsg YEJ5dGUgfCBgT3B0IF0KCmxldCBzdHJpbmdfb2ZfbW9kZSA9IGZ1bmN0aW9uCiAgICBgQnl0ZSAt PiAiYnl0ZSIKICB8IGBPcHQgLT4gIm9wdCIKCmxldCBvY2FtbGNfb2ZfbW9kZSBjb25mID0gZnVu Y3Rpb24KICAgIGBCeXRlIC0+IGNvbmYub2NhbWxjCiAgfCBgT3B0IC0+IGNvbmYub2NhbWxvcHQK CmxldCBzdHJpbmdfb2ZfY29tX2FyZ3MgY29tIGFyZ3MgPQogIFByaW50Zi5zcHJpbnRmICIlcyAl cyIKICAgIGNvbQogICAgKFN0cmluZy5jb25jYXQgIiAiCiAgICAgICAoTGlzdC5tYXAgRmlsZW5h bWUucXVvdGUgKEFycmF5LnRvX2xpc3QgYXJncykpKQoKbGV0IGNhbl9jb21waWxlIG1vZGUgY29u ZiA/KGluY2x1ZGVzPVtdKSA/KG9wdGlvbnM9W10pIGZpbGUgPQogIGxldCBvY2FtbGMgPSBvY2Ft bGNfb2ZfbW9kZSBjb25mIG1vZGUgaW4KICBsZXQgYXJncyA9IEFycmF5Lm9mX2xpc3QKICAgICAg KAogICAgICAgIi1jIiA6OgogICAgICAgKExpc3QuZmxhdHRlbiAoTGlzdC5tYXAgKGZ1biBzIC0+ IFsgIi1JIiA7IHNdKSAocmVtb3ZlX2VtcHR5X3N0cmluZ3MgaW5jbHVkZXMpKSkgQAogICAgICAg b3B0aW9ucyBACiAgICAgICBbZmlsZV0KICAgICAgKQogIGluCiAgYWRkX3RvX2xvZyAoc3RyaW5n X29mX2NvbV9hcmdzIG9jYW1sYyBhcmdzKTsKICBleGVjX3N0YXR1c19vayAoZXhlY3ZwX3JlZGly ZWN0IFtPdXRfYXBwZW5kX3RvX2ZpbGUgIWxvZ19maWxlO0Vycl90b19vdXRdIG9jYW1sYyBhcmdz KQoKbGV0IGNhbl9jb21waWxlX3Byb2cgP21lcyBtb2RlIGNvbmYgP2luY2x1ZGVzID9vcHRpb25z IHByb2cgPQogIChtYXRjaCBtZXMgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBzIC0+ICFwcmludCBz KTsKICBsZXQgcmVzID0KICAgIGhhbmRsZV91bml4X2Vycm9yIChmdW4gKCkgLT4KICAgICAgbGV0 IGZpbGUgPSBjcmVhdGVfdGVtcF9maWxlIH5jb250ZW50czogcHJvZyAoKSBpbgogICAgICB0cnlf ZmluYWxpemUgKGNhbl9jb21waWxlIG1vZGUgY29uZiA/aW5jbHVkZXMgP29wdGlvbnMpIGZpbGUg dW5saW5rX2YgZmlsZSkgKCkKICBpbgogIChtYXRjaCBtZXMgd2l0aCBOb25lIC0+ICgpIHwgU29t ZSBfIC0+ICFwcmludCAoKCFzdHJpbmdfb2ZfYm9vbCByZXMpXiJcbiIpKTsKICByZXMKOzsKCmxl dCBvY2FtbF9kZWZpbmVkID9tZXMgbW9kZSBjb25mID9pbmNsdWRlcyA/b3B0aW9ucyB2ID0KICBo YW5kbGVfdW5peF9lcnJvciAoZnVuICgpIC0+CiAgICBsZXQgcHJvZyA9IFByaW50Zi5zcHJpbnRm ICJsZXQgXyA9ICVzOztcbiIgdiBpbgogICAgY2FuX2NvbXBpbGVfcHJvZyA/bWVzIG1vZGUgY29u ZiA/aW5jbHVkZXMgP29wdGlvbnMgcHJvZykgKCkKOzsKCmxldCBvY2FtbF92YWx1ZV9oYXNfdHlw ZSA/bWVzIG1vZGUgY29uZiA/aW5jbHVkZXMgP29wdGlvbnMgdiB0ID0KICBoYW5kbGVfdW5peF9l cnJvciAoZnVuICgpIC0+CiAgICBsZXQgcHJvZyA9IFByaW50Zi5zcHJpbnRmICJsZXQgKF8gOiAl cykgPSAlczs7XG4iIHQgdiBpbgogICAgY2FuX2NvbXBpbGVfcHJvZyA/bWVzIG1vZGUgY29uZiA/ aW5jbHVkZXMgcHJvZykgKCkKOzsKCmxldCBjYW5fbGluayA/bWVzIG1vZGUgY29uZiA/b3V0ID8o aW5jbHVkZXM9W10pID8obGlicz1bXSkgPyhvcHRpb25zPVtdKSBmaWxlcyA9CiAgKG1hdGNoIG1l cyB3aXRoIE5vbmUgLT4gKCkgfCBTb21lIHMgLT4gIXByaW50IHMpOwogIGxldCBvY2FtbGMgPSBv Y2FtbGNfb2ZfbW9kZSBjb25mIG1vZGUgaW4KICBsZXQgbGlicyA9IG1hdGNoIG1vZGUgd2l0aAog ICAgYEJ5dGUgLT4gbGlicwogIHwgYE9wdCAtPiBMaXN0Lm1hcCBieXRlX2V4dF90b19vcHQgbGli cwogIGluCiAgbGV0IGZpbGVzID0gbWF0Y2ggbW9kZSB3aXRoCiAgICBgQnl0ZSAtPiBmaWxlcwog IHwgYE9wdCAtPiBMaXN0Lm1hcCBieXRlX2V4dF90b19vcHQgZmlsZXMKICBpbgogIGxldCBvdXRm aWxlID0gbWF0Y2ggb3V0IHdpdGgKICAgIE5vbmUgLT4gY3JlYXRlX3RlbXBfZmlsZSB+ZXh0OiAi b3V0IiAoKQogIHwgU29tZSBmIC0+IGYKICBpbgogIGxldCBhcmdzID0gQXJyYXkub2ZfbGlzdAog ICAgICAoCiAgICAgICAiLWxpbmthbGwiIDo6CiAgICAgICAiLW8iIDo6IG91dGZpbGUgOjoKICAg ICAgIChMaXN0LmZsYXR0ZW4gKExpc3QubWFwIChmdW4gcyAtPiBbIi1JIjsgc10pIChyZW1vdmVf ZW1wdHlfc3RyaW5ncyBpbmNsdWRlcykpKSBACiAgICAgICBsaWJzIEAKICAgICAgIG9wdGlvbnMg QAogICAgICAgZmlsZXMKICAgICAgKQogIGluCiAgYWRkX3RvX2xvZyAoc3RyaW5nX29mX2NvbV9h cmdzIG9jYW1sYyBhcmdzKTsKICBsZXQgc3VjY2VzcyA9CiAgICBleGVjX3N0YXR1c19vayAoZXhl Y3ZwX3JlZGlyZWN0IFtPdXRfYXBwZW5kX3RvX2ZpbGUgIWxvZ19maWxlOyBFcnJfdG9fb3V0XSBv Y2FtbGMgYXJncykKICBpbgogICgKICAgbWF0Y2ggb3V0IHdpdGgKICAgICBOb25lIC0+IHVubGlu a19mIG91dGZpbGUKICAgfCBTb21lIF8gd2hlbiBub3Qgc3VjY2VzcyAtPiB1bmxpbmtfZiBvdXRm aWxlCiAgIHwgXyAtPiAoKQogICk7CiAgKG1hdGNoIG1lcyB3aXRoIE5vbmUgLT4gKCkgfCBTb21l IF8gLT4gIXByaW50ICgoIXN0cmluZ19vZl9ib29sIHN1Y2Nlc3MpXiJcbiIpKTsKICBzdWNjZXNz CgpsZXQgdHJ5X3J1biBjb20gPSBTeXMuY29tbWFuZCBjb20gPSAwCgooKiogezI6b2NhbWxmaW5k IE9DYW1sZmluZCBxdWVyaWVzfSAqKQoKKCoqIFtvY2FtbGZpbmRfcXVlcnkgY29uZiBwYWNrYWdl XSByZXR1cm5zIHRoZSBmaXJzdCBsaW5lIHByaW50ZWQgYnkgIm9jYW1sZmluZCBxdWVyeSBwYWNr YWdlIi4KICAgIElmIGFuIGVycm9yIG9jY3VycyAodGhlIHBhY2thZ2UgZG9lcyBub3QgZXhpc3Qs IG9jYW1sZmluZCBjYW5ub3QgYmUgZXhlY3V0ZWQsIC4uLiksCiAgICB0aGUgZnVuY3Rpb24gcmV0 dXJucyBbTm9uZV0uCiAqKQpsZXQgb2NhbWxmaW5kX3F1ZXJ5IGNvbmYgcGFja2FnZSA9CiAgbWF0 Y2ggY29uZi5vY2FtbGZpbmQgd2l0aAogICAgIiIgLT4gTm9uZQogIHwgXyAtPgogICAgICB0cnkK CW1hdGNoIGV4ZWNfYW5kX2dldF9maXJzdF9saW5lIGNvbmYub2NhbWxmaW5kIFt8ICJxdWVyeSI7 IHBhY2thZ2UgfF0gd2l0aAoJICAiIiAtPiBOb25lCgl8IHMgLT4gU29tZSBzCiAgICAgIHdpdGgK CV8gLT4gTm9uZQoKKCoqIHsyOnN1YnN0cyBIYW5kbGluZyBzdWJzdGl0dXRpb25zIHNwZWNpZmlj YXRpb259ICopCgpsZXQgc3Vic3RzID0gSGFzaHRibC5jcmVhdGUgMzcKbGV0IGFkZF9zdWJzdCA9 IEhhc2h0YmwucmVwbGFjZSBzdWJzdHMKbGV0IHN1YnN0X3ZhbCB2YXIgPQogIHRyeSBIYXNodGJs LmZpbmQgc3Vic3RzIHZhcgogIHdpdGggTm90X2ZvdW5kIC0+ICIiCmxldCBnZXRfc3Vic3RzX2xp c3QgKCkgPQogIEhhc2h0YmwuZm9sZCAoZnVuIHZhciB2IGFjYyAtPiAodmFyLHYpOjphY2MpIHN1 YnN0cyBbXQoKbGV0IG91dHB1dF9zdWJzdHMgb2MgPQogIExpc3QuaXRlcgogICAgKGZ1biAodmFy LCB2KSAtPiBQcmludGYuZnByaW50ZiBvYyAiJXM9XCIlc1wiXG4iIHZhciB2KQogICAgKGdldF9z dWJzdHNfbGlzdCAoKSkKCmxldCBvdXRwdXRfc3Vic3RzX3RvX2ZpbGUgZmlsZSA9CiAgbGV0IGNv bnRlbnRzID0gU3RyaW5nLmNvbmNhdCAiXG4iCiAgICAgIChMaXN0Lm1hcCAoZnVuICh2YXIsdikg LT4gUHJpbnRmLnNwcmludGYgIiVzPVwiJXNcIiIgdmFyIHYpIChnZXRfc3Vic3RzX2xpc3QoKSkp CiAgaW4KICBmaWxlX29mX3N0cmluZyB+ZmlsZSB+Y29udGVudHMKCmxldCBhZGRfY29uZl92YXJp YWJsZXMgYyA9CiAgbGV0IGwgPQogICAgWyAiT0NBTUwiLCBjLm9jYW1sIDsKICAgICAgIk9DQU1M QyIsIGMub2NhbWxjIDsKICAgICAgIk9DQU1MT1BUIiwgYy5vY2FtbG9wdCA7CiAgICAgICJPQ0FN TERFUCIsIGMub2NhbWxkZXAgOwogICAgICAiT0NBTUxET0MiLCBjLm9jYW1sZG9jIDsKICAgICAg Ik9DQU1MRE9DX09QVCIsIGMub2NhbWxkb2Nfb3B0IDsKICAgICAgIk9DQU1MTEVYIiwgYy5vY2Ft bGxleCA7CiAgICAgICJPQ0FNTFlBQ0MiLCBjLm9jYW1seWFjYyA7CiAgICAgICJPQ0FNTE1LTElC IiwgYy5vY2FtbG1rbGliIDsKICAgICAgIk9DQU1MTUtUT1AiLCBjLm9jYW1sbWt0b3AgOwogICAg ICAiT0NBTUxQUk9GIiwgYy5vY2FtbHByb2YgOwogICAgICAiQ0FNTFA0IiwgYy5jYW1scDQgOwog ICAgICAiT0NBTUxGSU5EIiwgYy5vY2FtbGZpbmQgOwogICAgICAiT0NBTUxCSU4iLCBGaWxlbmFt ZS5kaXJuYW1lIGMub2NhbWxjOwogICAgICAiT0NBTUxMSUIiLCBvY2FtbF9saWJkaXIgYyA7CiAg ICAgICJPQ0FNTFZFUlNJT04iLCBzdHJpbmdfb2ZfdmVyc2lvbiBjLnZlcnNpb24gOwogICAgXQog IGluCiAgTGlzdC5pdGVyIChmdW4gKHZhcix2KSAtPiBhZGRfc3Vic3QgdmFyIHYpIGwKCgooKi9j PT1tPVtPQ2FtbF9jb25mXT0wLjM9dD09KikKCgpsZXQgb2NhbWxfcmVxdWlyZWQgPSBbMzsxMV0K bGV0IGNvbmYgPSBvY2FtbF9jb25mICgpOzsKcHJpbnRfY29uZiBjb25mOzsKCmxldCBtb2RlcyA9 IGlmIGNvbmYub2NhbWxvcHQgPD4gIiIgdGhlbiBbYEJ5dGU7YE9wdF0gZWxzZSBbYEJ5dGVdOzsK CmxldCBfID0KICBpZiBjb25mLnZlcnNpb24gPDwgb2NhbWxfcmVxdWlyZWQgdGhlbgogICAgbGV0 IG1zZyA9IFByaW50Zi5zcHJpbnRmICJFcnJvcjogT0NhbWwgJXMgcmVxdWlyZWQsIGJ1dCBmb3Vu ZCAlcy4iCiAgICAgICAgKHN0cmluZ19vZl92ZXJzaW9uIG9jYW1sX3JlcXVpcmVkKSAoc3RyaW5n X29mX3ZlcnNpb24gY29uZi52ZXJzaW9uKQogICAgaW4KICAgIHByZXJyX2VuZGxpbmUgbXNnOyBl eGl0IDEKCmxldCBfID0gIXByaW50ICJcbiMjIyBjaGVja2luZyByZXF1aXJlZCB0b29scyBhbmQg bGlicmFyaWVzICMjI1xuIgoKbGV0IG9jYW1sYnVpbGQgPQogIHRyeSBvY2FtbF9wcm9nIH5lcnI6 IHRydWUgKCJvY2FtbGJ1aWxkIl5leGVfZXh0ZW5zaW9uKQogIHdpdGggUHJvZ3JhbV9ub3RfZm91 bmQgXyAtPgogICAgIWZhdGFsX2Vycm9yICJvY2FtbGJ1aWxkIG5vdCBmb3VuZC4iOwogICAgYXNz ZXJ0IGZhbHNlCjs7CgpsZXQgXyA9IGFkZF9jb25mX3ZhcmlhYmxlcyBjb25mOzsKYWRkX3N1YnN0 ICJPQ0FNTEJVSUxEIiBvY2FtbGJ1aWxkIDs7CgpsZXQgXyA9CiAgaWYgQXJyYXkubGVuZ3RoIFN5 cy5hcmd2IDwgMiB0aGVuCiAgICAhZmF0YWxfZXJyb3IgIk5vIG91dHB1dCBmaWxlIGdpdmVuIGZv ciBzdWJzdGl0dXRpb25zISIKICBlbHNlCiAgICAgIG91dHB1dF9zdWJzdHNfdG9fZmlsZSBTeXMu YXJndi4oMSk7Owo= ------_=_NextPart_001_01C8CB05.CE164985--