Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!nntp.club.cc.cmu.edu!195.208.113.1.MISMATCH!goblin3!goblin2!goblin.stu.neva.ru!newsfeed.xs4all.nl!newsfeed4a.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'else:': 0.03; 'algorithm': 0.04; 'elif': 0.05; 'insert': 0.05; 'output': 0.05; 'tree': 0.05; 'filename:fname piece:py': 0.07; 'hosts': 0.07; 'matches': 0.07; 'method.': 0.07; 'none,': 0.07; 'none:': 0.07; 'paths': 0.07; 'sys': 0.07; 'tests.': 0.07; 'advance': 0.07; '#print': 0.09; '%s"': 0.09; '%s",': 0.09; '[0]': 0.09; '__name__': 0.09; 'dst': 0.09; 'false,': 0.09; 'method,': 0.09; 'msg': 0.09; 'none):': 0.09; 'subject:method': 0.09; 'tcp/ip': 0.09; 'runs': 0.10; 'python': 0.11; 'def': 0.12; 'random': 0.14; '"""install': 0.16; "'''": 0.16; "','": 0.16; "'__main__':": 0.16; '-1):': 0.16; '-1,': 0.16; '0.2': 0.16; '1):': 0.16; '16)': 0.16; 'attaching': 0.16; 'col': 0.16; 'data)': 0.16; 'dict': 0.16; 'dst)': 0.16; 'dst):': 0.16; 'dst,': 0.16; 'dst:': 0.16; 'elephant': 0.16; 'event):': 0.16; 'fetches': 0.16; 'flow,': 0.16; 'hashed': 0.16; 'host_name': 0.16; 'lot!': 0.16; 'name)': 0.16; 'name):': 0.16; 'nodes': 0.16; 'param': 0.16; 'path.': 0.16; 'pdb': 0.16; 'port)': 0.16; 'port))': 0.16; 'port,': 0.16; 'range(0,': 0.16; 'src': 0.16; 'src)': 0.16; 'src,': 0.16; 'src:': 0.16; 'stats': 0.16; 'subject:class': 0.16; 'suggestion.': 0.16; 'switch.': 0.16; 'switches': 0.16; 'tcp': 0.16; 'temp': 0.16; 'traverse': 0.16; 'true:': 0.16; 'exception': 0.16; 'fix': 0.17; 'trying': 0.19; 'everyone,': 0.19; "skip:' 30": 0.19; 'fit': 0.20; 'input': 0.22; 'example': 0.22; 'import': 0.22; 'print': 0.22; 'install': 0.23; 'bytes': 0.24; 'entries': 0.24; 'flows': 0.24; 'specify': 0.24; 'source': 0.25; 'logging': 0.26; 'switch': 0.26; 'defined': 0.27; 'skip:" 20': 0.27; 'skip:_ 20': 0.27; 'installed': 0.27; 'function': 0.29; 'host': 0.29; 'skip:p 30': 0.29; 'raise': 0.29; 'message-id:@mail.gmail.com': 0.30; 'code': 0.31; "skip:' 10": 0.31; 'assert': 0.31; 'layer': 0.31; 'node': 0.31; 'object.': 0.31; 'struct': 0.31; 'up:': 0.31; 'class': 0.32; 'skip:c 30': 0.32; 'skip:m 30': 0.32; 'run': 0.32; '(including': 0.33; 'implemented': 0.33; 'mac': 0.33; 'skip:# 10': 0.33; 'skip:t 40': 0.33; 'actual': 0.34; 'skip:_ 10': 0.34; 'core': 0.34; 'skip:d 20': 0.34; 'could': 0.34; 'skip:s 30': 0.35; '2000': 0.65; 'here': 0.66; 'between': 0.67; 'broadcast': 0.68; 'results': 0.69; 'default': 0.69; 'paper': 0.75; 'estimation': 0.84; 'fat': 0.84; 'milad': 0.84; 'processed,': 0.84; 'route': 0.84; 'sharif': 0.84; 'stat': 0.84; 'subject:base': 0.84; 'ten,': 0.84; 'capture': 0.91; 'controller': 0.91; 'demand': 0.91; 'destination': 0.91; 'subject:results': 0.91 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=DmtvdP4yrGqQyr1fGHcOq1kImUuoNIMtmzIpZc7DzOM=; b=ZuiawIXNaHdYTv6U7cQgCFGDGzcqPUAFLIjMp2sGZURqr0vd351WOTCG2kiKgQTiyn +5Gz854puPHiudt4c4XX8518lfg6INd7GVx6ZzT4lUb4ysz1DxoLEkS9+C1oQv5OXXxy r/SRsyoz0eGSi3/CUDnBoxKyh4Uie5ywp7fnuze6crpYI9CXLfDiOV0/AQDuuYgxDYTW Q3aSbWqsEuCVj4Z5G8VrzZoOA9fT2nres920+WEEJNCDnwyaH2YN2tF9R+ebcS23oUIp mKocpTTPoWakddUgXxrOZc7D+UGZfVvZbuD6Eo3q3UwdVH/iA3Yf0BgVl3LZiVMdlwnk mR2g== MIME-Version: 1.0 X-Received: by 10.107.11.81 with SMTP id v78mr1871360ioi.66.1431153713221; Fri, 08 May 2015 23:41:53 -0700 (PDT) Date: Sat, 9 May 2015 11:41:52 +0500 Subject: calling base class method fetches no results From: david jhon To: python-list@python.org Content-Type: multipart/mixed; boundary=001a113fb330b28d780515a07036 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.20+ Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 554 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1431153716 news.xs4all.nl 2929 [2001:888:2000:d::a6]:37425 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:90270 --001a113fb330b28d780515a07036 Content-Type: multipart/alternative; boundary=001a113fb330b28d730515a07034 --001a113fb330b28d730515a07034 Content-Type: text/plain; charset=UTF-8 Hello everyone, I am new to python and trying to run an example code from mininet tests. Basically, I am trying to call a method in Hcontroller.py from base class Routing defined in DCRouting.py which runs and fetches all the required results in install_reactive_path() method, but it returns None when it is called from _GlobalFirstFit. I hope someone here could help me fix this bug.. I am attaching all the three files(DCRouting.py, HController.py, util.py) to have a look into. Thanks in advance for your time, help or suggestion. Thanks a lot! kind regards, David --001a113fb330b28d730515a07034 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hello everyone,

I am new= to python and trying to run an example code from mininet tests. Basically,= I am trying to call a method in Hcontroller.py from base class Routing def= ined in DCRouting.py which runs and fetches all the required results in ins= tall_reactive_path() method, but it returns None when it is called from _Gl= obalFirstFit. I hope someone here could help me fix this bug..

I am attaching all the three files(DCRouting.py, HController.py, util.py)= to have a look into. Thanks in advance for your time, help or suggestion. = Thanks a lot!

