X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f X-Recipient: geda-user AT delorie DOT com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; bh=9chBp0xGWRfJ9dAt9h6pbGqW3Ye9nO4gSggkKJ4FpV4=; b=t6Vnsly5bIMZguFAYToOOt795V6F0QZ1iRboUiP7gYf6aw0Gti9rdHL1dWaFmiwOfI 1+Z5WGboxyEUGaEF45ZMMr5tL4UsdLBpsWYcG7h85MtA99Z9K+doOJa+1DOsiv8IaYQ3 q2QarfPR4NeVeNricd1xMuGCG6Wlm9i1p7dEvKfNIuWezmHVjYEdy/y+m5uPRaWNGlew LaaP0483Dzaav/OSpk8+GqxJOCDA+a1i6tSUnqZdGVPD6PQLL0b7qvfoqZQhFOV2HxTJ bXfl39whBfIILRqJc4fNpbHCrwby9ce57fzvdOOYxBH0mRvnQo0BO/MhWGo+HnEnY7cK IVXg== MIME-Version: 1.0 Sender: silicon DOT on DOT inspiration AT gmail DOT com In-Reply-To: <20120731204618.4ab9835b@wind.levalinux.org> References: <20120731204618 DOT 4ab9835b AT wind DOT levalinux DOT org> Date: Wed, 1 Aug 2012 07:31:55 +1000 X-Google-Sender-Auth: WX0q8B2v-WHdOAMcxFIagB2R7JU Message-ID: Subject: Re: [geda-user] I've updated footgen to work with nanometer base units From: Stephen Ecob To: geda-user AT delorie DOT com Content-Type: multipart/mixed; boundary=f46d0437454755aaab04c626e820 Reply-To: geda-user AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: geda-user AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk --f46d0437454755aaab04c626e820 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Aug 1, 2012 at 4:46 AM, Kovacs Levente wrote: > On Tue, 31 Jul 2012 12:42:53 +1000 > Stephen Ecob wrote: > >> For those of you who use Darrell Harmon's very useful "footgen" >> script, here's an updated version. >> The changes are: >> >> # Changed fundamental units from centimils to nanometers >> >> # Changed flags from integers to strings (as per newer format) > > Hurray! Thanks for doing that! I use it to generate my footprints. Does the > file format changed? If I put there something without units... will it be > interpreted as nm or centimils? You're welcome! You guessed it, distances specified with no unit will now be interpreted as nm instead of cmil. That doesn't seem to be a problem for the distributed footprintdata file as all distances have units specified (as far as I can see). I can't easily change the code to interpret numbers without units as nanometers as that causes others unit-less numbers such as "number of pins" to be multiplied by 254000 :( Attached is a further update that corrects some additional hard coded distances that I failed to spot earlier. Stephen Ecob Silicon On Inspiration Sydney Australia www.sioi.com.au Spartan 6 LX25 with 2GB DDR3 DIMM for $299: http://www.sioi.com.au/shop/product_info.php/cPath/24/products_id/55 --f46d0437454755aaab04c626e820 Content-Type: application/octet-stream; name="footgen.py" Content-Disposition: attachment; filename="footgen.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h5bi3uay1 IyEvdXNyL2Jpbi9weXRob24KIyBwYWNrYWdlLnB5CiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcg RGFycmVsbCBIYXJtb24KIyBHZW5lcmF0ZXMgZm9vdHByaW50cyBmb3IgUENCIGZyb20gdGV4dCBk ZXNjcmlwdGlvbgojIFRoZSBHUEwgYXBwbGllcyBvbmx5IHRvIHRoZSBweXRob24gc2NyaXB0cy4K IyB0aGUgb3V0cHV0IG9mIHRoZSBwcm9ncmFtIGFuZCB0aGUgZm9vdHByaW50IGRlZmluaXRpb24g ZmlsZXMKIyBhcmUgcHVibGljIGRvbWFpbgojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQoj IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZl LCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgojIEFkZGVkIGRpaCBwYXRjaCBmcm9tIERhdmlk IENhcnIgLSA4LzI4LzIwMDUgRGFycmVsbCBIYXJtb24KCiMgMS82LzIwMDcKIyBCdWdmaXggZnJv bSBEYXZpZCBDYXJyIHRvIGNvcnJlY3Qgcm93IGFuZCBjb2wgcmV2ZXJzYWwgaW4gQkdBIG9taXRi YWxscwojIFNldmVyYWwgaW1wcm92ZW1lbnRzIHNlbnQgdG8gbWUgYnkgUGV0ZXIgQmF4ZW5kYWxl LCB3aXRoIHNvbWUgbW9kaWZpY2F0aW9uCiMgYnkgRExIOiBTcXVhcmUgcGluIDEgb24gYWxsIHRo cm91Z2ggaG9sZSwgb3B0aW9uYWwgaW5zaWRlIHNpbGtzY3JlZW4gb24KIyBTTyBwYXJ0cyB3aXRo IGRpYWdvbmFsIGNvcm5lciBmb3IgcGluIDEsIHRvIGVuYWJsZSB1c2Ugc2lsa3N0eWxlID0gImlu c2lkZSIsCiMgZGlzYWJsZWQgYnkgZGVmYXVsdCBvciB1c2Ugc2lsa3N0eWxlID0gIm5vbmUiCgoj IDkvMjgvMjAwOAojIEFkZGVkIHBhdGNoIGJ5IERhdmlkIENhcnIgdG8gYWRkIHNpbGtzdHlsZT0i Y29ybmVycyIgb3B0aW9uIG9uIHFmcAojIHNldCBzaWxrYm94d2lkdGggYW5kIHNpbGtib3hoZWln aCBpZiB1c2luZyB0aGlzIHN0eWxlCgojIDkvMjgvMjAwOAojIEFkZGVkIHJlZmRlc3ggYW5kIHJl ZmRlc3kgYXR0cmlidXRlcyB3aGljaCBhbGxvdyB0aGUgcmVmZXJlbmNlIGRlc2lnbmF0b3IgdG8g YmUgcG9zaXRpb25lZCBhcyBkZXNpcmVkCiMgUHJldmlvdXNseSB0aGUgcmVmZXJlbmNlIGRlc2ln bmF0b3Igd2FzIGxvY2F0ZWQgYXQgdGhlIG9yaWdpbi4gVGhpcyBpcyBzdGlsbCB0aGUgZGVmYXVs dC4KCiMgOS8yOS8yMDA4CiMgQWxsb3cgbmVnYXRpdmUgbnVtYmVycyBpbiBmb290cHJpbnQgZGVm aW5pdGlvbiBmaWxlCgojIDEwLzIyLzIwMDgKIyBhZGRlZCAic2tldyIgb3B0aW9uIHRvIFNPCiMg dGFrZSBvdXQgZGVidWcgcHJpbnQgZm9yIGV4cGFuZGVkbGlzdAoKIyAyLzkvMjAwOSBETEgKIyBh bGxvdyBleHBvc2VkIHBhZHMgb24gU08gcGFydHMKIyBhZGRlZCAicmVjdCIgb3B0aW9uCiMgaWYg InJlY3QiIGlzIHNldCwgaXQgd2lsbCBjcmVhdGUgYSByZWN0YW5ndWxhciBleHBvc2VkIHBhZC4g SXQgbXVzdCBiZSA+PSB0byB0aGUgZXAgdmFsdWUuCiMgSXQgc2V0cyB0aGUgaGVpZ2h0LCBhbmQg aXMgb25seSBhdmFpbGFibGUgaW4gc28gYXQgdGhpcyB0aW1lLgoKIyAyLzI0LzIwMDkgRExICiMg QWRkZWQgc3VwcG9ydCBmb3Igc2lsa2JveHdpZHRoIGFuZCBzaWxrYm94aGVpZ2h0IHRvIHNpcCwg ZGlwCgojIDQvMjkvMjAwOQojIEFwcGxpZWQgYnVnZml4IHBhdGNoIGZvciBkaWggZnJvbSBMZXZl bnRlIEtvdmFjcwojIEFwcGxpZWQgcGF0Y2ggYWRkaW5nIGRpaGYgKGRvdWJsZSByb3cgcmVjZXB0 YWNsZSkgZnJvbSBMZXZlbnRlIEtvdmFjcwoKIyAyMDEyMDczMSBTdGVwaGVuIEVjb2IKIyBDaGFu Z2VkIGZ1bmRhbWVudGFsIHVuaXRzIGZyb20gY2VudGltaWxzIHRvIG5hbm9tZXRlcnMKIyBDaGFu Z2VkIGZsYWdzIGZyb20gaW50ZWdlcnMgdG8gc3RyaW5ncyAoYXMgcGVyIG5ld2VyIGZvcm1hdCkK IyBDaGFuZ2VkIGEgZmV3IGhhcmQgY29kZWQgZGlzdGFuY2VzIGZyb20gdmFsdWVzIHN1Y2ggYXMg CiMgMTAwMCwgNDAwMCBvciAzOTQwIChjZW50aW1pbHMpIHRvIDEwMDAwMDBubS4gIFRoZXNlIGhh cmQKIyBjb2RlZCBkaXN0YW5jZXMgYXJlIHN0aWxsIHVnbHksIGJ1dCBub3cgYXQgbGVhc3QgdGhl eSBhcmUKIyBtZXRyaWMgdWdseSBpbnN0ZWFkIG9mIGltcGVyaWFsIHVnbHkKCiMgbGlzdCBvZiBh dHRyaWJ1dGVzIHRvIGJlIGRlZmluZWQgaW4gZmlsZQpkZWYgZGVmYXR0cigpOgogICAgcmV0dXJu IFtbImVsZW1lbnRkaXIiLCIiXSwKICAgICAgICAgICAgWyJwYXJ0IiwiIl0sXAogICAgICAgICAg ICBbInR5cGUiLCIiXSxcCiAgICAgICAgICAgIFsicGluc2hpZ2giLCAwXSxcCiAgICAgICAgICAg IFsicGlucyIsMF0sXAogICAgICAgICAgICBbInJvd3MiLDBdLFwKICAgICAgICAgICAgWyJjb2xz IiwwXSxcCiAgICAgICAgICAgIFsicGl0Y2giLDBdLFwKICAgICAgICAgICAgWyJzaWxrb2Zmc2V0 IiwwXSxcCiAgICAgICAgICAgIFsic2lsa3dpZHRoIiwwXSxcCiAgICAgICAgICAgIFsic2lsa2Jv eHdpZHRoIiwwXSxcCiAgICAgICAgICAgIFsic2lsa2JveGhlaWdodCIsMF0sXAogICAgICAgICAg ICBbInNpbGtzdHlsZSIsIiJdLFwKICAgICAgICAgICAgWyJvbWl0YmFsbHMiLCIiXSxcCiAgICAg ICAgICAgIFsicGFkZGlhIiwwXSxcCiAgICAgICAgICAgIFsiZGlhIiwwXSxcCiAgICAgICAgICAg IFsibWFza2NsZWFyIiwwXSxcCiAgICAgICAgICAgIFsicG9seWNsZWFyIiwwXSxcCiAgICAgICAg ICAgIFsiZXAiLDBdLFwKICAgICAgICAgICAgWyJyZWN0IiwwXSxcCiAgICAgICAgICAgIFsicGFk d2lkdGgiLDBdLFwKICAgICAgICAgICAgWyJwYWRoZWlnaHQiLDBdLFwKICAgICAgICAgICAgWyJ0 YWJ3aWR0aCIsMF0sXAogICAgICAgICAgICBbInRhYmhlaWdodCIsMF0sXAogICAgICAgICAgICBb IndpZHRoIiwwXSxcCiAgICAgICAgICAgIFsiaGVpZ2h0IiwwXSxcCiAgICAgICAgICAgIFsicmVm ZGVzeCIsMF0sXAogICAgICAgICAgICBbInJlZmRlc3kiLDBdLFwKICAgICAgICAgICAgWyJza2V3 IiwwXSxcCiAgICAgICAgICAgIFsicmVjdCIsMF0sXAogICAgICAgICAgICBbImRyaWxsIiwwXV0K CiMgQkdBIHJvdyBuYW1lcyAyMCB0b3RhbApyb3duYW1lID0gWydBJywgJ0InLCAnQycsICdEJywg J0UnLCAnRicsICdHJywgJ0gnLCAnSicsXAogICAgICAgICAgICdLJywgJ0wnLCAnTScsICdOJywg J1AnLCAnUicsICdUJywgJ1UnLCAnVicsICdXJywgJ1knXQoKIyBnZW5lcmF0ZSBiYWxsIG5hbWUg ZnJvbSByb3cgYW5kIGNvbHVtbiAoZm9yIEJHQSkKZGVmIGJhbGxuYW1lKGNvbCwgcm93KToKICAg IGJhbGwgPSAiIgogICAgIyBjYW4gaGFuZGxlIHVwIHRvIGJhbGwgWVkKICAgIHdoaWxlIHJvdz4y MDoKICAgICAgICBiYWxsPXJvd25hbWVbKHJvdy8yMCkgLSAxXQogICAgICAgIHJvdyA9IHJvdyUy MAogICAgcmV0dXJuIGJhbGwrcm93bmFtZVtyb3ctMV0rc3RyKGNvbCkKCiMgZmluZCBYIGFuZCBZ IHBvc2l0aW9uIG9mIGJhbGwgZnJvbSBuYW1lCmRlZiBiYWxscG9zKGJhbGxfbmFtZSk6CiAgICBj b2wgPSAiIgogICAgcm93ID0gMAogICAgZm9yIGNoYXIgaW4gYmFsbF9uYW1lOgogICAgICAgIGlm IGNoYXIuaXNkaWdpdCgpOgogICAgICAgICAgICBjb2wgPSBjb2wrY2hhcgogICAgICAgIGlmIGNo YXIuaXNhbHBoYSgpOgogICAgICAgICAgICByb3cgPSByb3cgKiAyMAogICAgICAgICAgICBjb3Vu dCA9IDEKICAgICAgICAgICAgZm9yIHZhbCBpbiByb3duYW1lOgogICAgICAgICAgICAgICAgaWYg dmFsPT1jaGFyOgogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJvdyArIGNvdW50CiAgICAgICAg ICAgICAgICBjb3VudCA9IGNvdW50ICsxCiAgICBjb2wgPSBpbnQoY29sKQogICAgcmV0dXJuIFtj b2wscm93XQogICAgCiMgZXhwYW5kIEIxOkM1IHRvIGxpc3Qgb2YgYmFsbHMKZGVmIGV4cGFuZGV4 cHIoaW5wdXRidWYpOgogICAgIyBzaW5nbGUgYmFsbCBoYXMgbm8gOgogICAgaWYgaW5wdXRidWYu ZmluZCgiOiIpPT0tMToKICAgICAgICByZXR1cm4gIiBcIiIgKyBpbnB1dGJ1ZiArICJcIiIKICAg ICMgbXVsdGlwbGUgYmFsbHMKICAgIGV4cGFuZGVkID0gIiIKICAgIHBvczEgPSBiYWxscG9zKGlu cHV0YnVmWzppbnB1dGJ1Zi5maW5kKCI6IildKQogICAgcG9zMiA9IGJhbGxwb3MoaW5wdXRidWZb aW5wdXRidWYuZmluZCgiOiIpKzE6XSkKICAgICMgTWFrZSBzdXJlIG9yZGVyIGlzIGluY3JlYXNp bmcgCiAgICBpZiBwb3MxWzBdPnBvczJbMF06CiAgICAgICAgdG1wID0gcG9zMVswXQogICAgICAg IHBvczFbMF0gPSBwb3MyWzBdCiAgICAgICAgcG9zMlswXSA9IHRtcAogICAgaWYgcG9zMVsxXT5w b3MyWzFdOgogICAgICAgIHRtcCA9IHBvczFbMV0KICAgICAgICBwb3MxWzFdID0gcG9zMlsxXQog ICAgICAgIHBvczJbMV0gPSB0bXAKICAgIGZvciBjb2wgaW4gcmFuZ2UocG9zMVswXSwgcG9zMlsw XSsxKToKICAgICAgICBmb3Igcm93IGluIHJhbmdlKHBvczFbMV0sIHBvczJbMV0rMSk6CiAgICAg ICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWQgKyAiICIgKyJcIiIrIGJhbGxuYW1lKGNvbCwgcm93 KSsiXCIiCiAgICByZXR1cm4gZXhwYW5kZWQKCiMgZXhwYW5kIGxpc3Qgb2YgYmFsbHMgdG8gb21p dApkZWYgZXhwYW5kb21pdGxpc3Qob21pdGxpc3QpOgogICAgZXhwYW5kZWRsaXN0ID0gIiIKICAg IHRtcGJ1ZiA9ICIiCiAgICBpZiBub3Qgb21pdGxpc3Q6CiAgICAgICAgcmV0dXJuICIiCiAgICBm b3IgY2hhcmFjdGVyIGluIG9taXRsaXN0OgogICAgICAgIGlmIGNoYXJhY3Rlci5pc2FscGhhKCkg b3IgY2hhcmFjdGVyLmlzZGlnaXQoKSBvciBjaGFyYWN0ZXI9PSI6IjoKICAgICAgICAgICAgdG1w YnVmID0gdG1wYnVmICsgY2hhcmFjdGVyCiAgICAgICAgZWxpZiBjaGFyYWN0ZXIgPT0gJywnOgog ICAgICAgICAgICBleHBhbmRlZGxpc3QgPSBleHBhbmRlZGxpc3QgKyBleHBhbmRleHByKHRtcGJ1 ZikKICAgICAgICAgICAgdG1wYnVmID0gJycKICAgICNsYXN0IHZhbHVlIHdpbGwgYmUgaW4gdG1w YnVmCiAgICBleHBhbmRlZGxpc3QgPSBleHBhbmRlZGxpc3QgKyBleHBhbmRleHByKHRtcGJ1ZikK ICAgICMgZGVidWc6IHByaW50IGV4cGFuZGVkbGlzdAogICAgcmV0dXJuIGV4cGFuZGVkbGlzdAog ICAgCmRlZiBmaW5kYXR0cihhdHRybGlzdCwgbmFtZSk6CiAgICBmb3IgYXR0cmlidXRlIGluIGF0 dHJsaXN0OgogICAgICAgIGlmIGF0dHJpYnV0ZVswXT09bmFtZToKICAgICAgICAgICAgcmV0dXJu IGF0dHJpYnV0ZVsxXQogICAgcHJpbnQgIkF0dHJpYnV0ZSAlcyBub3QgZm91bmQiICUgbmFtZQog ICAgcHJpbnQgYXR0cmxpc3QKICAgIHJldHVybiAwCgpkZWYgY2hhbmdlYXR0cihhdHRybGlzdCwg bmFtZSwgbmV3dmFsKToKICAgIGZvciBhdHRyaWJ1dGUgaW4gYXR0cmxpc3Q6CiAgICAgICAgaWYg YXR0cmlidXRlWzBdPT1uYW1lOgogICAgICAgICAgICBhdHRyaWJ1dGVbMV0gPSBuZXd2YWwKICAg ICAgICAgICAgcmV0dXJuCiAgICBwcmludCAiQXR0cmlidXRlICVzIG5vdCBmb3VuZCIgJSBuYW1l CiAgICBwcmludCBhdHRybGlzdAogICAgcmV0dXJuIDAKCiMgRm9ybWF0IG9mIHBhZCBsaW5lOgoj IFBhZFstMTc1MDAgLTEzNTAwIC0xNzUwMCAtNzAwMCAyMDAwIDEwMDAgMzAwMCAiMSIgIjEiIDB4 MDAwMDAxODBdCiMgWDEgWTEgWDIgWTIgV2lkdGggcG9seWNsZWFyIG1hc2sgLi4uLgpkZWYgcGFk KHgxLCB5MSwgeDIsIHkyLCB3aWR0aCwgY2xlYXIsIG1hc2ssIHBpbm5hbWUsIHNoYXBlKToKICAg IGlmIHNoYXBlPT0icm91bmQiOgogICAgICAgIGZsYWdzID0gIiIKICAgIGVsc2U6CiAgICAgICAg ZmxhZ3MgPSAic3F1YXJlIgogICAgcmV0dXJuICJcdFBhZFslZG5tICVkbm0gJWRubSAlZG5tICVk bm0gJWRubSAlZG5tIFwiJXNcIiBcIiVzXCIgXCIlc1wiXVxuIlwKICAgICAgICAgICAlICh4MSwg eTEsIHgyLCB5Miwgd2lkdGgsIGNsZWFyKjIsIG1hc2srd2lkdGgsIHBpbm5hbWUsIHBpbm5hbWUs IGZsYWdzKQoKZGVmIHBhZGN0cih4LHksaGVpZ2h0LHdpZHRoLGNsZWFyLG1hc2sscGlubmFtZSk6 CiAgICBsaW5ld2lkdGggPSBtaW4oaGVpZ2h0LHdpZHRoKQogICAgbGluZWxlbmd0aCA9IGFicyho ZWlnaHQtd2lkdGgpCiAgICBpZiBoZWlnaHQ+d2lkdGg6CiAgICAgICAgI3ZlcnRjYWwgcGFkCiAg ICAgICAgeDEgPSB4CiAgICAgICAgeDIgPSB4CiAgICAgICAgeTEgPSB5IC0gbGluZWxlbmd0aC8y CiAgICAgICAgeTIgPSB5ICsgbGluZWxlbmd0aC8yCiAgICBlbHNlOgogICAgICAgICNob3Jpem9u dGFsIHBhZAogICAgICAgIHgxID0geCAtIGxpbmVsZW5ndGgvMgogICAgICAgIHgyID0geCArIGxp bmVsZW5ndGgvMgogICAgICAgIHkxID0geQogICAgICAgIHkyID0geQogICAgcmV0dXJuIHBhZCh4 MSx5MSx4Mix5MixsaW5ld2lkdGgsY2xlYXIsbWFzayxwaW5uYW1lLCJzcXVhcmUiKSAgICAgICAg CgojIGJhbGwgaXMgYSB6ZXJvIGxlbmd0aCByb3VuZCBwYWQKZGVmIGJhbGwoeCwgeSwgZGlhLCBj bGVhciwgbWFzaywgbmFtZSk6CiAgICByZXR1cm4gcGFkKHgsIHksIHgsIHksIGRpYSwgY2xlYXIs IG1hc2ssIG5hbWUsICJyb3VuZCIpCgojIGRyYXcgc2lsa3NjcmVlbiBsaW5lCmRlZiBzaWxrKHgx LCB5MSwgeDIsIHkyLCB3aWR0aCk6CiAgICByZXR1cm4gIlx0RWxlbWVudExpbmUgWyVkbm0gJWRu bSAlZG5tICVkbm0gJWRubV1cbiIgJSAoeDEsIHkxLCB4MiwgeTIsIHdpZHRoKQojIGRyYXcgc2ls a3NjcmVlbiBib3gKZGVmIGJveCh4MSwgeTEsIHgyLCB5Miwgd2lkdGgpOgogICAgcmV0dXJuIHNp bGsoeDEseTEseDIseTEsd2lkdGgpK1wKICAgICAgICAgICBzaWxrKHgyLHkxLHgyLHkyLHdpZHRo KStcCiAgICAgICAgICAgc2lsayh4Mix5Mix4MSx5Mix3aWR0aCkrXAogICAgICAgICAgIHNpbGso eDEseTIseDEseTEsd2lkdGgpCgojIGRyYXcgaW5zaWRlIGJveCAoUFJCKQojIGRyYXdzIHNpbGtz Y3JlZW4gYm94IGZvciBTTyBvciBRRlAgdHlwZSBwYXJ0cyB3aXRoIG5vdGNoZWQgcGluICMxIGNv cm5lcgpkZWYgaW5zaWRlYm94KHgxLCB5MSwgeDIsIHkyLCB3aWR0aCk6CiAgICByZXR1cm4gc2ls ayh4MSx5MSx4Mix5MSx3aWR0aCkrXAogICAgICAgICAgIHNpbGsoeDIseTEseDIseTIrNTAwMDAw LHdpZHRoKStcCiAgICAgICAgICAgc2lsayh4Mix5Mis1MDAwMDAseDIrNTAwMDAwLHkyLHdpZHRo KStcCiAgICAgICAgICAgc2lsayh4Mis1MDAwMDAseTIseDEseTIsd2lkdGgpK1wKICAgICAgICAg ICBzaWxrKHgxLHkyLHgxLHkxLHdpZHRoKQoKZGVmIGJnYShhdHRybGlzdCk6CiAgICAjIGRlZmlu aXRpb25zIG5lZWRlZCB0byBnZW5lcmF0ZSBiZ2EKICAgIGNvbHMgPSBmaW5kYXR0cihhdHRybGlz dCwgImNvbHMiKQogICAgcm93cyA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicm93cyIpCiAgICBwaXRj aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGl0Y2giKQogICAgYmFsbGRpYSA9IGZpbmRhdHRyKGF0 dHJsaXN0LCAiZGlhIikKICAgIHBvbHljbGVhciA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicG9seWNs ZWFyIikKICAgIG1hc2tjbGVhciA9IGZpbmRhdHRyKGF0dHJsaXN0LCAibWFza2NsZWFyIikKICAg IHNpbGt3aWR0aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa3dpZHRoIikKICAgIHNpbGtvZmZz ZXQgPSBmaW5kYXR0cihhdHRybGlzdCwgInNpbGtvZmZzZXQiKQogICAgc2lsa2JveHdpZHRoID0g ZmluZGF0dHIoYXR0cmxpc3QsICJzaWxrYm94d2lkdGgiKQogICAgc2lsa2JveGhlaWdodCA9IGZp bmRhdHRyKGF0dHJsaXN0LCAic2lsa2JveGhlaWdodCIpCiAgICByZWZkZXN4ID0gZmluZGF0dHIo YXR0cmxpc3QsICJyZWZkZXN4IikKICAgIHJlZmRlc3kgPSBmaW5kYXR0cihhdHRybGlzdCwgInJl ZmRlc3kiKQogICAgb21pdGxpc3QgPSBleHBhbmRvbWl0bGlzdChmaW5kYXR0cihhdHRybGlzdCwg Im9taXRiYWxscyIpKQogICAgd2lkdGggPSAoY29scy0xKSpwaXRjaCtiYWxsZGlhCiAgICBoZWln aHQgPSAocm93cy0xKSpwaXRjaCtiYWxsZGlhCiAgICAjIGVuc3VyZSBzaWxrc2NyZWVuIGRvZXNu J3Qgb3ZlcmxhcCBiYWxscwogICAgaWYgc2lsa2JveHdpZHRoPHdpZHRoIG9yIHNpbGtib3hoZWln aHQ8aGVpZ2h0OgogICAgICAgIHNpbGtib3h4ID0gd2lkdGgvMiArIHNpbGtvZmZzZXQKICAgICAg ICBzaWxrYm94eSA9IGhlaWdodC8yICsgc2lsa29mZnNldAogICAgZWxzZToKICAgICAgICBzaWxr Ym94eCA9IHNpbGtib3h3aWR0aC8yCiAgICAgICAgc2lsa2JveHkgPSBzaWxrYm94aGVpZ2h0LzIK ICAgIGJnYWVsdCA9ICJFbGVtZW50W1wiXCIgXCJEZXNjXCIgXCJOYW1lXCIgXCJWYWxcIiAxMDAw IDEwMDAgJWRubSAlZG5tIDAgMTAwIFwiXCJdXG4oXG4iICUgKHJlZmRlc3gsIC0xMDAwMDAwIC0g cmVmZGVzeSkKICAgICMgc2lsa3NjcmVlbiBvdXRsaW5lCiAgICBiZ2FlbHQgPSBiZ2FlbHQgKyBi b3goc2lsa2JveHgsc2lsa2JveHksLXNpbGtib3h4LC1zaWxrYm94eSxzaWxrd2lkdGgpCiAgICAj IHBpbiAxIGluZGljYXRvciAxbW0gbG9uZyB0aWNrCiAgICBiZ2FlbHQgPSBiZ2FlbHQgKyBzaWxr KC1zaWxrYm94eCwgLXNpbGtib3h5LCAtKHNpbGtib3h4KzEwMDAwMDApLCAtKHNpbGtib3h5KzEw MDAwMDApLCBzaWxrd2lkdGgpCiAgICAjIHBvc2l0aW9uIG9mIGJhbGwgQTEKICAgIHhvZmYgPSAt aW50KChjb2xzKzEpKnBpdGNoLzIpCiAgICB5b2ZmID0gLWludCgocm93cysxKSpwaXRjaC8yKQog ICAgZm9yIHJvdyBpbiByYW5nZSgxLCByb3dzKzEpOgogICAgICAgIGZvciBjb2wgaW4gcmFuZ2Uo MSwgMStjb2xzKToKICAgICAgICAgICAgIyBmb3VuZCBidWcgaGVyZSByb3csY29sIHJldmVyc2Vk CiAgICAgICAgICAgIGlmIG9taXRsaXN0LmZpbmQoIlwiIitiYWxsbmFtZShjb2wscm93KSsiXCIi KT09LTE6CiAgICAgICAgICAgICAgICB4ID0geG9mZiArIChwaXRjaCpjb2wpCiAgICAgICAgICAg ICAgICB5ID0geW9mZiArIChwaXRjaCpyb3cpCiAgICAgICAgICAgICAgICBiZ2FlbHQgPSBiZ2Fl bHQgKyBiYWxsKHgsIHksIGJhbGxkaWEsIHBvbHljbGVhciwgbWFza2NsZWFyLCBiYWxsbmFtZShj b2wscm93KSkKICAgIHJldHVybiBiZ2FlbHQrIilcbiIKCiMgZHJhdyBhIHJvdyBvZiBzcXVhcmUg cGFkcwojIHBvcyBpcyBjZW50ZXIgcG9zaXRpb24KIyB3aGljaHdheSBjYW4gYmUgdXAgZG93biBs ZWZ0IHJpZ2h0CmRlZiByb3dvZnBhZHMocG9zLCBwaXRjaCwgd2hpY2h3YXksIHBhZGxlbiwgcGFk aGVpZ2h0LCBzdGFydG51bSwgbnVtcGFkcywgbWFza2NsZWFyLCBwb2x5Y2xlYXIpOgogICAgcGFk cyA9ICIiCiAgICByb3dsZW4gPSBwaXRjaCAqIChudW1wYWRzIC0gMSkKICAgIGlmIHdoaWNod2F5 ID09ICJkb3duIjoKICAgICAgICB4ID0gcG9zWzBdCiAgICAgICAgeSA9IHBvc1sxXSAtIHJvd2xl bi8yCiAgICAgICAgZm9yIHBhZG51bSBpbiByYW5nZSAoc3RhcnRudW0sIHN0YXJ0bnVtK251bXBh ZHMpOgogICAgICAgICAgICBwYWRzID0gcGFkcyArIHBhZGN0cih4LHkscGFkaGVpZ2h0LHBhZGxl bixwb2x5Y2xlYXIsbWFza2NsZWFyLHN0cihwYWRudW0pKQogICAgICAgICAgICB5ID0geSArIHBp dGNoCiAgICBlbGlmIHdoaWNod2F5ID09ICJ1cCI6CiAgICAgICAgeCA9IHBvc1swXQogICAgICAg IHkgPSBwb3NbMV0gKyByb3dsZW4vMgogICAgICAgIGZvciBwYWRudW0gaW4gcmFuZ2UgKHN0YXJ0 bnVtLCBzdGFydG51bStudW1wYWRzKToKICAgICAgICAgICAgcGFkcyA9IHBhZHMgKyBwYWRjdHIo eCx5LHBhZGhlaWdodCxwYWRsZW4scG9seWNsZWFyLG1hc2tjbGVhcixzdHIocGFkbnVtKSkKICAg ICAgICAgICAgeSA9IHkgLSBwaXRjaAogICAgZWxpZiB3aGljaHdheSA9PSAicmlnaHQiOgogICAg ICAgIHggPSBwb3NbMF0gLSByb3dsZW4vMgogICAgICAgIHkgPSBwb3NbMV0KICAgICAgICBmb3Ig cGFkbnVtIGluIHJhbmdlIChzdGFydG51bSwgc3RhcnRudW0rbnVtcGFkcyk6CiAgICAgICAgICAg IHBhZHMgPSBwYWRzICsgcGFkY3RyKHgseSxwYWRoZWlnaHQscGFkbGVuLHBvbHljbGVhcixtYXNr Y2xlYXIsc3RyKHBhZG51bSkpCiAgICAgICAgICAgIHggPSB4ICsgcGl0Y2gKICAgIGVsaWYgd2hp Y2h3YXkgPT0gImxlZnQiOgogICAgICAgIHggPSBwb3NbMF0gKyByb3dsZW4vMgogICAgICAgIHkg PSBwb3NbMV0KICAgICAgICBmb3IgcGFkbnVtIGluIHJhbmdlIChzdGFydG51bSwgc3RhcnRudW0r bnVtcGFkcyk6CiAgICAgICAgICAgIHBhZHMgPSBwYWRzICsgcGFkY3RyKHgseSxwYWRoZWlnaHQs cGFkbGVuLHBvbHljbGVhcixtYXNrY2xlYXIsc3RyKHBhZG51bSkpCiAgICAgICAgICAgIHggPSB4 IC0gcGl0Y2gKICAgIHJldHVybiBwYWRzCgpkZWYgcWZwKGF0dHJsaXN0KToKICAgIHBpbnMgPSBm aW5kYXR0cihhdHRybGlzdCwgInBpbnMiKQogICAgcGluc2hpZ2ggPSBmaW5kYXR0cihhdHRybGlz dCwgInBpbnNoaWdoIikKICAgIHBhZHdpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJwYWR3aWR0 aCIpCiAgICBwYWRoZWlnaHQgPSBmaW5kYXR0cihhdHRybGlzdCwgInBhZGhlaWdodCIpCiAgICBw aXRjaCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGl0Y2giKQogICAgd2lkdGggPSBmaW5kYXR0cihh dHRybGlzdCwgIndpZHRoIikKICAgIGhlaWdodCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAiaGVpZ2h0 IikKICAgIHBvbHljbGVhciA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicG9seWNsZWFyIikKICAgIG1h c2tjbGVhciA9IGZpbmRhdHRyKGF0dHJsaXN0LCAibWFza2NsZWFyIikKICAgIHNpbGt3aWR0aCA9 IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa3dpZHRoIikKICAgIHNpbGtvZmZzZXQgPSBmaW5kYXR0 cihhdHRybGlzdCwgInNpbGtvZmZzZXQiKQogICAgc2lsa2JveHdpZHRoID0gZmluZGF0dHIoYXR0 cmxpc3QsICJzaWxrYm94d2lkdGgiKQogICAgc2lsa2JveGhlaWdodCA9IGZpbmRhdHRyKGF0dHJs aXN0LCAic2lsa2JveGhlaWdodCIpCiAgICBzaWxrc3R5bGUgPSBmaW5kYXR0cihhdHRybGlzdCwg InNpbGtzdHlsZSIpCiAgICBlcCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAiZXAiKQogICAgcmVmZGVz eCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicmVmZGVzeCIpCiAgICByZWZkZXN5ID0gZmluZGF0dHIo YXR0cmxpc3QsICJyZWZkZXN5IikKICAgIHFmcGVsdCA9ICJFbGVtZW50W1wiXCIgXCJEZXNjXCIg XCJOYW1lXCIgXCJWYWxcIiAxMDAwIDEwMDAgJWRubSAlZG5tIDAgMTAwIFwiXCJdXG4oXG4iICUg KHJlZmRlc3gsIC0xMDAwMDAwIC0gcmVmZGVzeSkKICAgIGlmIHBpbnNoaWdoPT0wOgogICAgICAg IHBpbnNoaWdoID0gcGlucy80CiAgICAgICAgcGluc3dpZGUgPSBwaW5zLzQKICAgICAgICBoZWln aHQgPSB3aWR0aAogICAgZWxzZToKICAgICAgICBwaW5zd2lkZSA9IChwaW5zLTIqcGluc2hpZ2gp LzIKICAgIGlmIHBpbnNoaWdoOgogICAgICAgICMgZHJhdyBsZWZ0IHNpZGUKICAgICAgICBxZnBl bHQgPSBxZnBlbHQgKyByb3dvZnBhZHMoWy0od2lkdGgrcGFkd2lkdGgpLzIsMF0sIHBpdGNoLCAi ZG93biIsIHBhZHdpZHRoLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFk aGVpZ2h0LCAxLCBwaW5zaGlnaCwgbWFza2NsZWFyLCBwb2x5Y2xlYXIpCiAgICAgICAgIyBkcmF3 IHJpZ2h0IHNpZGUKICAgICAgICBxZnBlbHQgPSBxZnBlbHQgKyByb3dvZnBhZHMoWyh3aWR0aCtw YWR3aWR0aCkvMiwwXSwgcGl0Y2gsICJ1cCIsIHBhZHdpZHRoLFwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcGFkaGVpZ2h0LCBwaW5zaGlnaCtwaW5zd2lkZSsxLCBwaW5zaGln aCxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tjbGVhciwgcG9seWNs ZWFyKQogICAgaWYgcGluc3dpZGU6CiAgICAgICAgIyBkcmF3IGJvdHRvbQogICAgICAgIHFmcGVs dCA9IHFmcGVsdCArIHJvd29mcGFkcyhbMCwoaGVpZ2h0K3BhZHdpZHRoKS8yXSwgcGl0Y2gsICJy aWdodCIsIHBhZGhlaWdodCxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBh ZHdpZHRoLCBwaW5zaGlnaCsxLCBwaW5zd2lkZSwgbWFza2NsZWFyLCBwb2x5Y2xlYXIpCiAgICAg ICAgIyBkcmF3IHRvcAogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIHJvd29mcGFkcyhbMCwtKGhl aWdodCtwYWR3aWR0aCkvMl0sIHBpdGNoLCAibGVmdCIsIHBhZGhlaWdodCxcCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBhZHdpZHRoLCAyKnBpbnNoaWdoK3BpbnN3aWRlKzEs IHBpbnN3aWRlLCBtYXNrY2xlYXIsIHBvbHljbGVhcikKICAgICMgZXhwb3NlZCBwYWQgcGFja2Fn ZXM6CiAgICBpZiBlcDoKICAgICAgICBxZnBlbHQgPXFmcGVsdCArIHBhZCgwLDAsMCwwLGVwLHBv bHljbGVhcixtYXNrY2xlYXIsc3RyKHBpbnMrMSksInNxdWFyZSIpCiAgICBpZiBzaWxrc3R5bGUg PT0gImluc2lkZSI6CiAgICAgICAgeCA9IHdpZHRoLzIgLSBzaWxrb2Zmc2V0CiAgICAgICAgeSA9 IGhlaWdodC8yIC0gc2lsa29mZnNldAogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIGJveCh4LHks LXgsLXksc2lsa3dpZHRoKQogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoLXgsLXksLSh4 KzEwMDAwMDApLC0oeSsxMDAwMDAwKSxzaWxrd2lkdGgpCiAgICBlbGlmIHNpbGtzdHlsZSA9PSAi b3V0c2lkZSI6CiAgICAgICAgeCA9ICh3aWR0aCsyKnBhZHdpZHRoKS8yICsgc2lsa29mZnNldAog ICAgICAgIHkgPSAoaGVpZ2h0KzIqcGFkd2lkdGgpLzIgKyBzaWxrb2Zmc2V0CiAgICAgICAgcWZw ZWx0ID0gcWZwZWx0ICsgYm94KHgseSwteCwteSxzaWxrd2lkdGgpCiAgICAgICAgcWZwZWx0ID0g cWZwZWx0ICsgc2lsaygteCwteSwtKHgrMTAwMDAwMCksLSh5KzEwMDAwMDApLHNpbGt3aWR0aCkK ICAgIGVsaWYgc2lsa3N0eWxlID09ICJjb3JuZXJzIjoKICAgICAgICB4X3N0b3AgPSAwLjUqcGl0 Y2gqKHBpbnN3aWRlLTEpICsgLjUqcGFkaGVpZ2h0ICsgc2lsa3dpZHRoCiAgICAgICAgeV9zdG9w ID0gMC41KnBpdGNoKihwaW5zaGlnaC0xKSArIC41KnBhZGhlaWdodCArIHNpbGt3aWR0aAogICAg ICAgIHggPSBzaWxrYm94d2lkdGgvMiArIHNpbGt3aWR0aC8yCiAgICAgICAgeSA9IHNpbGtib3ho ZWlnaHQvMiArIHNpbGt3aWR0aC8yCiAgICAgICAgI1VMCiAgICAgICAgcWZwZWx0ID0gcWZwZWx0 ICsgc2lsaygteCwteSwteF9zdG9wLC15LHNpbGt3aWR0aCkKICAgICAgICBxZnBlbHQgPSBxZnBl bHQgKyBzaWxrKC14LC15LC14LC15X3N0b3Asc2lsa3dpZHRoKQogICAgICAgICNVUgogICAgICAg IHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoeCwteSx4X3N0b3AsLXksc2lsa3dpZHRoKQogICAgICAg IHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoeCwteSx4LC15X3N0b3Asc2lsa3dpZHRoKQogICAgICAg ICNMTAogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoLXgseSwteF9zdG9wLHksc2lsa3dp ZHRoKQogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoLXgseSwteCx5X3N0b3Asc2lsa3dp ZHRoKQogICAgICAgICNMUgogICAgICAgIHFmcGVsdCA9IHFmcGVsdCArIHNpbGsoeCx5LHhfc3Rv cCx5LHNpbGt3aWR0aCkKICAgICAgICBxZnBlbHQgPSBxZnBlbHQgKyBzaWxrKHgseSx4LHlfc3Rv cCxzaWxrd2lkdGgpCiAgICAgICAgI1BpbiAxCiAgICAgICAgcWZwZWx0ID0gcWZwZWx0ICsgc2ls aygteCwteSwtKHgrMTAwMDAwMCksLSh5KzEwMDAwMDApLHNpbGt3aWR0aCkKCiAgICByZXR1cm4g cWZwZWx0KyIpXG4iCgojIGRlZiByb3dvZnBhZHMocG9zLCBwaXRjaCwgd2hpY2h3YXksIHBhZGxl biwgcGFkaGVpZ2h0LCBzdGFydG51bSwgbnVtcGFkcywgbWFza2NsZWFyLCBwb2x5Y2xlYXIpOgoj IHVzZXMgcGlucywgcGFkd2lkdGgsIHBhZGhlaWdodCwgcGl0Y2gKZGVmIHNvKGF0dHJsaXN0KToK ICAgIHBpbnMgPSBmaW5kYXR0cihhdHRybGlzdCwgInBpbnMiKQogICAgcGl0Y2ggPSBmaW5kYXR0 cihhdHRybGlzdCwgInBpdGNoIikKICAgIHdpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJ3aWR0 aCIpCiAgICBwYWR3aWR0aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGFkd2lkdGgiKQogICAgcGFk aGVpZ2h0ID0gZmluZGF0dHIoYXR0cmxpc3QsICJwYWRoZWlnaHQiKQogICAgcG9seWNsZWFyID0g ZmluZGF0dHIoYXR0cmxpc3QsICJwb2x5Y2xlYXIiKQogICAgbWFza2NsZWFyID0gZmluZGF0dHIo YXR0cmxpc3QsICJtYXNrY2xlYXIiKQogICAgc2lsa3dpZHRoID0gZmluZGF0dHIoYXR0cmxpc3Qs ICJzaWxrd2lkdGgiKQogICAgc2lsa29mZnNldCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa29m ZnNldCIpCiAgICBzaWxrYm94aGVpZ2h0ID0gZmluZGF0dHIoYXR0cmxpc3QsICJzaWxrYm94aGVp Z2h0IikKICAgIHNpbGtzdHlsZSA9IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa3N0eWxlIikKICAg IHJlZmRlc3ggPSBmaW5kYXR0cihhdHRybGlzdCwgInJlZmRlc3giKQogICAgcmVmZGVzeSA9IGZp bmRhdHRyKGF0dHJsaXN0LCAicmVmZGVzeSIpCiAgICBza2V3ID0gZmluZGF0dHIoYXR0cmxpc3Qs ICJza2V3IikKICAgIGVwID0gZmluZGF0dHIoYXR0cmxpc3QsICJlcCIpCiAgICByZWN0ID0gZmlu ZGF0dHIoYXR0cmxpc3QsICJyZWN0IikKICAgIGlmIHBpbnMgJSAyOgogICAgICAgIHByaW50ICJP ZGQgbnVtYmVyIG9mIHBpbnM6IHRoYXQgaXMgYSBwcm9ibGVtIgogICAgICAgIHByaW50ICJTa2lw cGluZyAiICsgZmluZGF0dHIoYXR0cmxpc3QsICJ0eXBlIikKICAgICAgICByZXR1cm4gIiIKICAg IHJvd3BvcyA9ICh3aWR0aCtwYWR3aWR0aCkvMgogICAgc29lbHQgPSAiRWxlbWVudFtcIlwiIFwi RGVzY1wiIFwiTmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxu KFxuIiAlIChyZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICBzb2VsdCA9IHNvZWx0ICsg cm93b2ZwYWRzKFstcm93cG9zLC1za2V3XSwgcGl0Y2gsICJkb3duIiwgcGFkd2lkdGgsIHBhZGhl aWdodCwgMSwgcGlucy8yLCBtYXNrY2xlYXIsIHBvbHljbGVhcikKICAgIHNvZWx0ID0gc29lbHQg KyByb3dvZnBhZHMoW3Jvd3Bvcyxza2V3XSwgcGl0Y2gsICJ1cCIsIHBhZHdpZHRoLCBwYWRoZWln aHQsIDErcGlucy8yLCBwaW5zLzIsIG1hc2tjbGVhciwgcG9seWNsZWFyKQogICAgc2lsa2JveGhl aWdodCA9IG1heChwaXRjaCoocGlucy0yKS8yK3BhZGhlaWdodCsyKnNpbGtvZmZzZXQsc2lsa2Jv eGhlaWdodCkKICAgIAogICAgc2lsa3kgPSBzaWxrYm94aGVpZ2h0LzIKICAgIGxlbiA9IDAKICAg IHByaW50ICJFUCIgKyBzdHIoZXApCiAgICBwcmludCAiRVBIRUlHSFQiICsgc3RyKHJlY3QpCiAg ICBpZiByZWN0OgogICAgICAgIGxlbiA9IChyZWN0IC0gZXApIC8gMgogICAgaWYgZXA6CiAgICAg ICAgc29lbHQgPSBzb2VsdCArIHBhZCgwLGxlbiwwLC1sZW4sZXAscG9seWNsZWFyLG1hc2tjbGVh cixzdHIocGlucysxKSwicmVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAjIEluc2lkZSBib3ggd2l0aCBub3RjaGVkIGNvcm5lciBhcyBzdWJtaXR0ZWQgaW4g cGF0Y2ggYnkgUFJCCiAgICBpZihzaWxrc3R5bGUgPT0gImluc2lkZSIpOgogICAgICAgIHNpbGt4 ID0gd2lkdGgvMiAtIHNpbGtvZmZzZXQKICAgICAgICBzb2VsdCA9IHNvZWx0ICsgaW5zaWRlYm94 KHNpbGt4LHNpbGt5LC1zaWxreCwtc2lsa3ksc2lsa3dpZHRoKQogICAgZWxzZToKICAgICAgICBz aWxreCA9IHdpZHRoLzIgKyBzaWxrb2Zmc2V0ICsgcGFkd2lkdGgKICAgICAgICBzb2VsdCA9IHNv ZWx0ICsgYm94KHNpbGt4LHNpbGt5LC1zaWxreCwtc2lsa3ksc2lsa3dpZHRoKQogICAgICAgIHNv ZWx0ID0gc29lbHQgKyBzaWxrKDAsLXNpbGt5KzUwMDAwMCwtNTAwMDAwLC1zaWxreSxzaWxrd2lk dGgpCiAgICAgICAgc29lbHQgPSBzb2VsdCArIHNpbGsoMCwtc2lsa3krNTAwMDAwLDUwMDAwMCwt c2lsa3ksc2lsa3dpZHRoKQogICAgcmV0dXJuIHNvZWx0KyIpXG4iCgpkZWYgdHdvcGFkKGF0dHJs aXN0KToKICAgIHdpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJ3aWR0aCIpCiAgICBwYWR3aWR0 aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGFkd2lkdGgiKQogICAgcGFkaGVpZ2h0ID0gZmluZGF0 dHIoYXR0cmxpc3QsICJwYWRoZWlnaHQiKQogICAgcG9seWNsZWFyID0gZmluZGF0dHIoYXR0cmxp c3QsICJwb2x5Y2xlYXIiKQogICAgbWFza2NsZWFyID0gZmluZGF0dHIoYXR0cmxpc3QsICJtYXNr Y2xlYXIiKQogICAgc2lsa3dpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJzaWxrd2lkdGgiKQog ICAgc2lsa2JveHdpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJzaWxrYm94d2lkdGgiKQogICAg c2lsa2JveGhlaWdodCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa2JveGhlaWdodCIpCiAgICBz aWxrb2Zmc2V0ID0gZmluZGF0dHIoYXR0cmxpc3QsICJzaWxrb2Zmc2V0IikKICAgIHJlZmRlc3gg PSBmaW5kYXR0cihhdHRybGlzdCwgInJlZmRlc3giKQogICAgcmVmZGVzeSA9IGZpbmRhdHRyKGF0 dHJsaXN0LCAicmVmZGVzeSIpCiAgICB0d29wYWRlbHQgPSAiRWxlbWVudFtcIlwiIFwiRGVzY1wi IFwiTmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxuKFxuIiAl IChyZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICB0d29wYWRlbHQgPSB0d29wYWRlbHQg KyByb3dvZnBhZHMoWzAsMF0sIHdpZHRoK3BhZHdpZHRoLCAicmlnaHQiLCBwYWR3aWR0aCwgcGFk aGVpZ2h0LCAxLCAyLCBtYXNrY2xlYXIsIHBvbHljbGVhcikKICAgIHNpbGt4ID0gbWF4KCh3aWR0 aCsyKnBhZHdpZHRoKS8yICsgc2lsa29mZnNldCxzaWxrYm94d2lkdGgvMikKICAgIHNpbGt5ID0g bWF4KHBhZGhlaWdodC8yICsgc2lsa29mZnNldCwgc2lsa2JveGhlaWdodC8yKQogICAgdHdvcGFk ZWx0ID0gdHdvcGFkZWx0ICsgYm94KHNpbGt4LHNpbGt5LC1zaWxreCwtc2lsa3ksc2lsa3dpZHRo KQogICAgcmV0dXJuIHR3b3BhZGVsdCsiKVxuIgoKIyBTT1QyMjMsIEREUEFLLCBUTy0yNjMsIGV0 YwpkZWYgdGFiYmVkKGF0dHJsaXN0KToKICAgIHBpbnMgPSBmaW5kYXR0cihhdHRybGlzdCwgInBp bnMiKQogICAgdGFid2lkdGggPSBmaW5kYXR0cihhdHRybGlzdCwgInRhYndpZHRoIikKICAgIHRh YmhlaWdodCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAidGFiaGVpZ2h0IikKICAgIGhlaWdodCA9IGZp bmRhdHRyKGF0dHJsaXN0LCAiaGVpZ2h0IikKICAgIHBhZHdpZHRoID0gZmluZGF0dHIoYXR0cmxp c3QsICJwYWR3aWR0aCIpCiAgICBwYWRoZWlnaHQgPSBmaW5kYXR0cihhdHRybGlzdCwgInBhZGhl aWdodCIpCiAgICBwb2x5Y2xlYXIgPSBmaW5kYXR0cihhdHRybGlzdCwgInBvbHljbGVhciIpCiAg ICBtYXNrY2xlYXIgPSBmaW5kYXR0cihhdHRybGlzdCwgIm1hc2tjbGVhciIpCiAgICBzaWxrd2lk dGggPSBmaW5kYXR0cihhdHRybGlzdCwgInNpbGt3aWR0aCIpCiAgICBzaWxrb2Zmc2V0ID0gZmlu ZGF0dHIoYXR0cmxpc3QsICJzaWxrb2Zmc2V0IikKICAgIHBpdGNoID0gZmluZGF0dHIoYXR0cmxp c3QsICJwaXRjaCIpCiAgICByZWZkZXN4ID0gZmluZGF0dHIoYXR0cmxpc3QsICJyZWZkZXN4IikK ICAgIHJlZmRlc3kgPSBmaW5kYXR0cihhdHRybGlzdCwgInJlZmRlc3kiKQogICAgdG90YWxoZWln aHQgPSBoZWlnaHQrdGFiaGVpZ2h0K3BhZGhlaWdodAogICAgdG90YWx3aWR0aCA9IG1heCh0YWJ3 aWR0aCwgKHBpbnMtMSkqcGl0Y2grcGFkd2lkdGgpCiAgICBzaWxreCA9IHRvdGFsd2lkdGgvMiAr IHNpbGtvZmZzZXQKICAgIHNpbGt5ID0gdG90YWxoZWlnaHQvMiArIHNpbGtvZmZzZXQKICAgIHRh YnkgPSAtKHRvdGFsaGVpZ2h0LXRhYmhlaWdodCkvMgogICAgcGFkc3kgPSAtKHBhZGhlaWdodCAt IHRvdGFsaGVpZ2h0KS8yCiAgICB0YWJiZWRlbHQgPSAiRWxlbWVudFtcIlwiIFwiRGVzY1wiIFwi TmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxuKFxuIiAlIChy ZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICB0YWJiZWRlbHQgPSB0YWJiZWRlbHQgKyBy b3dvZnBhZHMoWzAscGFkc3ldLCBwaXRjaCwgInJpZ2h0IiwgcGFkd2lkdGgsIHBhZGhlaWdodCwg MSwgcGlucywgbWFza2NsZWFyLCBwb2x5Y2xlYXIpCiAgICB0YWJiZWRlbHQgPSB0YWJiZWRlbHQg KyBwYWRjdHIoMCx0YWJ5LHRhYmhlaWdodCx0YWJ3aWR0aCxwb2x5Y2xlYXIsbWFza2NsZWFyLHN0 cihwaW5zKzEpKQogICAgdGFiYmVkZWx0ID0gdGFiYmVkZWx0ICsgYm94KHNpbGt4LHNpbGt5LC1z aWxreCwtc2lsa3ksc2lsa3dpZHRoKQogICAgcmV0dXJuIHRhYmJlZGVsdCsiKVxuIgojICBQaW5b MTc1MDAgLTI0MDAwIDY0MDAgMjAwMCA2NDAwIDM1MDAgIiIgIjEiIDB4MDAwMDAwMDFdCiMgeCx5 LHBhZGRpYSxwb2x5Y2xlYXIsbWFza2NsZWFyLGRyaWxsLG5hbWUsbmFtZSxmbGFncwoKZGVmIHBp bih4LHksZGlhLGRyaWxsLG5hbWUscG9seWNsZWFyLG1hc2tjbGVhcik6CiAgICBpZiBuYW1lID09 ICIxIjoKICAgICAgICBwaW5mbGFncyA9ICIweDAwMDAwMTAwIgogICAgZWxzZToKICAgICAgICBw aW5mbGFncyA9ICIweDAwMDAwMDAwIgogICAgcmV0dXJuICJcdFBpblsgJWRubSAlZG5tICVkbm0g JWRubSAlZG5tICVkbm0gXCIlc1wiIFwiJXNcIiAlc11cbiIgJSAoeCx5LGRpYSxwb2x5Y2xlYXIq MixtYXNrY2xlYXIrZGlhLGRyaWxsLG5hbWUsbmFtZSxwaW5mbGFncykKCmRlZiBkaXAoYXR0cmxp c3QpOgogICAgcGlucyA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGlucyIpCiAgICBkcmlsbCA9IGZp bmRhdHRyKGF0dHJsaXN0LCAiZHJpbGwiKQogICAgcGFkZGlhID0gZmluZGF0dHIoYXR0cmxpc3Qs ICJwYWRkaWEiKQogICAgd2lkdGggPSBmaW5kYXR0cihhdHRybGlzdCwgIndpZHRoIikKICAgIHBv bHljbGVhciA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicG9seWNsZWFyIikKICAgIG1hc2tjbGVhciA9 IGZpbmRhdHRyKGF0dHJsaXN0LCAibWFza2NsZWFyIikKICAgIHNpbGt3aWR0aCA9IGZpbmRhdHRy KGF0dHJsaXN0LCAic2lsa3dpZHRoIikKICAgIHBpdGNoID0gZmluZGF0dHIoYXR0cmxpc3QsICJw aXRjaCIpCiAgICByZWZkZXN4ID0gZmluZGF0dHIoYXR0cmxpc3QsICJyZWZkZXN4IikKICAgIHJl ZmRlc3kgPSBmaW5kYXR0cihhdHRybGlzdCwgInJlZmRlc3kiKQogICAgeSA9IC0ocGlucy8yLTEp KnBpdGNoLzIKICAgIHggPSB3aWR0aC8yCiAgICBkaXBlbHQgPSAiRWxlbWVudFtcIlwiIFwiRGVz Y1wiIFwiTmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxuKFxu IiAlIChyZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICBmb3IgcGlubnVtIGluIHJhbmdl ICgxLDErcGlucy8yKToKICAgICAgICBkaXBlbHQgPSBkaXBlbHQgKyBwaW4oLXgseSxwYWRkaWEs ZHJpbGwsc3RyKHBpbm51bSkscG9seWNsZWFyLG1hc2tjbGVhcikKICAgICAgICB5ID0geSArIHBp dGNoCiAgICB5ID0geSAtIHBpdGNoCiAgICBmb3IgcGlubnVtIGluIHJhbmdlICgxK3BpbnMvMiwg cGlucysxKToKICAgICAgICBkaXBlbHQgPSBkaXBlbHQgKyBwaW4oeCx5LHBhZGRpYSxkcmlsbCxz dHIocGlubnVtKSxwb2x5Y2xlYXIsbWFza2NsZWFyKQogICAgICAgIHkgPSB5IC0gcGl0Y2gKICAg IHNpbGt5ID0gcGlucypwaXRjaC80CiAgICBzaWxreCA9ICh3aWR0aCtwaXRjaCkvMgogICAgZGlw ZWx0ID0gZGlwZWx0ICsgYm94KHNpbGt4LHNpbGt5LC1zaWxreCwtc2lsa3ksc2lsa3dpZHRoKQog ICAgZGlwZWx0ID0gZGlwZWx0ICsgYm94KC1zaWxreCwtc2lsa3ksLXNpbGt4K3BpdGNoLC1zaWxr eStwaXRjaCxzaWxrd2lkdGgpCiAgICByZXR1cm4gZGlwZWx0KyIpXG4iCgpkZWYgZGloKGF0dHJs aXN0KToKICAgIHBpbnMgPSBmaW5kYXR0cihhdHRybGlzdCwgInBpbnMiKQogICAgZHJpbGwgPSBm aW5kYXR0cihhdHRybGlzdCwgImRyaWxsIikKICAgIHBhZGRpYSA9IGZpbmRhdHRyKGF0dHJsaXN0 LCAicGFkZGlhIikKICAgIHdpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJ3aWR0aCIpCiAgICBw b2x5Y2xlYXIgPSBmaW5kYXR0cihhdHRybGlzdCwgInBvbHljbGVhciIpCiAgICBtYXNrY2xlYXIg PSBmaW5kYXR0cihhdHRybGlzdCwgIm1hc2tjbGVhciIpCiAgICBzaWxrd2lkdGggPSBmaW5kYXR0 cihhdHRybGlzdCwgInNpbGt3aWR0aCIpCiAgICBwaXRjaCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAi cGl0Y2giKQogICAgcmVmZGVzeCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicmVmZGVzeCIpCiAgICBy ZWZkZXN5ID0gZmluZGF0dHIoYXR0cmxpc3QsICJyZWZkZXN5IikKICAgIHNpbGtib3h3aWR0aCA9 IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa2JveHdpZHRoIikKICAgIHNpbGtib3hoZWlnaHQgPSBm aW5kYXR0cihhdHRybGlzdCwgInNpbGtib3hoZWlnaHQiKQogICAgeSA9IC0ocGlucy8yLTEpKnBp dGNoLzIKICAgIHggPSB3aWR0aC8yCiAgICBkaWhlbHQgPSAiRWxlbWVudFtcIlwiIFwiRGVzY1wi IFwiTmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxuKFxuIiAl IChyZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICBmb3IgcGlubnVtIGluIHJhbmdlICgx LDErcGlucywyKToKICAgICAgICBkaWhlbHQgPSBkaWhlbHQgKyBwaW4oLXgseSxwYWRkaWEsZHJp bGwsc3RyKHBpbm51bSkscG9seWNsZWFyLG1hc2tjbGVhcikKICAgICAgICB5ID0geSArIHBpdGNo CiAgICB5ID0gLShwaW5zLzItMSkqcGl0Y2gvMgogICAgZm9yIHBpbm51bSBpbiByYW5nZSAoMiwx K3BpbnMsMik6CiAgICAgICAgZGloZWx0ID0gZGloZWx0ICsgcGluKHgseSxwYWRkaWEsZHJpbGws c3RyKHBpbm51bSkscG9seWNsZWFyLG1hc2tjbGVhcikKICAgICAgICB5ID0geSArIHBpdGNoCiAg ICBzaWxreSA9IG1heChwaW5zKnBpdGNoLzQsc2lsa2JveGhlaWdodC8yKQogICAgc2lsa3ggPSBt YXgoKHdpZHRoK3BpdGNoKS8yLHNpbGtib3h3aWR0aC8yKQogICAgZGloZWx0ID0gZGloZWx0ICsg Ym94KHNpbGt4LHNpbGt5LC1zaWxreCwtc2lsa3ksc2lsa3dpZHRoKQogICAgZGloZWx0ID0gZGlo ZWx0ICsgYm94KC1zaWxreCwtc2lsa3ksLXNpbGt4K3BpdGNoLC1zaWxreStwaXRjaCxzaWxrd2lk dGgpCiAgICByZXR1cm4gZGloZWx0KyIpXG4iCgpkZWYgZGloZihhdHRybGlzdCk6CiAgICBwaW5z ID0gZmluZGF0dHIoYXR0cmxpc3QsICJwaW5zIikKICAgIGRyaWxsID0gZmluZGF0dHIoYXR0cmxp c3QsICJkcmlsbCIpCiAgICBwYWRkaWEgPSBmaW5kYXR0cihhdHRybGlzdCwgInBhZGRpYSIpCiAg ICB3aWR0aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAid2lkdGgiKQogICAgcG9seWNsZWFyID0gZmlu ZGF0dHIoYXR0cmxpc3QsICJwb2x5Y2xlYXIiKQogICAgbWFza2NsZWFyID0gZmluZGF0dHIoYXR0 cmxpc3QsICJtYXNrY2xlYXIiKQogICAgc2lsa3dpZHRoID0gZmluZGF0dHIoYXR0cmxpc3QsICJz aWxrd2lkdGgiKQogICAgcGl0Y2ggPSBmaW5kYXR0cihhdHRybGlzdCwgInBpdGNoIikKICAgIHJl ZmRlc3ggPSBmaW5kYXR0cihhdHRybGlzdCwgInJlZmRlc3giKQogICAgcmVmZGVzeSA9IGZpbmRh dHRyKGF0dHJsaXN0LCAicmVmZGVzeSIpCiAgICB5ID0gLShwaW5zLzItMSkqcGl0Y2gvMgogICAg eCA9IHdpZHRoLzIKICAgIGRpaGZlbHQgPSAiRWxlbWVudFtcIlwiIFwiRGVzY1wiIFwiTmFtZVwi IFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBcIlwiXVxuKFxuIiAlIChyZWZkZXN4 LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICBmb3IgcGlubnVtIGluIHJhbmdlICgxLDErcGlucywy KToKICAgICAgICBkaWhmZWx0ID0gZGloZmVsdCArIHBpbih4LHkscGFkZGlhLGRyaWxsLHN0cihw aW5udW0pLHBvbHljbGVhcixtYXNrY2xlYXIpCiAgICAgICAgeSA9IHkgKyBwaXRjaAogICAgeSA9 IC0ocGlucy8yLTEpKnBpdGNoLzIKICAgIGZvciBwaW5udW0gaW4gcmFuZ2UgKDIsMStwaW5zLDIp OgogICAgICAgIGRpaGZlbHQgPSBkaWhmZWx0ICsgcGluKC14LHkscGFkZGlhLGRyaWxsLHN0cihw aW5udW0pLHBvbHljbGVhcixtYXNrY2xlYXIpCiAgICAgICAgeSA9IHkgKyBwaXRjaAogICAgc2ls a3kgPSBwaW5zKnBpdGNoLzQKICAgIHNpbGt4ID0gKHdpZHRoK3BpdGNoKS8yCiAgICBkaWhmZWx0 ID0gZGloZmVsdCArIGJveChzaWxreCxzaWxreSwtc2lsa3gsLXNpbGt5LHNpbGt3aWR0aCkKICAg IGRpaGZlbHQgPSBkaWhmZWx0ICsgYm94KHNpbGt4LC1zaWxreSwtc2lsa3grcGl0Y2gsLXNpbGt5 K3BpdGNoLHNpbGt3aWR0aCkKICAgIHJldHVybiBkaWhmZWx0KyIpXG4iCiAgICAgICAgICAgIAoK ZGVmIHNpcChhdHRybGlzdCk6CiAgICBwaW5zID0gZmluZGF0dHIoYXR0cmxpc3QsICJwaW5zIikK ICAgIGRyaWxsID0gZmluZGF0dHIoYXR0cmxpc3QsICJkcmlsbCIpCiAgICBwYWRkaWEgPSBmaW5k YXR0cihhdHRybGlzdCwgInBhZGRpYSIpCiAgICBwb2x5Y2xlYXIgPSBmaW5kYXR0cihhdHRybGlz dCwgInBvbHljbGVhciIpCiAgICBtYXNrY2xlYXIgPSBmaW5kYXR0cihhdHRybGlzdCwgIm1hc2tj bGVhciIpCiAgICBzaWxrd2lkdGggPSBmaW5kYXR0cihhdHRybGlzdCwgInNpbGt3aWR0aCIpCiAg ICBwaXRjaCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAicGl0Y2giKQogICAgcmVmZGVzeCA9IGZpbmRh dHRyKGF0dHJsaXN0LCAicmVmZGVzeCIpCiAgICByZWZkZXN5ID0gZmluZGF0dHIoYXR0cmxpc3Qs ICJyZWZkZXN5IikKICAgIHNpbGtib3h3aWR0aCA9IGZpbmRhdHRyKGF0dHJsaXN0LCAic2lsa2Jv eHdpZHRoIikKICAgIHNpbGtib3hoZWlnaHQgPSBmaW5kYXR0cihhdHRybGlzdCwgInNpbGtib3ho ZWlnaHQiKQogICAgeSA9IC0ocGlucy0xKSpwaXRjaC8yCiAgICBzaXBlbHQgPSAiRWxlbWVudFtc IlwiIFwiRGVzY1wiIFwiTmFtZVwiIFwiVmFsXCIgMTAwMCAxMDAwICVkbm0gJWRubSAwIDEwMCBc IlwiXVxuKFxuIiAlIChyZWZkZXN4LCAtMTAwMDAwMCAtIHJlZmRlc3kpCiAgICBmb3IgcGlubnVt IGluIHJhbmdlICgxLDErcGlucyk6CiAgICAgICAgc2lwZWx0ID0gc2lwZWx0ICsgcGluKDAseSxw YWRkaWEsZHJpbGwsc3RyKHBpbm51bSkscG9seWNsZWFyLG1hc2tjbGVhcikKICAgICAgICB5ID0g eSArIHBpdGNoCiAgICBzaWxreSA9IG1heChwaW5zKnBpdGNoLzIsc2lsa2JveGhlaWdodC8yKQog ICAgc2lsa3ggPSBtYXgocGl0Y2gvMixzaWxrYm94d2lkdGgvMikKICAgIHNpcGVsdCA9IHNpcGVs dCArIGJveChzaWxreCxzaWxreSwtc2lsa3gsLXNpbGt5LHNpbGt3aWR0aCkKICAgIHNpcGVsdCA9 IHNpcGVsdCArIGJveCgtc2lsa3gsLXNpbGt5LC1zaWxreCtwaXRjaCwtc2lsa3krcGl0Y2gsc2ls a3dpZHRoKQogICAgcmV0dXJuIHNpcGVsdCsiKVxuIgoKZGVmIGdlbnBhcnQoYXR0cmlidXRlcyk6 CiAgICBwYXJ0dHlwZSA9IGZpbmRhdHRyKGF0dHJpYnV0ZXMsICJ0eXBlIikKICAgIGlmIHBhcnR0 eXBlPT0nYmdhJzoKICAgICAgICByZXR1cm4gYmdhKGF0dHJpYnV0ZXMpCiAgICBlbGlmIHBhcnR0 eXBlPT0ncWZwJzoKICAgICAgICByZXR1cm4gcWZwKGF0dHJpYnV0ZXMpCiAgICBlbGlmIHBhcnR0 eXBlPT0nc28nOgogICAgICAgIHJldHVybiBzbyhhdHRyaWJ1dGVzKQogICAgZWxpZiBwYXJ0dHlw ZT09J3R3b3BhZCc6CiAgICAgICAgcmV0dXJuIHR3b3BhZChhdHRyaWJ1dGVzKQogICAgZWxpZiBw YXJ0dHlwZT09J3RhYmJlZCc6CiAgICAgICAgcmV0dXJuIHRhYmJlZChhdHRyaWJ1dGVzKQogICAg ZWxpZiBwYXJ0dHlwZSA9PSAnZGlwJzoKICAgICAgICByZXR1cm4gZGlwKGF0dHJpYnV0ZXMpCiAg ICBlbGlmIHBhcnR0eXBlID09ICdkaWgnOgogICAgICAgIHJldHVybiBkaWgoYXR0cmlidXRlcykK ICAgIGVsaWYgcGFydHR5cGUgPT0gJ2RpaGYnOgogICAgICAgIHJldHVybiBkaWhmKGF0dHJpYnV0 ZXMpCiAgICBlbGlmIHBhcnR0eXBlID09ICdzaXAnOgogICAgICAgIHJldHVybiBzaXAoYXR0cmli dXRlcykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQgIlVua25vd24gdHlwZSAiK3BhcnR0eXBlCiAg ICBwcmludCAiIgogICAgcmV0dXJuICIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKCmRlZiBpbnF1b3Rlcyhvcmlnc3RyaW5nKToKICAgIHF1b3RlcG9z ID0gcmUuc2VhcmNoKCJcIi4qXCIiLCBvcmlnc3RyaW5nKQogICAgaWYgcXVvdGVwb3M6CiAgICAg ICAgcmV0dXJuIG9yaWdzdHJpbmdbcXVvdGVwb3Muc3RhcnQoKSsxOnF1b3RlcG9zLmVuZCgpLTFd CiAgICByZXR1cm4gIiIKCiMgY29udmVydCB2YWx1ZXMgZnJvbSBzb3VyY2UgdW5pdHMgaW50byBu YW5vbWV0ZXJzCmRlZiBzdHIycGNidW5pdHMoZGlzdCk6CiAgICBudW1iZXIgPSByZS5zZWFyY2go J1stPzAtOVwuXSsnLCBkaXN0KQogICAgaWYgbnVtYmVyOgogICAgICAgIHZhbCA9IGZsb2F0KG51 bWJlci5ncm91cCgpKQogICAgZWxzZToKICAgICAgICByZXR1cm4gMAogICAgaWYgZGlzdFtudW1i ZXIuZW5kKCk6XS5maW5kKCJtbSIpIT0tMToKICAgICAgICByZXR1cm4gaW50KDAuNSArIDEwMDAw MDAgKiB2YWwpCiAgICBlbGlmIGRpc3RbbnVtYmVyLmVuZCgpOl0uZmluZCgibWlsIikhPS0xOgog ICAgICAgIHJldHVybiBpbnQoMC41ICsgdmFsICogMjUuNCAqIDEwMDApCiAgICBlbGlmIGRpc3Rb bnVtYmVyLmVuZCgpOl0uZmluZCgiaW4iKSE9LTE6CiAgICAgICAgcmV0dXJuIGludCgwLjUgKyB2 YWwgKiAyNS40ICogMTAwMDAwMCkKICAgIHJldHVybiBpbnQoMC41ICsgdmFsKQoKaW1wb3J0IHN5 cwojaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCiMgb3BlbiBpbnB1dCBmaWxlCmlmIHN5cy5hcmd2 WzE6XToKICAgIHRyeToKICAgICAgICBpbl9maWxlID0gb3BlbihzeXMuYXJndlsxXSwgJ3InKQog ICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKICAgICAgICBwcmludCAnQ2FuXCd0IG9wZW4gIiVzIjon ICUgc3lzLmFyZ3ZbMV0sIG1zZwogICAgICAgIHN5cy5leGl0KDEpCmVsc2U6CiAgICBpbl9maWxl ID0gc3lzLnN0ZGluCiAgICBwcmludCAiTm8gZmlsZSBnaXZlbiBzbyB1c2luZyBzdGRpbiIKCiMg bGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGRlZmluZWQgaW4gZmlsZQphdHRyaWJ1dGVzID0gZGVm YXR0cigpCiMgbWFpbiBwcm9jZXNzaW5nIGxvb3AgZW50ZXIgcHJvY2Vzc2luZyBlbGVtZW50cwps aW5lbnVtID0gMQp3aGlsZSAxOgogICAgdmFsaWRsaW5lID0gMAogICAgbGluZSA9IGluX2ZpbGUu cmVhZGxpbmUoKQogICAgbGluZW51bSA9IGxpbmVudW0gKyAxCiAgICBpZiBub3QgbGluZToKICAg ICAgICBicmVhawogICAgIyBzdHJpcCBjb21tZW50cwogICAgaWYgbGluZS5maW5kKCIjIikgPT0g MDoKICAgICAgICBjb250aW51ZQogICAgaWYgbGluZS5maW5kKCIjIikhPS0xOgogICAgICAgIGxp bmUgPSBsaW5lWzpsaW5lLmZpbmQoIiMiKS0xXQogICAgIyBzdHJpcCB3aGl0ZXNwYWNlCiAgICBs aW5lID0gbGluZS5zdHJpcCgpCiAgICBpZiBsaW5lID09ICIiOgogICAgICAgIGNvbnRpbnVlCiAg ICBpZiBsaW5lLmZpbmQoImNsZWFyYWxsIikhPS0xOgogICAgICAgIGF0dHJpYnV0ZXMgPSBkZWZh dHRyKCkKICAgICAgICBjb250aW51ZQogICAgZm9yIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzOgog ICAgICAgIGlmIGxpbmUuZmluZChhdHRyaWJ1dGVbMF0pIT0tMToKICAgICAgICAgICAgYXR0cmli dXRlWzFdPWlucXVvdGVzKGxpbmUpCiAgICAgICAgICAgIGlmIG5vdCBhdHRyaWJ1dGVbMV06CiAg ICAgICAgICAgICAgICBhdHRyaWJ1dGVbMV09c3RyMnBjYnVuaXRzKGxpbmUpCiAgICAgICAgICAg IHZhbGlkbGluZSA9IDEKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGF0dHJpYnV0ZVswXSA9PSAi cGFydCI6CiAgICAgICAgZmlsZW5hbWUgPSBmaW5kYXR0cihhdHRyaWJ1dGVzLCJlbGVtZW50ZGly IikrIi8iK2ZpbmRhdHRyKGF0dHJpYnV0ZXMsInBhcnQiKQogICAgICAgIHByaW50ICJnZW5lcmF0 ZWQgJXMiICUgZmlsZW5hbWUKICAgICAgICBvdXRwdXRfZmlsZSA9IG9wZW4oZmlsZW5hbWUsICJ3 IikKICAgICAgICBvdXRwdXRfZmlsZS53cml0ZShnZW5wYXJ0KGF0dHJpYnV0ZXMpKQogICAgICAg IG91dHB1dF9maWxlLmNsb3NlKCkKICAgICAgICB2YWxpZGxpbmUgPSAxCiAgICBpZiBub3QgdmFs aWRsaW5lOgogICAgICAgIHByaW50ICJJZ25vcmluZyBnYXJiYWdlIGF0IGxpbmUgJWQgOiVzIiAl IChsaW5lbnVtLCBsaW5lKQoJCQkKcHJpbnQgIiVkIGxpbmVzIHJlYWQiICUgbGluZW51bQpzeXMu ZXhpdCgwKQo= --f46d0437454755aaab04c626e820--