kind regards,
David
--001a113fb330b28d730515a07034-- --001a113fb330b28d780515a07036 Content-Type: text/x-python; charset=US-ASCII; name="DCRouting.py" Content-Disposition: attachment; filename="DCRouting.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i9gntanz0 JycnIFNpbXBsZSBoYXNoZWQtYmFzZWQgcm91dGluZwoKQGF1dGhvcjogTWlsYWQgU2hhcmlmICht c2hhcmlmQHN0YW5mb3JkLmVkdSkKJycnCgppbXBvcnQgbG9nZ2luZwpmcm9tIGNvcHkgaW1wb3J0 IGNvcHkKCmNsYXNzIFJvdXRpbmcob2JqZWN0KToKICAgICcnJ0Jhc2UgY2xhc3MgZm9yIGRhdGEg Y2VudGVyIG5ldHdvcmsgcm91dGluZy4KCiAgICBSb3V0aW5nIGVuZ2luZXMgbXVzdCBpbXBsZW1l bnQgdGhlIGdldF9yb3V0ZSgpIG1ldGhvZC4KICAgICcnJwoKICAgIGRlZiBfX2luaXRfXyhzZWxm LCB0b3BvKToKICAgICAgICAnJydDcmVhdGUgUm91dGluZyBvYmplY3QuCgogICAgICAgIEBwYXJh bSB0b3BvIFRvcG8gb2JqZWN0IGZyb20gTmV0IHBhcmVudAogICAgICAgICcnJwogICAgICAgIHNl bGYudG9wbyA9IHRvcG8KCiAgICBkZWYgZ2V0X3JvdXRlKHNlbGYsIHNyYywgZHN0LCBoYXNoXyk6 CiAgICAgICAgJycnUmV0dXJuIGZsb3cgcGF0aC4KCiAgICAgICAgQHBhcmFtIHNyYyBzb3VyY2Ug aG9zdAogICAgICAgIEBwYXJhbSBkc3QgZGVzdGluYXRpb24gaG9zdAogICAgICAgIEBwYXJhbSBo YXNoXyBoYXNoIHZhbHVlCgogICAgICAgIEByZXR1cm4gZmxvd19wYXRoIGxpc3Qgb2YgRFBJRHMg dG8gdHJhdmVyc2UgKGluY2x1ZGluZyBob3N0cykKICAgICAgICAnJycKICAgICAgICByYWlzZSBO b3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHJvdXRlcyhzZWxmLCBzcmMsIGRzdCk6CiAgICAg ICAgJycnIFJldHVybiBsaXN0IG9mIHBhdGhzCiAgICAgICAgCiAgICAgICAgT25seSB3b3JrcyBm b3IgRmF0LVRyZWUgdG9wb2xvZ3kKCiAgICAgICAgQCBwYXJhbSBzcmMgc291cmNlIGhvc3QKICAg ICAgICBAIHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBob3N0CgogICAgICAgIEAgcmV0dXJuIGxpc3Qg b2YgRFBJRHMgKGluY2x1ZGluZyBpbnB1dHMpIAogICAgICAgICcnJyAgCiAgICAgICAgCiAgICAg ICAgY29tcGxldGVfcGF0aHMgPSBbXSAjIExpc3Qgb2YgY29tcGxldGUgZHBpZCByb3V0ZXMKICAg ICAgICAKICAgICAgICBzcmNfcGF0aHMgPSB7IHNyYyA6IFtbc3JjXV0gfQogICAgICAgIGRzdF9w YXRocyA9IHsgZHN0IDogW1tkc3RdXSB9IAogICAgCiAgICAgICAgZHN0X2xheWVyID0gc2VsZi50 b3BvLmxheWVyKGRzdCkKICAgICAgICBzcmNfbGF5ZXIgPSBzZWxmLnRvcG8ubGF5ZXIoc3JjKQog ICAgICAgIAogICAgICAgIGxvd2VyX2xheWVyID0gc3JjX2xheWVyCiAgICAgICAgaWYgZHN0X2xh eWVyID4gc3JjX2xheWVyOgogICAgICAgICAgICBsb3dlcl9sYXllciA9IGRzdF9sYXllcgogICAg ICAgIAoKICAgICAgICBmb3IgZnJvbnRfbGF5ZXIgaW4gcmFuZ2UobG93ZXJfbGF5ZXItMSwgLTEs IC0xKToKICAgICAgICAgICAgaWYgc3JjX2xheWVyID4gZnJvbnRfbGF5ZXI6CiAgICAgICAgICAg ICMgZXhwYW5kIHNyYyBmcm9udGllcgogICAgICAgICAgICAgICAgbmV3X3NyY19wYXRocyA9IHt9 CiAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzb3J0ZWQoc3JjX3BhdGhzKToKICAgICAgICAg ICAgICAgICAgICBwYXRoX2xpc3QgPSBzcmNfcGF0aHNbbm9kZV0KICAgICAgICAgICAgICAgICAg ICBmb3IgcGF0aCBpbiBwYXRoX2xpc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfbm9k ZSA9IHBhdGhbLTFdCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmcm9udGllcl9ub2RlIGlu IHNlbGYudG9wby51cHBlcl9ub2RlcyhsYXN0X25vZGUpOgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgbmV3X3NyY19wYXRoc1tmcm9udGllcl9ub2RlXSA9IFtwYXRoICsgW2Zyb250aWVyX25v ZGVdXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZyb250aWVyX25vZGUgaW4gZHN0 X3BhdGhzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wYXRoX2xpc3QgPSBk c3RfcGF0aHNbZnJvbnRpZXJfbm9kZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm b3IgZHN0X3BhdGggaW4gZHN0X3BhdGhfbGlzdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZHN0X3BhdGhfY29weSA9IGNvcHkgKCBkc3RfcGF0aCApCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGRzdF9wYXRoX2NvcHkucmV2ZXJzZSgpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX3BhdGhzLmFwcGVuZCggcGF0aCArIGRz dF9wYXRoX2NvcHkpCiAgICAgICAgICAgICAgICBzcmNfcGF0aHMgPSBuZXdfc3JjX3BhdGhzCiAg ICAgICAgICAgIAogICAgICAgICAgICBpZiBkc3RfbGF5ZXIgPiBmcm9udF9sYXllcjoKICAgICAg ICAgICAgIyBleHBhbmQgZHN0IGZyb250aWVyCiAgICAgICAgICAgICAgICBuZXdfZHN0X3BhdGhz ID0ge30KICAgICAgICAgICAgICAgIGZvciBub2RlIGluIHNvcnRlZChkc3RfcGF0aHMpOiAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgcGF0aF9saXN0ID0gZHN0X3BhdGhzW25vZGVdCiAgICAg ICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gcGF0aF9saXN0OgogICAgICAgICAgICAgICAgICAg ICAgICBsYXN0X25vZGUgPSBwYXRoWy0xXQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgZnJv bnRpZXJfbm9kZSBpbiBzZWxmLnRvcG8udXBwZXJfbm9kZXMobGFzdF9ub2RlKToKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5ld19kc3RfcGF0aHNbZnJvbnRpZXJfbm9kZV0gPSBbIHBhdGgg KyBbZnJvbnRpZXJfbm9kZV1dCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgaWYgZnJvbnRpZXJfbm9kZSBpbiBzcmNfcGF0aHM6CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3JjX3BhdGhfbGlzdCA9IHNyY19wYXRoc1tmcm9udGllcl9u b2RlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wYXRoX2NvcHkgPSBjb3B5 KCBwYXRoICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcGF0aF9jb3B5LnJl dmVyc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzcmNfcGF0aCBpbiBz cmNfcGF0aF9saXN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0 ZV9wYXRocy5hcHBlbmQoIHNyY19wYXRoICsgZHN0X3BhdGhfY29weSkKICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICBkc3RfcGF0aHMgPSBuZXdfZHN0X3BhdGhzCgogICAgICAgICAgICBpZiBj b21wbGV0ZV9wYXRoczoKICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZV9wYXRocwoKY2xh c3MgSGFzaGVkUm91dGluZyhSb3V0aW5nKToKICAgICcnJyBIYXNoZWQgcm91dGluZyAnJycKCiAg ICBkZWYgX19pbml0X18oc2VsZiwgdG9wbyk6CiAgICAgICAgc2VsZi50b3BvID0gdG9wbwoKICAg IGRlZiBnZXRfcm91dGUoc2VsZiwgc3JjLCBkc3QsIGhhc2hfKToKICAgICAgICAnJycgUmV0dXJu IGZsb3cgcGF0aC4gJycnCiAgICAgICAgCiAgICAgICAgaWYgc3JjID09IGRzdDoKICAgICAgICAg ICAgcmV0dXJuIFtzcmNdCiAgICAKICAgICAgICBwYXRocyA9IHNlbGYucm91dGVzKHNyYyxkc3Qp CiAgICAgICAgaWYgcGF0aHM6CiAgICAgICAgICAgICNwcmludCAnaGFzaF86JywgaGFzaF8KICAg ICAgICAgICAgY2hvaWNlID0gaGFzaF8gJSBsZW4ocGF0aHMpCiAgICAgICAgICAgICNwcmludCAn Y2hvaWNlOicsIGNob2ljZQogICAgICAgICAgICBwYXRoID0gc29ydGVkKHBhdGhzKVtjaG9pY2Vd CiAgICAgICAgICAgICNwcmludCAncGF0aDonLCBwYXRoCiAgICAgICAgICAgIHJldHVybiBwYXRo Cgo= --001a113fb330b28d780515a07036 Content-Type: text/x-python; charset=US-ASCII; name="DCTopo.py" Content-Disposition: attachment; filename="DCTopo.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i9gntfoz1 IyEvdXNyL2Jpbi9weXRob24KCicnJwpGYXQgdHJlZSB0b3BvbG9neSBmb3IgZGF0YSBjZW50ZXIg bmV0d29ya2luZwoKQGF1dGhvciBNaWxhZCBTaGFyaWYgKG1zaGFyaWZAc3RhbmZvcmQuZWR1KQoK JycnCgpmcm9tIG1pbmluZXQudG9wbyBpbXBvcnQgVG9wbwoKCmNsYXNzIEZhdFRyZWVOb2RlKG9i amVjdCk6CiAgICAKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb2QgPSAwLCBzdyA9IDAsIGhvc3Qg PSAwLCBuYW1lID0gTm9uZSwgZHBpZCA9IE5vbmUpOgogICAgICAgICcnJyBDcmVhdGUgRmF0VHJl ZU5vZGUgJycnCiAgICAgICAgaWYgZHBpZDoKICAgICAgICAgICAgc2VsZi5wb2QgPSAoIGRwaWQg JiAweGZmMDAwMCApID4+IDE2CiAgICAgICAgICAgIHNlbGYuc3cgPSAoIGRwaWQgJiAweGZmMDAg KSA+PiA4CiAgICAgICAgICAgIHNlbGYuaG9zdCA9ICggZHBpZCAmIDB4ZmYgKQogICAgICAgICAg ICBzZWxmLmRwaWQgPSBkcGlkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbmFtZToKICAg ICAgICAgICAgICAgIHBvZCwgc3csIGhvc3QgPSBbaW50KHMpIGZvciBzIGluIG5hbWUuc3BsaXQo J2gnKV0KICAgICAgICAgICAgCiAgICAgICAgICAgIHNlbGYucG9kID0gcG9kCiAgICAgICAgICAg IHNlbGYuc3cgPSBzdwogICAgICAgICAgICBzZWxmLmhvc3QgPSBob3N0CiAgICAgICAgICAgIHNl bGYuZHBpZCA9IChwb2QgPDwgMTYpICsgKHN3IDw8IDgpICsgaG9zdCAKCiAgICBkZWYgbmFtZV9z dHIoc2VsZik6CiAgICAgICAgJycnIFJldHVybiBuYW1lICcnJwogICAgICAgIHJldHVybiAiJWlo JWloJWkiICUgKHNlbGYucG9kLCBzZWxmLnN3LCBzZWxmLmhvc3QpCgogICAgZGVmIGlwX3N0cihz ZWxmKToKICAgICAgICAnJycgUmV0dXJuIElQIGFkZHJlc3MgJycnCiAgICAgICAgcmV0dXJuICIx MC4laS4laS4laSIgJSAoc2VsZi5wb2QsIHNlbGYuc3csIHNlbGYuaG9zdCkKCiAgICBkZWYgbWFj X3N0cihzZWxmKToKICAgICAgICAnJycgUmV0dXJuIE1BQyBhZGRyZXNzICcnJwogICAgICAgIHJl dHVybiAiMDA6MDA6MDA6JTAyeDolMDJ4OiUwMngiICUgKHNlbGYucG9kLCBzZWxmLnN3LCBzZWxm Lmhvc3QpCgpjbGFzcyBOb25CbG9ja2luZ1RvcG8oVG9wbyk6CiAgICAKICAgIExBWUVSX0NPUkUg PSAwCiAgICBMQVlFUl9IT1NUID0gMwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrPTQpOgogICAg ICAgICcnJyBDcmVhdGUgYSBub24tYmxva2luZyBzd2l0Y2ggJycnCiAgICAgICAgc3VwZXIoTm9u QmxvY2tpbmdUb3BvLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAKICAgICAgICBzZWxmLmsgPSBr CiAgICAgICAgc2VsZi5ub2RlX2dlbiA9IEZhdFRyZWVOb2RlCgogICAgICAgIHBvZHMgPSByYW5n ZSgwLCBrKQogICAgICAgIGVkZ2Vfc3cgPSByYW5nZSgwLCBrLzIpCiAgICAgICAgYWdnX3N3ID0g cmFuZ2Uoay8yLCBrKQogICAgICAgIGhvc3RzID0gcmFuZ2UoMiwgay8yKzIpCiAgICAgICAgCiAg ICAgICAgY29yZSA9IHNlbGYubm9kZV9nZW4oaywgMSwgMSkKICAgICAgICBjb3JlX29wdHMgPSBz ZWxmLmRlZl9vcHRzKGNvcmUubmFtZV9zdHIoKSkKICAgICAgICBzZWxmLmFkZFN3aXRjaChjb3Jl Lm5hbWVfc3RyKCksICoqY29yZV9vcHRzKQoKICAgICAgICBmb3IgcCBpbiBwb2RzOgogICAgICAg ICAgICBmb3IgZSBpbiBlZGdlX3N3OgogICAgICAgICAgICAgICAgZm9yIGggaW4gaG9zdHM6CiAg ICAgICAgICAgICAgICAgICAgaG9zdCA9IHNlbGYubm9kZV9nZW4ocCxlLGgpCiAgICAgICAgICAg ICAgICAgICAgaG9zdF9vcHRzID0gc2VsZi5kZWZfb3B0cyhob3N0Lm5hbWVfc3RyKCkpCiAgICAg ICAgICAgICAgICAgICAgc2VsZi5hZGRIb3N0KGhvc3QubmFtZV9zdHIoKSwgKipob3N0X29wdHMp CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRMaW5rKGhvc3QubmFtZV9zdHIoKSwgY29yZS5u YW1lX3N0cigpKQogICAgICAgIAoKICAgIGRlZiBsYXllcihzZWxmLCBuYW1lKToKICAgICAgICAn JycgUmV0dXJuIHRoZSBsYXllciBvZiBhIG5vZGUgJycnCiAgICAgICAgbm9kZSA9IHNlbGYubm9k ZV9nZW4obmFtZSA9IG5hbWUpCgogICAgICAgIGlmIChub2RlLnBvZCA9PSBzZWxmLmspOgogICAg ICAgICAgICBsYXllciA9IHNlbGYuTEFZRVJfQ09SRQogICAgICAgIGVsc2U6CiAgICAgICAgICAg IGxheWVyID0gc2VsZi5MQVlFUl9IT1NUCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGxheWVyCiAg ICAKICAgIGRlZiBkZWZfb3B0cyhzZWxmLCBuYW1lKToKICAgICAgICAnJycgcmV0dXJuIGRlZmF1 bHQgZGljdCBmb3IgRmF0VHJlZSBub2RlICcnJwogICAgICAgIG5vZGUgPSBzZWxmLm5vZGVfZ2Vu KG5hbWUgPSBuYW1lKQogICAgICAgIAogICAgICAgIGQgPSB7J2xheWVyJzogc2VsZi5sYXllcihu YW1lKX0gCiAgICAgICAgCiAgICAgICAgaWYgZFsnbGF5ZXInXSA9PSBzZWxmLkxBWUVSX0hPU1Q6 CiAgICAgICAgICAgIGQudXBkYXRlKHsnaXAnOiBub2RlLmlwX3N0cigpfSkKICAgICAgICAgICAg ZC51cGRhdGUoeydtYWMnOiBub2RlLm1hY19zdHIoKX0pCiAgICAgICAgZC51cGRhdGUoeydkcGlk JzogIiUwMTZ4IiAlIG5vZGUuZHBpZH0pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGQKCmNsYXNz IEZhdFRyZWVUb3BvKFRvcG8pOiAgICAKICAgIAogICAgTEFZRVJfQ09SRSA9IDAKICAgIExBWUVS X0FHRyAgPSAxCiAgICBMQVlFUl9FREdFID0gMgogICAgTEFZRVJfSE9TVCA9IDMKCiAgICBkZWYg X19pbml0X18oc2VsZiwgayA9IDQpOgogICAgICAgICcnJyBDcmVhdGUgRmF0VHJlZSB0b3BvbG9n eSAKICAgICAgICAgICAgCiAgICAgICAgICAgIGsgOiBOdW1iZXIgb2YgcG9kcyAoY2FuIHN1cHBv cnQgdXB0byBrXjMvNCBob3N0cykKICAgICAgICAnJycKICAgICAgICBzdXBlcihGYXRUcmVlVG9w bywgc2VsZikuX19pbml0X18oKQoKICAgICAgICBzZWxmLmsgPSBrCiAgICAgICAgc2VsZi5ub2Rl X2dlbiA9IEZhdFRyZWVOb2RlCiAgICAgICAgc2VsZi5udW1Qb2RzID0gawogICAgICAgIHNlbGYu YWdnUGVyUG9kID0gayAvIDIKCiAgICAgICAgcG9kcyA9IHJhbmdlKDAsIGspCiAgICAgICAgZWRn ZV9zdyA9IHJhbmdlKDAsIGsvMikKICAgICAgICBhZ2dfc3cgPSByYW5nZShrLzIsIGspCiAgICAg ICAgY29yZV9zdyA9IHJhbmdlKDEsIGsvMisxKQogICAgICAgIGhvc3RzID0gcmFuZ2UoMiwgay8y KzIpCgogICAgICAgIGZvciBwIGluIHBvZHM6CiAgICAgICAgICAgIGZvciBlIGluIGVkZ2Vfc3c6 CiAgICAgICAgICAgICAgICBlZGdlID0gc2VsZi5ub2RlX2dlbihwLCBlLCAxKQogICAgICAgICAg ICAgICAgZWRnZV9vcHRzID0gc2VsZi5kZWZfb3B0cyhlZGdlLm5hbWVfc3RyKCkpCiAgICAgICAg ICAgICAgICBzZWxmLmFkZFN3aXRjaChlZGdlLm5hbWVfc3RyKCksICoqZWRnZV9vcHRzKQoKICAg ICAgICAgICAgICAgIGZvciBoIGluIGhvc3RzOgogICAgICAgICAgICAgICAgICAgIGhvc3QgPSBz ZWxmLm5vZGVfZ2VuKHAsIGUsIGgpCiAgICAgICAgICAgICAgICAgICAgaG9zdF9vcHRzID0gc2Vs Zi5kZWZfb3B0cyhob3N0Lm5hbWVfc3RyKCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRI b3N0KGhvc3QubmFtZV9zdHIoKSwgKipob3N0X29wdHMpCiAgICAgICAgICAgICAgICAgICAgc2Vs Zi5hZGRMaW5rKGVkZ2UubmFtZV9zdHIoKSxob3N0Lm5hbWVfc3RyKCkpCgogICAgICAgICAgICAg ICAgZm9yIGEgaW4gYWdnX3N3OgogICAgICAgICAgICAgICAgICAgIGFnZyA9IHNlbGYubm9kZV9n ZW4ocCwgYSwgMSkKICAgICAgICAgICAgICAgICAgICBhZ2dfb3B0cyA9IHNlbGYuZGVmX29wdHMo YWdnLm5hbWVfc3RyKCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRTd2l0Y2goYWdnLm5h bWVfc3RyKCksICoqYWdnX29wdHMpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRMaW5rKGFn Zy5uYW1lX3N0cigpLGVkZ2UubmFtZV9zdHIoKSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGZv ciBhIGluIGFnZ19zdzoKICAgICAgICAgICAgICAgIGFnZyA9IEZhdFRyZWVOb2RlKHAsIGEsIDEp CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciBjIGluIGNvcmVfc3c6CiAgICAg ICAgICAgICAgICAgICAgY29yZSA9IHNlbGYubm9kZV9nZW4oaywgYS1rLzIrMSwgYykKICAgICAg ICAgICAgICAgICAgICBjb3JlX29wdHMgPSBzZWxmLmRlZl9vcHRzKGNvcmUubmFtZV9zdHIoKSkK ICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZFN3aXRjaChjb3JlLm5hbWVfc3RyKCksICoqY29y ZV9vcHRzKQogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkTGluayhhZ2cubmFtZV9zdHIoKSxj b3JlLm5hbWVfc3RyKCkpCgogICAgZGVmIGxheWVyKHNlbGYsIG5hbWUpOgogICAgICAgICcnJyBS ZXR1cm4gbGF5ZXIgb2Ygbm9kZSAnJycKICAgICAgICBub2RlID0gc2VsZi5ub2RlX2dlbihuYW1l ID0gbmFtZSkKCiAgICAgICAgaWYgKG5vZGUucG9kID09IHNlbGYuayk6CiAgICAgICAgICAgIGxh eWVyID0gc2VsZi5MQVlFUl9DT1JFCiAgICAgICAgZWxpZiAobm9kZS5ob3N0ID09IDEpOgogICAg ICAgICAgICBpZiAobm9kZS5zdyA8IHNlbGYuay8yKToKICAgICAgICAgICAgICAgIGxheWVyID0g c2VsZi5MQVlFUl9FREdFCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsYXllciA9 IHNlbGYuTEFZRVJfQUdHCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGF5ZXIgPSBzZWxmLkxB WUVSX0hPU1QKICAgICAgICAKICAgICAgICByZXR1cm4gbGF5ZXIKICAgCiAgICBkZWYgaXNQb3J0 VXAoc2VsZiwgcG9ydCk6CiAgICAgICAgaWYgcG9ydCA+IChzZWxmLmsvMik6CiAgICAgICAgICAg IHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAg ZGVmIGxheWVyX25vZGVzKHNlbGYsIGxheWVyKToKICAgICAgICAnJycgUmV0dXJuIG5vZGVzIGF0 IHRoZSBnaXZlbiBsYXllciAnJycKICAgICAgICByZXR1cm4gW24gZm9yIG4gaW4gc2VsZi5nLm5v ZGVzKCkgaWYgc2VsZi5sYXllcihuKSA9PSBsYXllcl0KICAgCiAgICBkZWYgdXBwZXJfbm9kZXMo c2VsZiwgbmFtZSk6CiAgICAgICAgJycnIFJldHVybiBub2RlcyBhdCBvbmUgbGF5ZXIgaGlnaGVy KGNsb3NlciB0byBjb3JlKSAnJycKICAgICAgICBsYXllciA9IHNlbGYubGF5ZXIobmFtZSkgLSAx CiAgICAgICAgcmV0dXJuIFtuIGZvciBuIGluIHNlbGYuZ1tuYW1lXSBpZiBzZWxmLmxheWVyKG4p ID09IGxheWVyXQoKICAgIGRlZiBsb3dlcl9ub2RlcyhzZWxmLCBuYW1lKToKICAgICAgICAnJydS ZXR1cm4gZWRnZXMgb25lIGxheWVyIGxvd2VyIChjbG9zZXIgdG8gaG9zdHMpICcnJwogICAgICAg IGxheWVyID0gc2VsZi5sYXllcihuYW1lKSArIDEKICAgICAgICByZXR1cm4gW24gZm9yIG4gaW4g c2VsZi5nW25hbWVdIGlmIHNlbGYubGF5ZXIobikgPT0gbGF5ZXJdCgogICAgZGVmIGRlZl9vcHRz KHNlbGYsIG5hbWUpOgogICAgICAgICcnJyByZXR1cm4gZGVmYXVsdCBkaWN0IGZvciBGYXRUcmVl IG5vZGUgJycnCiAgICAgICAgbm9kZSA9IHNlbGYubm9kZV9nZW4obmFtZSA9IG5hbWUpCiAgICAg ICAgCiAgICAgICAgZCA9IHsnbGF5ZXInOiBzZWxmLmxheWVyKG5hbWUpfQoKICAgICAgICBpZiBk WydsYXllciddID09IHNlbGYuTEFZRVJfSE9TVDoKICAgICAgICAgICAgZC51cGRhdGUoeydpcCc6 IG5vZGUuaXBfc3RyKCl9KQogICAgICAgICAgICBkLnVwZGF0ZSh7J21hYyc6IG5vZGUubWFjX3N0 cigpfSkKICAgICAgICBkLnVwZGF0ZSh7J2RwaWQnOiAiJTAxNngiICUgbm9kZS5kcGlkfSkKCiAg ICAgICAgcmV0dXJuIGQKICAgIAoK --001a113fb330b28d780515a07036 Content-Type: text/x-python; charset=US-ASCII; name="DemandEstimation.py" Content-Disposition: attachment; filename="DemandEstimation.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i9gntsoy2 JycndGhlIGRlbWFuZCBlc3RpbWF0aW9uIGFsZ29yaXRobSBmcm9tIEhlZGVyYSBwYXBlciBpcyBp bXBsZW1lbnRlZCBoZXJlJycnCmltcG9ydCByYW5kb20KI2ltcG9ydCBwZGIKCmRlZiBkZW1hbmRf ZXN0aW1hdGlvbihmbG93cywgaG9zdHNMaXN0KToKICAgIE0gPXt9IAogICAgZm9yIGkgaW4gaG9z dHNMaXN0OgogICAgICAgIE1baV0gPSB7fQogICAgICAgIGZvciBqIGluIGhvc3RzTGlzdDoKICAg ICAgICAgICAgTVtpXVtqXSA9IHsnZGVtYW5kJzogMCwgJ2RlbWFuZEluaXQnOiAwLCAnY29udmVy Z2VkJyA6IEZhbHNlLCAnRmxvd05tYnInIDogMH0KICAKICAgIGZvciBmbG93IGluIGZsb3dzOgog ICAgICAgIE1bZmxvd1snc3JjJ11dW2Zsb3dbJ2RzdCddXVsnRmxvd05tYnInXSArPSAxCiAgICAg CiAgICBwcmludCAnTW91am86ICcsIE0KICAgIGRlbWFuZENoYW5nZSA9IFRydWUKICAgIHdoaWxl IGRlbWFuZENoYW5nZToKICAgICAgIGRlbWFuZENoYW5nZSA9IEZhbHNlICAKICAgICAgIGZvciBz cmMgaW4gaG9zdHNMaXN0OgogICAgICAgICAgICBFc3RfU3JjKE0sIGZsb3dzLCBzcmMpCiAgICAg ICAKICAgICAgIGZvciBkc3QgaW4gaG9zdHNMaXN0OgogICAgICAgICAgICBFc3RfRHN0KE0sIGZs b3dzLCBkc3QpCgogICAgICAgZm9yIGkgaW4gaG9zdHNMaXN0OgogICAgICAgICAgIGZvciBqIGlu IGhvc3RzTGlzdDoKICAgICAgICAgICAgICAgaWYgTVtpXVtqXVsnZGVtYW5kSW5pdCddICE9IE1b aV1bal1bJ2RlbWFuZCddOgogICAgICAgICAgICAgICAgICAgTm9DaGFuZ2UgPSBUcnVlCiAgICAg ICAgICAgICAgICAgICBNW2ldW2pdWydkZW1hbmRJbml0J10gPSBNW2ldW2pdWydkZW1hbmQnXQog ICAgICAgCiAgICBwcmludCIqKioqKioqKioqKioqKioqKioqKmVzdGltYXRlZCBkZW1hbmRzKioq KioqKioqKioqKioqKioqKioqXG4iLCBkZW1hbmRzUHJpbnRpbmcoTSxob3N0c0xpc3QpICAgICAg ICAgICAKICAgIHJldHVybiAoTSwgZmxvd3MpCgpkZWYgRXN0X1NyYyhNLCBmbG93cywgc3JjKToK ICAgIGRGID0gMAogICAgblUgPSAwCiAgICBmb3IgZmxvdyBpbiBmbG93czoKICAgICAgICBpZiBm bG93WydzcmMnXSA9PSBzcmM6CiAgICAgICAgICAgIGlmIGZsb3dbJ2NvbnZlcmdlZCddOgogICAg ICAgICAgICAgICAgZEYgKz0gZmxvd1snZGVtYW5kJ10KICAgICAgICAgICAgZWxzZToKICAgICAg ICAgICAgICAgIG5VICs9IDEKICAgIGlmIG5VICE9IDA6CiAgICAgICAgCiAgICAgICAgZVMgPSAo MS4wIC0gZEYpIC8gblUKICAgICAgICBmb3IgZmxvdyBpbiBmbG93czoKICAgICAgICAgICAgaWYg Zmxvd1snc3JjJ10gPT0gc3JjIGFuZCBub3QgZmxvd1snY29udmVyZ2VkJ106CiAgICAgICAgICAg ICAgICBNW2Zsb3dbJ3NyYyddXVtmbG93Wydkc3QnXV1bJ2RlbWFuZCddID0gZVMKICAgICAgICAg ICAgICAgICNwZGIuc2V0X3RyYWNlKCkgIAogICAgICAgICAgICAgICAgZmxvd1snZGVtYW5kJ10g PSBlUwoKICAgICAgICAgICAgCmRlZiBFc3RfRHN0KE0sIGZsb3dzLCBkc3QpOgogICAgZFQgPSAw CiAgICBkUyA9IDAKICAgIG5SID0gMAogICAgZm9yIGZsb3cgaW4gZmxvd3M6CiAgICAgICAgaWYg Zmxvd1snZHN0J10gPT0gZHN0OgogICAgICAgICAgICBmbG93WydyZWNMaW1pdGVkJ10gPSBUcnVl CiAgICAgICAgICAgIGRUICs9IGZsb3dbJ2RlbWFuZCddCiAgICAgICAgICAgIG5SICs9IDEKICAg IGlmIGRUIDw9IDEuMDoKICAgICAgICByZXR1cm4KICAgIGVTID0gMS4wIC8gblIKCiAgICBmbGFn RmxpcD1UcnVlCiAgICB3aGlsZSBmbGFnRmxpcDoKICAgICAgICBmbGFnRmxpcCA9IEZhbHNlCiAg ICAgICAgblIgPSAwCiAgICAgICAgZm9yIGZsb3cgaW4gZmxvd3M6CiAgICAgICAgICAgIGlmIGZs b3dbJ2RzdCddID09IGRzdCBhbmQgZmxvd1sncmVjTGltaXRlZCddOgogICAgICAgICAgICAgICAg aWYgZmxvd1snZGVtYW5kJ10gPCBlUzoKICAgICAgICAgICAgICAgICAgICBkUyArPSBmbG93Wydk ZW1hbmQnXQogICAgICAgICAgICAgICAgICAgIGZsb3dbJ3JlY0xpbWl0ZWQnXSA9IEZhbHNlCiAg ICAgICAgICAgICAgICAgICAgZmxhZ0ZsaXAgPSBUcnVlCiAgICAgICAgICAgICAgICBlbHNlOgog ICAgICAgICAgICAgICAgICAgIG5SICs9IDEKCiAgICAgICAgZVMgPSAoMS4wLWRTKS9uUgogICAg ICAgICAgICAKICAgIGZvciBmbG93IGluIGZsb3dzOgogICAgICAgIGlmIGZsb3dbJ2RzdCddID09 IGRzdCBhbmQgZmxvd1sncmVjTGltaXRlZCddOgogICAgICAgICAgICBNW2Zsb3dbJ3NyYyddXVtm bG93Wydkc3QnXV1bJ2RlbWFuZCddID0gZVMKICAgICAgICAgICAgTVtmbG93WydzcmMnXV1bZmxv d1snZHN0J11dWydjb252ZXJnZWQnXSA9IFRydWUKICAgICAgICAgICAgZmxvd1snY29udmVyZ2Vk J10gPSBUcnVlCiAgICAgICAgICAgIGZsb3dbJ2RlbWFuZCddID0gZVMKCgpkZWYgZGVtYW5kc1By aW50aW5nKE0saG9zdHNMaXN0KToKICAgIHByaW50IGhvc3RzTGlzdCwgJ1xuJywgJ18nKjgwCiAg ICBmb3Igcm93IGluIGhvc3RzTGlzdDoKICAgICAgICAjcGRiLnNldF90cmFjZSgpIAogICAgICAg IHByaW50IHJvdywnfCcsCiAgICAgICAgZm9yIGNvbCBpbiBob3N0c0xpc3Q6CiAgICAgICAgICAg IHRlbXAgPSBNW3Jvd11bY29sXQogICAgICAgICAgICBwcmludCAnJS4yZicgJSB0ZW1wWydkZW1h bmQnXSwKICAgICAgICBwcmludApkZWYgbWFrZUZsb3dzKGZsb3dzLCBzcmMsIGRzdHMpOgogICAg ZGVtYW5kID0gMC4yIC8gbGVuKGRzdHMpCiAgICBmb3IgZHN0IGluIGRzdHM6CiAgICAgICAgZmxv d3MuYXBwZW5kKHsnY29udmVyZ2VkJzogRmFsc2UsICdkZW1hbmQnOiBkZW1hbmQsICdzcmMnOiBz cmMsICdkc3QnOiBkc3QsICdyZWNMaW1pdGVkJzogRmFsc2V9KQoKCmlmIF9fbmFtZV9fID09ICdf X21haW5fXyc6CiAgICAKICAgIGhvc3RzTGlzdCA9IHJhbmdlKDE1KQogICAgZmxvd3MgPSBbXQoK ICAgIGZvciBpIGluIHJhbmdlKDE1KToKICAgICAgICBkc3QgPSByYW5kb20ucmFuZGludCgwLDE0 KQogICAgICAgIGlmIGRzdCA+IDY6CiAgICAgICAgICAgIG1ha2VGbG93cyhmbG93cywgaSwgW2Rz dCwgZHN0XSkKICAgICAgICBlbHNlOiAKICAgICAgICAgICAgbWFrZUZsb3dzKGZsb3dzLCBpLCBb ZHN0LCBkc3QrMV0pCiAKICAgICNwZGIuc2V0X3RyYWNlKCkKICAgIE0sIGZsb3dzX2VzdGltYXRl ZCA9IGRlbWFuZF9lc3RpbWF0aW9uKGZsb3dzLCBob3N0c0xpc3QpCiAgICBkZW1hbmRzUHJpbnRp bmcoTSxob3N0c0xpc3QpCiAgICAjcGRiLnNldF90cmFjZSgpCiAK --001a113fb330b28d780515a07036 Content-Type: text/x-python; charset=US-ASCII; name="HController.py" Content-Disposition: attachment; filename="HController.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i9gnu0ua3 JycnIEhlZGVyYSBkYXRhIGNlbnRlciBjb250cm9sbGVyCgpAYXV0aG9yOiBCZWhuYW0gTW9udGF6 ZXJpIChiZWhuYW1tQHN0YW5mb3JkLmVkdSkKJycnCgppbXBvcnQgbG9nZ2luZwoKaW1wb3J0IHN5 cwpzeXMucGF0aC5hcHBlbmQoJy9ob21lL2p1bm8vbXNoYXJpZi1oLycpCgpmcm9tIHN0cnVjdCBp bXBvcnQgcGFjawpmcm9tIHpsaWIgaW1wb3J0IGNyYzMyCgpmcm9tIHBveC5jb3JlIGltcG9ydCBj b3JlCmltcG9ydCBwb3gub3BlbmZsb3cubGlib3BlbmZsb3dfMDEgYXMgb2YKZnJvbSBwb3gubGli LnJldmVudCBpbXBvcnQgRXZlbnRNaXhpbgpmcm9tIHBveC5saWIudXRpbCBpbXBvcnQgZHBpZFRv U3RyCgpmcm9tIHBveC5saWIucGFja2V0LmlwdjQgaW1wb3J0IGlwdjQKZnJvbSBwb3gubGliLnBh Y2tldC51ZHAgaW1wb3J0IHVkcApmcm9tIHBveC5saWIucGFja2V0LnRjcCBpbXBvcnQgdGNwCgpm cm9tIHV0aWwgaW1wb3J0IGJ1aWxkVG9wbywgZ2V0Um91dGluZwpmcm9tIERlbWFuZEVzdGltYXRp b24gaW1wb3J0IGRlbWFuZF9lc3RpbWF0aW9uCmZyb20gdGhyZWFkaW5nIGltcG9ydCBUaW1lciwg TG9jawoKbG9nID0gY29yZS5nZXRMb2dnZXIoKQoKIyBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCBm b3IgcGFja2V0X2lucwpNSVNTX1NFTkRfTEVOID0gMjAwMAoKY2xhc3MgU3dpdGNoKEV2ZW50TWl4 aW4pOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IE5v bmUKICAgICAgICBzZWxmLmRwaWQgPSBOb25lCiAgICAgICAgc2VsZi5wb3J0cyA9IE5vbmUKCiAg ICBkZWYgY29ubmVjdChzZWxmLCBjb25uZWN0aW9uKToKICAgICAgICBpZiBzZWxmLmRwaWQgaXMg Tm9uZToKICAgICAgICAgICAgc2VsZi5kcGlkID0gY29ubmVjdGlvbi5kcGlkCiAgICAgICAgYXNz ZXJ0IHNlbGYuZHBpZCA9PSBjb25uZWN0aW9uLmRwaWQKICAgICAgICBzZWxmLmNvbm5lY3Rpb24g PSBjb25uZWN0aW9uCgogICAgZGVmIHNlbmRfcGFja2V0X2RhdGEoc2VsZiwgb3V0cG9ydCwgZGF0 YSA9IE5vbmUpOgogICAgICAgIG1zZyA9IG9mLm9mcF9wYWNrZXRfb3V0KGluX3BvcnQ9b2YuT0ZQ UF9OT05FLCBkYXRhID0gZGF0YSkKICAgICAgICBtc2cuYWN0aW9ucy5hcHBlbmQob2Yub2ZwX2Fj dGlvbl9vdXRwdXQocG9ydCA9IG91dHBvcnQpKQogICAgICAgIHNlbGYuY29ubmVjdGlvbi5zZW5k KG1zZykKCiAgICBkZWYgc2VuZF9wYWNrZXRfYnVmaWQoc2VsZiwgb3V0cG9ydCwgYnVmZmVyX2lk ID0gLTEpOgogICAgICAgIG1zZyA9IG9mLm9mcF9wYWNrZXRfb3V0KGluX3BvcnQ9b2YuT0ZQUF9O T05FKQogICAgICAgIG1zZy5hY3Rpb25zLmFwcGVuZChvZi5vZnBfYWN0aW9uX291dHB1dChwb3J0 ID0gb3V0cG9ydCkpCiAgICAgICAgbXNnLmJ1ZmZlcl9pZCA9IGJ1ZmZlcl9pZAogICAgICAgIHNl bGYuY29ubmVjdGlvbi5zZW5kKG1zZykKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBwb3J0LCBtYXRj aCwgYnVmID0gLTEsIGRlbGV0ZUZsb3c9RmFsc2UsIGlkbGVfdGltZW91dCA9IDAgKToKICAgICAg ICBtc2cgPSBvZi5vZnBfZmxvd19tb2QoKQogICAgICAgIG1zZy5tYXRjaCA9IG1hdGNoCiAgICAg ICAgbXNnLmlkbGVfdGltZW91dCA9IGlkbGVfdGltZW91dAogICAgICAgIG1zZy5hY3Rpb25zLmFw cGVuZChvZi5vZnBfYWN0aW9uX291dHB1dChwb3J0ID0gcG9ydCkpCiAgICAgICAgaWYgZGVsZXRl RmxvdzoKICAgICAgICAgICAgbXNnLmNvbW1hbmQgPSBvZi5PRlBGQ19ERUxFVEUKICAgICAgICAj bXNnLmJ1ZmZlcl9pZCA9IGJ1ZiAgICAgICAgICAKICAgICAgICBtc2cuZmxhZ3MgPSBvZi5PRlBG Rl9TRU5EX0ZMT1dfUkVNCgogICAgICAgIHNlbGYuY29ubmVjdGlvbi5zZW5kKG1zZykKCgpjbGFz cyBIQ29udHJvbGxlcihFdmVudE1peGluKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0LCByLCBi dyk6CiAgICAgICAgc2VsZi5zd2l0Y2hlcyA9IHt9ICAjIFtkcGlkXS0+c3dpdGNoCiAgICAgICAg c2VsZi5tYWNUYWJsZSA9IHt9ICAjIFttYWNdLT4oZHBpZCwgcG9ydCkKICAgICAgICBzZWxmLnQg PSB0ICAgICAgICAgICMgVG9wbyBvYmplY3QKICAgICAgICBzZWxmLnIgPSByICAgICAgICAgICMg Um91dG5nIG9iamVjdAogICAgICAgIHNlbGYuYWxsX3N3aXRjaGVzX3VwID0gRmFsc2UKICAgICAg ICBjb3JlLm9wZW5mbG93LmFkZExpc3RlbmVycyhzZWxmKQogICAgICAgIAogICAgICAgIHNlbGYu c3RhdENudHIgPSAwICNzYW5pdHkgY2hlY2sgZm9yIHRoZSBmbG93IHN0YXRzICAgICAKICAgICAg ICBzZWxmLkhvc3ROYW1lTGlzdCA9IFtdICNhIGRpY3Rpb25hcnkgb2YgdGhlIGhvc3QKICAgICAg ICBzZWxmLmhvc3RzTGlzdCA9IFtdICNsaXN0IG9mIGhvc3QgZHBpZAogICAgICAgIHNlbGYuZmxv d3MgPSBbXSAjbGlzdCBvZiB0aGUgY29sbGVjdGVkIHN0YXRzCiAgICAgICAgc2VsZi5idyA9IGJ3 IAogICAgICAgIHNlbGYuYmVSZXNlcnZhdGlvbiA9IHt9ICNyZXNlcnZhdGlvbiBmb3IgdGhlIGVs ZXBoYW50IGZsb3dzIAogICAgICAgIHNlbGYuc3RhdE1vbml0b3JMb2NrID0gTG9jaygpICN0byBs b2NrIHRoZSBtdWx0aSBhY2Nlc3MgdGhyZWFkcyAKICAgICAgICBzZWxmLnN0YXRNb25pdG9yTG9j ay5hY3F1aXJlKCkKICAgICAgICBzdGF0TW9uaXRvclRpbWVyID0gVGltZXIoMTAuMCxzZWxmLl9j b2xsZWN0Rmxvd1N0YXRzKCkpICN0aW1lciB0byBjb2xsZWN0IHN0YXRzCiAgICAgICAgc3RhdE1v bml0b3JUaW1lci5zdGFydCgpCiAgICAgICAgc2VsZi5tYXRjaERpY3QgPSB7fSAjIGRpY3Rpb2Fu YXJ5IG9mIHRoZSBtYXRjaGVzCiAgICBkZWYgX2VjbXBfaGFzaChzZWxmLCBwYWNrZXQpOgogICAg ICAgICcnJyBSZXR1cm4gYW4gRUNNUC1zdHlsZSA1LXR1cGxlIGhhc2ggZm9yIFRDUC9JUCBwYWNr ZXRzLCBvdGhlcndpc2UgMC4KICAgICAgICBSRkMyOTkyICcnJwogICAgICAgIGhhc2hfaW5wdXQg PSBbMF0gKiA1CiAgICAgICAgaWYgaXNpbnN0YW5jZShwYWNrZXQubmV4dCwgaXB2NCk6CiAgICAg ICAgICAgIGlwID0gcGFja2V0Lm5leHQKICAgICAgICAgICAgaGFzaF9pbnB1dFswXSA9IGlwLnNy Y2lwLnRvVW5zaWduZWQoKQogICAgICAgICAgICBoYXNoX2lucHV0WzFdID0gaXAuZHN0aXAudG9V bnNpZ25lZCgpCiAgICAgICAgICAgIGhhc2hfaW5wdXRbMl0gPSBpcC5wcm90b2NvbAogICAgICAg ICAgICBpZiBpc2luc3RhbmNlKGlwLm5leHQsIHRjcCkgb3IgaXNpbnN0YW5jZShpcC5uZXh0LCB1 ZHApOgogICAgICAgICAgICAgICAgbDQgPSBpcC5uZXh0CiAgICAgICAgICAgICAgICBoYXNoX2lu cHV0WzNdID0gbDQuc3JjcG9ydAogICAgICAgICAgICAgICAgaGFzaF9pbnB1dFs0XSA9IGw0LmRz dHBvcnQKICAgICAgICAgICAgICAgIHJldHVybiBjcmMzMihwYWNrKCdMTEhISCcsICpoYXNoX2lu cHV0KSkKICAgICAgICByZXR1cm4gMAoKCiAgICBkZWYgX2Zsb29kKHNlbGYsIGV2ZW50KToKICAg ICAgICAnJycgQnJvYWRjYXN0IHRvIGV2ZXJ5IG91dHB1dCBwb3J0ICcnJwogICAgICAgIHBhY2tl dCA9IGV2ZW50LnBhcnNlZAogICAgICAgIGRwaWQgPSBldmVudC5kcGlkCiAgICAgICAgaW5fcG9y dCA9IGV2ZW50LnBvcnQKICAgICAgICB0ID0gc2VsZi50CiAgICAgICAgIyBCcm9hZGNhc3QgdG8g ZXZlcnkgb3V0cHV0IHBvcnQgZXhjZXB0IHRoZSBpbnB1dCBvbiB0aGUgaW5wdXQgc3dpdGNoLgog ICAgICAgIGZvciBzd19uYW1lIGluIHQubGF5ZXJfbm9kZXModC5MQVlFUl9FREdFKToKICAgICAg ICAgICAgZm9yIGhvc3RfbmFtZSBpbiB0Lmxvd2VyX25vZGVzKHN3X25hbWUpOgogICAgICAgICAg ICAgICAgc3dfcG9ydCwgaG9zdF9wb3J0ID0gdC5wb3J0KHN3X25hbWUsIGhvc3RfbmFtZSkKICAg ICAgICAgICAgICAgIHN3ID0gdC5ub2RlX2dlbihuYW1lID0gc3dfbmFtZSkuZHBpZAoKICAgICAg ICAgICAgICAgICMgU2VuZCBwYWNrZXQgb3V0IGVhY2ggbm9uLWlucHV0IGhvc3QgcG9ydAogICAg ICAgICAgICAgICAgaWYgc3cgIT0gZHBpZCBvciAoc3cgPT0gZHBpZCBhbmQgaW5fcG9ydCAhPSBz d19wb3J0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLnN3aXRjaGVzW3N3XS5zZW5kX3BhY2tl dF9kYXRhKHN3X3BvcnQsIGV2ZW50LmRhdGEpCgoKICAgIGRlZiBfaW5zdGFsbF9yZWFjdGl2ZV9w YXRoKHNlbGYsIGV2ZW50LCBvdXRfZHBpZCwgZmluYWxfb3V0X3BvcnQsIHBhY2tldCk6CiAgICAg ICAgJycnIEluc3RhbGwgZW50cmllcyBvbiByb3V0ZSBiZXR3ZWVuIHR3byBzd2l0Y2hlcy4gJycn CiAgICAgICAgaW5fbmFtZSA9IHNlbGYudC5ub2RlX2dlbihkcGlkID0gZXZlbnQuZHBpZCkubmFt ZV9zdHIoKQogICAgICAgIG91dF9uYW1lID0gc2VsZi50Lm5vZGVfZ2VuKGRwaWQgPSBvdXRfZHBp ZCkubmFtZV9zdHIoKQogICAgICAgIGhhc2hfID0gc2VsZi5fZWNtcF9oYXNoKHBhY2tldCkKICAg ICAgICByb3V0ZSA9IHNlbGYuci5nZXRfcm91dGUoaW5fbmFtZSwgb3V0X25hbWUsIGhhc2hfKQog ICAgICAgIHByaW50ICJSb3V0ZToiLHJvdXRlICAgICAgICAKICAgICAgICBwcmludCAnLScqODAK ICAgICAgICBpZiByb3V0ZSA9PSBOb25lOgogICAgICAgICAgICBwcmludCBOb25lLCAicm91dGUg YmV0d2VlbiIsIGluX25hbWUsICJhbmQiLCBvdXRfbmFtZQogICAgICAgICAgICByZXR1cm4KCiAg ICAgICAgbWF0Y2ggPSBvZi5vZnBfbWF0Y2guZnJvbV9wYWNrZXQocGFja2V0KQoKICAgICAgICBm b3IgaSwgbm9kZSBpbiBlbnVtZXJhdGUocm91dGUpOgogICAgICAgICAgICBub2RlX2RwaWQgPSBz ZWxmLnQubm9kZV9nZW4obmFtZSA9IG5vZGUpLmRwaWQKICAgICAgICAgICAgaWYgaSA8IGxlbihy b3V0ZSkgLSAxOgogICAgICAgICAgICAgICAgbmV4dF9ub2RlID0gcm91dGVbaSArIDFdCiAgICAg ICAgICAgICAgICBvdXRfcG9ydCwgbmV4dF9pbl9wb3J0ID0gc2VsZi50LnBvcnQobm9kZSwgbmV4 dF9ub2RlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0X3BvcnQgPSBmaW5h bF9vdXRfcG9ydAogICAgICAgICAgICBzZWxmLnN3aXRjaGVzW25vZGVfZHBpZF0uaW5zdGFsbChv dXRfcG9ydCwgbWF0Y2gsIGlkbGVfdGltZW91dCA9IDEwKQoKICAgICAgICBpZiBpc2luc3RhbmNl KHBhY2tldC5uZXh0LCBvZi5pcHY0KSBhbmQgaXNpbnN0YW5jZShwYWNrZXQubmV4dC5uZXh0LCBv Zi50Y3ApOgogICAgICAgICAgICBzZWxmLm1hdGNoRGljdFsocGFja2V0Lm5leHQuc3JjaXAsIHBh Y2tldC5uZXh0LmRzdGlwLCBwYWNrZXQubmV4dC5uZXh0LnNyY3BvcnQsIHBhY2tldC5uZXh0Lm5l eHQuZHN0cG9ydCldID0gKHJvdXRlLCBtYXRjaCkKICAgICAKICAgIGRlZiBfaGFuZGxlX1BhY2tl dEluKHNlbGYsIGV2ZW50KToKICAgICAgICBpZiBub3Qgc2VsZi5hbGxfc3dpdGNoZXNfdXA6CiAg ICAgICAgICAgICNsb2cuaW5mbygiU2F3IFBhY2tldEluIGJlZm9yZSBhbGwgc3dpdGNoZXMgd2Vy ZSB1cCAtIGlnbm9yaW5nLiIgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGFja2V0ID0g ZXZlbnQucGFyc2VkCiAgICAgICAgZHBpZCA9IGV2ZW50LmRwaWQKICAgICAgICBpbl9wb3J0ID0g ZXZlbnQucG9ydAoKICAgICAgICAjIExlYXJuIE1BQyBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb24g ZXZlcnkgcGFja2V0LWluLgogICAgICAgIHNlbGYubWFjVGFibGVbcGFja2V0LnNyY10gPSAoZHBp ZCwgaW5fcG9ydCkKICAgICAgICBzd19uYW1lID0gc2VsZi50Lm5vZGVfZ2VuKGRwaWQgPSBkcGlk KS5uYW1lX3N0cigpCiAgICAgICAgI3ByaW50ICJTdzoiLCBzd19uYW1lLCBwYWNrZXQuc3JjLCBw YWNrZXQuZHN0LCJwb3J0IiwgaW5fcG9ydCwgcGFja2V0LmRzdC5pc011bHRpY2FzdCgpLCJtYWNU YWJsZSIsIHBhY2tldC5kc3QgaW4gc2VsZi5tYWNUYWJsZQogICAgICAgICNwcmludCAnLScqODAK ICAgICAgICAKICAgICAgICAjIEluc2VydCBmbG93LCBkZWxpdmVyIHBhY2tldCBkaXJlY3RseSB0 byBkZXN0aW5hdGlvbi4KCiAgICAgICAgaWYgcGFja2V0LmRzdCBpbiBzZWxmLm1hY1RhYmxlOgog ICAgICAgICAgICBvdXRfZHBpZCwgb3V0X3BvcnQgPSBzZWxmLm1hY1RhYmxlW3BhY2tldC5kc3Rd CiAgICAgICAgICAgIHNlbGYuX2luc3RhbGxfcmVhY3RpdmVfcGF0aChldmVudCwgb3V0X2RwaWQs IG91dF9wb3J0LCBwYWNrZXQpCgogICAgICAgICAgICBzZWxmLnN3aXRjaGVzW291dF9kcGlkXS5z ZW5kX3BhY2tldF9kYXRhKG91dF9wb3J0LCBldmVudC5kYXRhKQoKICAgICAgICBlbHNlOgogICAg ICAgICAgICBzZWxmLl9mbG9vZChldmVudCkKCiAgICBkZWYgX2hhbmRsZV9Db25uZWN0aW9uVXAo c2VsZiwgZXZlbnQpOgogICAgICAgIHN3ID0gc2VsZi5zd2l0Y2hlcy5nZXQoZXZlbnQuZHBpZCkK ICAgICAgICBzd19zdHIgPSBkcGlkVG9TdHIoZXZlbnQuZHBpZCkKICAgICAgICBzd19uYW1lID0g c2VsZi50Lm5vZGVfZ2VuKGRwaWQgPSBldmVudC5kcGlkKS5uYW1lX3N0cigpCgogICAgICAgIGlm IHN3X25hbWUgbm90IGluIHNlbGYudC5zd2l0Y2hlcygpOgogICAgICAgICAgICBsb2cud2Fybigi SWdub3JpbmcgdW5rbm93biBzd2l0Y2ggJXMiICUgc3dfc3RyKQogICAgICAgICAgICByZXR1cm4K CiAgICAgICAgI2xvZy5pbmZvKCJBIG5ldyBzd2l0Y2ggY2FtZSB1cDogJXMiLCBzd19zdHIpCiAg ICAgICAgaWYgc3cgaXMgTm9uZToKICAgICAgICAgICAgbG9nLmluZm8oIkFkZGVkIGEgbmV3IHN3 aXRjaCAlcyIgJSBzd19uYW1lKQogICAgICAgICAgICBzdyA9IFN3aXRjaCgpCiAgICAgICAgICAg IHNlbGYuc3dpdGNoZXNbZXZlbnQuZHBpZF0gPSBzdwogICAgICAgICAgICBzdy5jb25uZWN0KGV2 ZW50LmNvbm5lY3Rpb24pCgogICAgICAgIHN3LmNvbm5lY3Rpb24uc2VuZChvZi5vZnBfc2V0X2Nv bmZpZyhtaXNzX3NlbmRfbGVuPU1JU1NfU0VORF9MRU4pKQoKICAgICAgICBpZiBsZW4oc2VsZi5z d2l0Y2hlcyk9PWxlbihzZWxmLnQuc3dpdGNoZXMoKSk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJB bGwgb2YgdGhlIHN3aXRjaGVzIGFyZSB1cCIpCiAgICAgICAgICAgIHNlbGYuYWxsX3N3aXRjaGVz X3VwID0gVHJ1ZQogICAgICAgICAgICBpZiBzZWxmLnN0YXRNb25pdG9yTG9jay5sb2NrZWQoKToK ICAgICAgICAgICAgICAgIHNlbGYuc3RhdE1vbml0b3JMb2NrLnJlbGVhc2UoKSAgICAKCgogICAg ZGVmIF9jb2xsZWN0Rmxvd1N0YXRzKHNlbGYpOgogICAgICAgIGxvZy5pbmZvKCJhdHRlbXB0IHRv IGNhcHR1cmUgU1RBVFMiKSAKICAgICAgICAnJycgdGhpcyBmdW5jdGlvbiBzZW5kIHRoZSBmbG93 IHN0YXQgcmVxdWVzdHMnJycKICAgICAgICBpZiBub3Qgc2VsZi5zdGF0TW9uaXRvckxvY2subG9j a2VkKCk6CiAgICAgICAgICAgICMgbG9nLmluZm8oImhlcmUgaXQgZ29lcyB0byBtb25pdG9yIGZs b3cgc3RhdHMiKSAKICAgICAgICAgICAgc2VsZi5zdGF0TW9uaXRvckxvY2suYWNxdWlyZSgpCiAg ICAgICAgICAgIHNlbGYuc3RhdENudHIgPSAwCiAgICAgICAgICAgIHNlbGYuZmxvd3MgPSBbXQog ICAgICAgICAgICBzZWxmLkhvc3ROYW1lTGlzdCA9IFtdCiAgICAgICAgICAgIHNlbGYuaG9zdHNM aXN0ID0gW10KICAgICAgICAgICAgZm9yIHN3X25hbWUgaW4gc2VsZi50LmxheWVyX25vZGVzKHNl bGYudC5MQVlFUl9FREdFKToKICAgICAgICAgICAgICAgIHN3X2RwaWQgPSBzZWxmLnQubm9kZV9n ZW4obmFtZSA9IHN3X25hbWUpLmRwaWQKICAgICAgICAgICAgICAgICNwcmludCAnc3dfZHBpZCcs c3dfZHBpZCAsJ3N3X25hbWUnLHN3X25hbWUKICAgICAgICAgICAgICAgIGZvciBwb3J0IGluIHJh bmdlKDEsc2VsZi50LmsgKyAxKToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi50Lmlz UG9ydFVwKHBvcnQpOgogICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBvZi5vZnBfc3RhdHNf cmVxdWVzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgIG1zZy50eXBlID0gb2YuT0ZQU1RfRkxP VwogICAgICAgICAgICAgICAgICAgICAgICBtc2cuYm9keSA9IG9mLm9mcF9mbG93X3N0YXRzX3Jl cXVlc3QoKQogICAgICAgICAgICAgICAgICAgICAgICBtc2cuYm9keS5vdXRfcG9ydCA9IHBvcnQK ICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zd2l0Y2hlc1tzd19kcGlkXS5jb25uZWN0aW9u LnNlbmQobXNnKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRDbnRyICs9IDEKICAg ICAgICAgICAgc2VsZi5zdGF0TW9uaXRvckxvY2sucmVsZWFzZSgpCiAgICAgICAgc3RhdE1vbml0 b3JUaW1lciA9IFRpbWVyKDMuNSwgc2VsZi5fY29sbGVjdEZsb3dTdGF0cykKICAgICAgICBzdGF0 TW9uaXRvclRpbWVyLnN0YXJ0KCkKCgogICAgZGVmIElQMm5hbWVfZHBpZChzZWxmLElQKToKICAg ICAgICBJUCA9IHN0cihJUCkKICAgICAgICB0ZW4sIHAsIGUsIGggPSAoaW50KHMpIGZvciBzIGlu IElQLnNwbGl0KCcuJykpCiAgICAgICAgbm9kZV9uYW1lID0gc2VsZi50Lm5vZGVfZ2VuKHAsZSxo KS5uYW1lX3N0cigpCiAgICAgICAgZHBpZF8gPSAocCA8PCAxNikgKyAoZSA8PCA4KSArIGgKICAg ICAgICByZXR1cm4gKG5vZGVfbmFtZSwgZHBpZF8pCgogICAgZGVmIF9oYW5kbGVfRmxvd1N0YXRz UmVjZWl2ZWQoc2VsZiwgZXZlbnQpOiAKICAgICAgICAnJydoYW5kbGUgZnVuY3Rpb24gZm9yIGNv bGxlY3RlZCBzdGF0cyAnJycKICAgICAgICAjIGxvZy5pbmZvKCAiZmxvdyBzdGF0IGNvbGxlY3Rl ZCwgcHJvY2VzcyBiZWdpbnMiKSAKICAgICAgICAjcHJpbnQgJ2V2ZW50LnN0YXRzJywgZXZlbnQu c3RhdHMKICAgICAgICBzZWxmLnN0YXRDbnRyIC09IDEKICAgICAgICBmb3Igc3RhdCBpbiBldmVu dC5zdGF0czoKICAgICAgICAgICAgZmxvd0xpdmluZ1RpbWUgPSBzdGF0LmR1cmF0aW9uX3NlYyAq IDFlOSArIHN0YXQuZHVyYXRpb25fbnNlYwogICAgICAgICAgICBpZiBmbG93TGl2aW5nVGltZSA8 PSAxOgogICAgICAgICAgICAgICAgZmxvd0xpdmluZ1RpbWUgPSAxCiAgICAgICAgICAgIGZsb3dE ZW1hbmQgPSA4ICogZmxvYXQoc3RhdC5ieXRlX2NvdW50KSAvIGZsb3dMaXZpbmdUaW1lIC8gc2Vs Zi5idwogICAgICAgICAgICAjcHJpbnQgJ3N0YXQubWF0Y2guaW5fcG9ydDonLCBzdGF0Lm1hdGNo LmluX3BvcnQsJ2Zsb3cgYnl0ZV9jb3VudCcsc3RhdC5ieXRlX2NvdW50LCdmbG93TGl2aW5nVGlt ZTonLCBmbG93TGl2aW5nVGltZSwgJ2Zsb3dEZW1hbmQ6JywgZmxvd0RlbWFuZCwgJ3N0YXQubWF0 Y2guc2NySVA6Jywgc3RhdC5tYXRjaC5ud19zcmMsICdzdGF0Lm1hdGNoLmRzdElQJywgc3RhdC5t YXRjaC5ud19kc3QKICAgICAgICAgICAgc3JjX25hbWUsIHNyYyA9IHNlbGYuSVAybmFtZV9kcGlk KHN0YXQubWF0Y2gubndfc3JjKQogICAgICAgICAgICBkc3RfbmFtZSwgZHN0ID0gc2VsZi5JUDJu YW1lX2RwaWQoc3RhdC5tYXRjaC5ud19kc3QpCiAgICAgICAgICAgICNwcmludCAnc3JjX25hbWU6 JyxzcmNfbmFtZSwnZHN0X25hbWU6JywgZHN0X25hbWUsJ3NyY19kcGlkOicsIHNyYywnZHN0X2Rw aWQ6JywgZHN0CiAgICAgICAgICAgICNwcmludCBzdGF0Lm1hdGNoLm53X3NyYywgc3RhdC5tYXRj aC5ud19kc3QsIHN0YXQubWF0Y2gudHBfc3JjLCBzdGF0Lm1hdGNoLnRwX2RzdAogICAgICAgICAg ICBpZiBmbG93RGVtYW5kID4gMC4xOgogICAgICAgICAgICAgICAgaWYgc3JjIG5vdCBpbiBzZWxm Lmhvc3RzTGlzdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RzTGlzdC5hcHBlbmQoc3Jj KQogICAgICAgICAgICAgICAgICAgIHNlbGYuSG9zdE5hbWVMaXN0LmFwcGVuZCh7J25vZGVfbmFt ZSc6c3JjX25hbWUsICdkcGlkJzpzcmN9KQogICAgICAgICAgICAgICAgaWYgZHN0IG5vdCBpbiBz ZWxmLmhvc3RzTGlzdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RzTGlzdC5hcHBlbmQo ZHN0KQogICAgICAgICAgICAgICAgICAgIHNlbGYuSG9zdE5hbWVMaXN0LmFwcGVuZCh7J25vZGVf bmFtZSc6ZHN0X25hbWUsICdkcGlkJzpkc3R9KQogICAgICAgICAgICAgICAgc2VsZi5mbG93cy5h cHBlbmQoeyAnZGVtYW5kJzogZmxvd0RlbWFuZCwgJ2NvbnZlcmdlZCc6RmFsc2UsICdzcmMnOiBz cmMsICdkc3QnOiBkc3QsICdyZWNMaW1pdGVkJzogRmFsc2UsICdtYXRjaCc6IHN0YXQubWF0Y2h9 KQogICAgICAgIGlmIHNlbGYuc3RhdENudHIgPT0gMDoKICAgICAgICAgICAgcHJpbnQgIioqKipm bG93cyBwcm9jZXNzZWQsIEVzdGltYXRpbmcgZGVtYW5kcyBiZWdpbnMiCiAgICAgICAgICAgIHNl bGYuX2RlbWFuZEVzdGltYXRvcigpCgogICAgZGVmIF9kZW1hbmRFc3RpbWF0b3Ioc2VsZik6CiAg ICAgICAgJycnZXN0aW1hdGUgdGhlIGFjdHVhbCBmbG93IGRlbWFuZHMgaGVyZScnJwogICAgICAg IHRlbXAgPSBzZWxmLmZsb3dzCiAgICAgICAgdGVtcCA9IHNvcnRlZCh0ZW1wLCBrZXk9bGFtYmRh IHRlbXA6dGVtcFsnc3JjJ10pCiAgICAgICAgc2VsZi5mbG93cyA9IHRlbXAKICAgICAgICBzZWxm LmJ3UmVzZXJ2YXRpb24gPSB7fQogICAgICAgIE0sIGVzdEZsb3dzID0gZGVtYW5kX2VzdGltYXRp b24oc2VsZi5mbG93cywgc29ydGVkKHNlbGYuaG9zdHNMaXN0KSkKICAgICAgICBmb3IgZmxvdyBp biBlc3RGbG93czoKICAgICAgICAgICAgZGVtYW5kID0gZmxvd1snZGVtYW5kJ10KICAgICAgICAg ICAgaWYgZGVtYW5kID49IDAuMToKICAgICAgICAgICAgICAgIHNlbGYuX0dsb2JhbEZpcnN0Rml0 KGZsb3cpCgoKICAgIGRlZiBfR2xvYmFsRmlyc3RGaXQoc2VsZixmbG93KToKICAgICAgICAnJydk byB0aGUgSGVkZXJhIGdsb2JhbCBmaXJzdCBmaXQgaGVyZScnJwogICAgICAgIHNyY19uYW1lID0g c2VsZi50Lm5vZGVfZ2VuKGRwaWQgPSBmbG93WydzcmMnXSkubmFtZV9zdHIoKQogICAgICAgIGRz dF9uYW1lID0gc2VsZi50Lm5vZGVfZ2VuKGRwaWQgPSBmbG93Wydkc3QnXSkubmFtZV9zdHIoKQog ICAgICAgIHByaW50ICdHbG9iYWwgRmlzcnQgRml0IGZvciB0aGUgZWxlcGhhbnQgZmxvdyBmcm9t ICcsc3JjX25hbWUsJ3RvJywgZHN0X25hbWUKICAgICAgICBwYXRocyA9IHNlbGYuci5yb3V0ZXMo c3JjX25hbWUsZHN0X25hbWUpCiAgICAgICAgcHJpbnQgJ2FsbCByb3V0ZXMgZm91bmQgZm9yIHRo ZSBiaWcgZmxvdzpcbicscGF0aHMKICAgICAgICBHRkZfcm91dGUgPSBOb25lCiAgICAgICAgaWYg cGF0aHMgPT0gTm9uZToKICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOiAgIAogICAgICAg ICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgICAgIGZpdENoZWNrID0gVHJ1ZQogICAgICAg ICAgIAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLGxlbihwYXRoKSk6CiAgICAgICAgICAg ICAgICBmaXRDaGVjayA9IEZhbHNlIAogICAgICAgICAgICAgICAgaWYgc2VsZi5id1Jlc2VydmF0 aW9uLmhhc19rZXkocGF0aFtpLTFdKSBhbmQgc2VsZi5id1Jlc2VydmF0aW9uW3BhdGhbaS0xXV0u aGFzX2tleShwYXRoW2ldKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJ3UmVzZXJ2YXRp b25bcGF0aFtpLTFdXVtwYXRoW2ldXVsncmVzZXJ2ZURlbWFuZCddICsgZmxvd1snZGVtYW5kJ10g PiAxIDoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAKICAgICAgICAgICAgICAgICAg ICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjc2VsZi5id1Jlc2VydmF0aW9uW3BhdGhb aS0xXV1bcGF0aFtpXV1bJ3Jlc2VydmVEZW1hbmQnXSArPSBmbG93WydkZW1hbmQnXQogICAgICAg ICAgICAgICAgICAgICAgICBmaXRDaGVjayA9IFRydWUgIAogICAgICAgICAgICAgICAgZWxzZToK ICAgICAgICAgICAgICAgICAgICBzZWxmLmJ3UmVzZXJ2YXRpb25bcGF0aFtpLTFdXT17fQogICAg ICAgICAgICAgICAgICAgIHNlbGYuYndSZXNlcnZhdGlvbltwYXRoW2ktMV1dW3BhdGhbaV1dPXsn cmVzZXJ2ZURlbWFuZCc6MH0KICAgICAgICAgICAgICAgICAgICBmaXRDaGVjayA9IFRydWUKICAg ICAgICAgICAgaWYgZml0Q2hlY2sgPT0gVHJ1ZToKICAgICAgICAgICAgICAgIGZvciBpIGluIHJh bmdlKDEsbGVuKHBhdGgpKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmJ3UmVzZXJ2YXRpb25b cGF0aFtpLTFdXVtwYXRoW2ldXVsncmVzZXJ2ZURlbWFuZCddICs9IGZsb3dbJ2RlbWFuZCddCiAg ICAgICAgICAgICAgICBHRkZfcm91dGUgPSBwYXRoCiAgICAgICAgICAgICAgICBwcmludCAiR0ZG IHJvdXRlIGZvdW5kOiIsIHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgR0ZG X3JvdXRlICE9IE5vbmU6CiAgICAgICAgICAgICIiImluc3RhbGwgbmV3IEdGRl9wYXRoIGJldHdl ZW4gc291cmNlIGFuZCBkZXN0aW50YWlvbiIiIgogICAgICAgICAgICBzZWxmLiBfaW5zdGFsbF9H RkZfcGF0aChHRkZfcm91dGUsZmxvd1snbWF0Y2gnXSkgICAgIAoKCiAgICBkZWYgX2luc3RhbGxf R0ZGX3BhdGgoc2VsZixHRkZfcm91dGUsIG1hdGNoKToKICAgICAgICAnJydpbnN0YWxsaW5nIHRo ZSBnbG9iYWwgZmlyc3QgZml0IHBhdGggaGVyZScnJwogICAgICAgIGZsb3dfbWF0Y2ggPSBtYXRj aAogICAgICAgIF9yb3V0ZSwgbWF0Y2ggPSBzZWxmLm1hdGNoRGljdFttYXRjaC5ud19zcmMsIG1h dGNoLm53X2RzdCwgbWF0Y2gudHBfc3JjLCBtYXRjaC50cF9kc3RdCiAgICAgICAgaWYgX3JvdXRl ICE9IEdGRl9yb3V0ZVsxOi0xXSBhbmQgbm90IHNlbGYuc3RhdE1vbml0b3JMb2NrLmxvY2tlZCgp OgogICAgICAgICAgICBwcmludCAib2xkIHJvdXRlIiwgX3JvdXRlCiAgICAgICAgICAgIHByaW50 ICJtYXRjaCBpbmZvOiIsIG1hdGNoLm53X3NyYywgbWF0Y2gubndfZHN0LCBtYXRjaC50cF9zcmMs IG1hdGNoLnRwX2RzdAogICAgICAgICAgICBzZWxmLnN0YXRNb25pdG9yTG9jay5hY3F1aXJlKCkK ICAgICAgICAgICAgJycnIEluc3RhbGwgZW50cmllcyBvbiByb3V0ZSBiZXR3ZWVuIHR3byBzd2l0 Y2hlcy4gJycnCiAgICAgICAgICAgIHJvdXRlID0gR0ZGX3JvdXRlWzE6LTFdCiAgICAgICAgICAg IHByaW50IkdGRiByb3V0ZSB0byBiZSBpbnN0YWxsZWQgYmV0d2VlbiBzd2l0Y2hlczoiLCByb3V0 ZQoKICAgICAgICAgICAgZm9yIGksIG5vZGUgaW4gZW51bWVyYXRlKHJvdXRlKToKICAgICAgICAg ICAgICAgIG5vZGVfZHBpZCA9IHNlbGYudC5ub2RlX2dlbihuYW1lID0gbm9kZSkuZHBpZAogICAg ICAgICAgICAgICAgaWYgaSA8IGxlbihyb3V0ZSkgLSAxOgogICAgICAgICAgICAgICAgICAgIG5l eHRfbm9kZSA9IHJvdXRlW2kgKyAxXQogICAgICAgICAgICAgICAgICAgIG91dF9wb3J0LCBuZXh0 X2luX3BvcnQgPSBzZWxmLnQucG9ydChub2RlLCBuZXh0X25vZGUpCiAgICAgICAgICAgICAgICBl bHNlOgogICAgICAgICAgICAgICAgICAgIGRwaWRfb3V0LCBvdXRfcG9ydCA9IHNlbGYubWFjVGFi bGVbbWF0Y2guZGxfZHN0XQogICAgICAgICAgICAgICAgICAgICNwcmludCAnb3V0X2RwaWQnLCBk cGlkX291dCxzZWxmLnQubm9kZV9nZW4obmFtZSA9IEdGRl9yb3V0ZVstMV0pLmRwaWQKICAgICAg ICAgICAgICAgICAgICAjcHJpbnQgJ291dFBvcnQnLCBvdXRfcG9ydAogICAgICAgICAgICAgICAg c2VsZi5zd2l0Y2hlc1tub2RlX2RwaWRdLmluc3RhbGwob3V0X3BvcnQsIG1hdGNoLGlkbGVfdGlt ZW91dCA9IDEwKQoKICAgICAgICAgICAgc2VsZi5zdGF0TW9uaXRvckxvY2sucmVsZWFzZSgpICAg IAogICAgICAgICAgICBzZWxmLm1hdGNoRGljdFtmbG93X21hdGNoLm53X3NyYywgZmxvd19tYXRj aC5ud19kc3QsIGZsb3dfbWF0Y2gudHBfc3JjLCBmbG93X21hdGNoLnRwX2RzdF0gPSAocm91dGUs IG1hdGNoKQogICAgICAgIHByaW50ICdfJyoyMAogICAKCgpkZWYgbGF1bmNoKHRvcG8gPSBOb25l LCByb3V0aW5nID0gTm9uZSwgYncgPSBOb25lICk6CiAgICAjcHJpbnQgdG9wbwogICAgaWYgbm90 IHRvcG86CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uICgiUGxlYXNlIHNwZWNpZnkgdGhlIHRvcG9s b2d5IikKICAgIGVsc2U6IAogICAgICAgIHQgPSBidWlsZFRvcG8odG9wbykKCiAgICByID0gZ2V0 Um91dGluZyhyb3V0aW5nLCB0KQogICAgaWYgYncgPT0gTm9uZToKICAgICAgICBidyA9IDEwLjAg I01iL3MKICAgICAgICBidyA9IGZsb2F0KGJ3LzEwMDApICNHYi9zCiAgICBlbHNlOgogICAgICAg IGJ3ID0gZmxvYXQoYncpLzEwMDAKICAgIGNvcmUucmVnaXN0ZXJOZXcoSENvbnRyb2xsZXIsIHQs IHIsIGJ3KQogICAgbG9nLmluZm8oIioqIEhDb250cm9sbGVyIGlzIHJ1bm5pbmciKQogCg== --001a113fb330b28d780515a07036 Content-Type: text/x-python; charset=US-ASCII; name="util.py" Content-Disposition: attachment; filename="util.py" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i9gnualc4 IyB1dGlsaXR5IGZ1bmN0aW9ucwoKZnJvbSBEQ1RvcG8gaW1wb3J0IEZhdFRyZWVUb3BvCmZyb20g bWluaW5ldC51dGlsIGltcG9ydCBtYWtlTnVtZXJpYwpmcm9tIERDUm91dGluZyBpbXBvcnQgSGFz aGVkUm91dGluZywgUm91dGluZwoKVE9QT1MgPSB7J2Z0JzogRmF0VHJlZVRvcG99ClJPVVRJTkcg PSB7J0VDTVAnIDogSGFzaGVkUm91dGluZ30KCgpkZWYgYnVpbGRUb3BvKHRvcG8pOgogICAgdG9w b19uYW1lLCB0b3BvX3BhcmFtID0gdG9wby5zcGxpdCggJywnICkKICAgIHJldHVybiBUT1BPU1t0 b3BvX25hbWVdKG1ha2VOdW1lcmljKHRvcG9fcGFyYW0pKQoKCmRlZiBnZXRSb3V0aW5nKHJvdXRp bmcsIHRvcG8pOgogICAgcmV0dXJuIFJPVVRJTkdbcm91dGluZ10odG9wbykK --001a113fb330b28d780515a07036--