Advertisement
TP2K1

Shell Mod By TP2k1

Aug 30th, 2015
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 100.65 KB | None | 0 0
  1. PD9waHAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgICAgICAgICAgICAgICAgICAgV2UgQXJlIE5vTkFtZV9UZWFtCSAgICAgICAgICAgKnwKfCogICAgICAgICAgICAgICAgICAgIEVkaXQgJiBEZXZlbG9wIGJ5IFRQMmsxICAgICAgICAgICAgICAgICAgICp8CnwqICAJICAgICBodHRwOi8vdHJ1bmdraWVuLnZpZXRhdS52bi8gICAgCSAgICAgICAgICAgKnwKfCogICAgICAgICAgICAgICAgICAgPT0gIEhhY2tpbmcgJiBTZWN1cml0eSAgPT0gICAgICAgICAgICAgICAgICp8ClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKZXJyb3JfcmVwb3J0aW5nKDcpOwpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwpvYl9zdGFydCgpOwokbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOwokc3RhcnR0aW1lID0gJG10aW1lWzFdICsgJG10aW1lWzBdOwpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOwovL2RlZmluZSgnSVNfV0lOJywgc3Ryc3RyKFBIUF9PUywgJ1dJTicpID8gMSA6IDAgKTsKZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOwpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOwpkZWZpbmUoJ0lTX0dQQycsIGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpOwokZGlzX2Z1bmMgPSBnZXRfY2ZnX3ZhcignZGlzYWJsZV9mdW5jdGlvbnMnKTsKZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOwpAc2V0X3RpbWVfbGltaXQoMCk7Cgpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsKCWZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7CgkJaWYgKCRfa2V5ezB9ICE9ICdfJykgewoJCQlpZiAoSVNfR1BDKSB7CgkJCQkkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsKCQkJfQoJCQkkJF9rZXkgPSAkX3ZhbHVlOwoJCX0KCX0KfQoKLyo9PT09PT09PT09PT09PT09PSAgSW5mbyBMb2dpbiAgPT09PT09PT09PT09PT09PSovCiRhZG1pbiA9IGFycmF5KCk7CiRhZG1pblsnY2hlY2snXSA9IHRydWU7CiRhZG1pblsncGFzcyddICA9ICdub25hbWUnOyAvLyBuaD9wIHBhc3MgCiRhZG1pblsnY29va2llcHJlJ10gPSAnJzsKJGFkbWluWydjb29raWVkb21haW4nXSA9ICcnOwokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsKJGFkbWluWydjb29raWVsaWZlJ10gPSA4NjQwMDsKLyo9PT09PT09PT09PT09PT09PT09PT0gRW5kID09PT09PT09PT09PT09PT09PT09PSovCgppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7CgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7Cn0gZWxzZWlmICgkY2hhcnNldCA9PSAnYmlnNScpIHsKCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOwp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsKCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2JrIik7Cn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgewoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7Cn0KCiRzZWxmID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gPyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA6ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwokdGltZXN0YW1wID0gdGltZSgpOwoKLyo9PT09PT09PT09PT09PT09PT09PT0gTG9naW4gPT09PT09PT09PT09PT09PT09PT09Ki8KaWYgKCRhY3Rpb24gPT0gImxvZ291dCIpIHsKCXNjb29raWUoJ3ZiYXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsKCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7VVJMPScuJHNlbGYuJyI+Jyk7CglwKCc8Ym9keSBiYWNrZ3JvdW5kPWJsYWNrPicpOwoJZXhpdDsKfQppZigkYWRtaW5bJ2NoZWNrJ10pIHsKCWlmICgkZG9pbmcgPT0gJ2xvZ2luJykgewoJCWlmICgkYWRtaW5bJ3Bhc3MnXSA9PSAkcGFzc3dvcmQpIHsKCQkJc2Nvb2tpZSgndmJhcGFzcycsICRwYXNzd29yZCk7CgovLyBGdW5jdGlvbiBtYWlsIFNlbmRlciB0byBteSBFbWFpbCAtIFBsZWFzZSByZW1vdmUgdGhpcyBiZWZvcmUgeW91IHVzaW5nIHRoaXMgc2hlbGwgY29kZSwgVGhhbmtzIC0gRmVybmFuZG8gLSBWQkFUZWFtCiR0aW1lX3NoZWxsID0gIiIuZGF0ZSgiZC9tL1kgLSBIOmk6cyIpLiIiOwokaXBfcmVtb3RlID0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl07CiRmcm9tX3NoZWxsY29kZSA9ICdzaGVsbEAnLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLicnOwokdG9fZW1haWwgPSAnYmlsbC5waGFtNjlAZ21haWwuY29tJzsKJHNlcnZlcl9tYWlsID0gIiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIiAgLSAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjsKJGxpbmtjciA9ICJMaW5rOiAiLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiIiLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLiIgLSBJUCBFeGN1dGluZzogJGlwX3JlbW90ZSAtIFRpbWU6ICR0aW1lX3NoZWxsIjsKJGhlYWRlciA9ICJGcm9tOiAkZnJvbV9zaGVsbGNvZGVcclxuUmVwbHktdG86ICRmcm9tX3NoZWxsY29kZSI7CkBtYWlsKCR0b19lbWFpbCwgJHNlcnZlcl9tYWlsLCAkbGlua2NyLCAkaGVhZGVyKTsKCQkJcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMjtVUkw9Jy4kc2VsZi4nIj4nKTsKCQkJcCgnPGJvZHkgYmdjb2xvcj1ibGFjaz4KPEJSPjxCUj48ZGl2IGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj15ZWxsb3cgZmFjZT10YWhvbWEgc2l6ZT0yPkJZRyAtIFRoZSBMZWdlbmQgb2YgVmlldG5hbWVzZSBIYWNrZXIgV29ybGQgIC0gUGxlYXNlIHdhaXQuLi48QlI+PGltZyBzcmM9aHR0cDovL3QzLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NSRklReTlvTGM5ak1XbURZX05fc3hqV1B5dXNVV0M0aWd3SzJscUJtNjhhREdjU2ZLUFBBPjwvZGl2PicpOwoJCQlleGl0OwoJCX0KCgllbHNlCgl7CgkkZXJyX21lc3MgPSAnPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZCBiZ2NvbG9yPSMwRTBFMEUgd2lkdGg9MTAwJSBoZWlnaHQ9MjQ+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGZhY2U9dGFob21hIHNpemU9Mj48Ymxpbms+UGFzc3dvcmQgaW5jb3JyZWN0LCBQbGVhc2UgdHJ5IGFnYWluISEhPC9ibGluaz48QlI+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7CmVjaG8gJGVycl9tZXNzOwoJfX0KCWlmICgkX0NPT0tJRVsndmJhcGFzcyddKSB7CgkJaWYgKCRfQ09PS0lFWyd2YmFwYXNzJ10gIT0gJGFkbWluWydwYXNzJ10pIHsKCQkJbG9naW5wYWdlKCk7CgkJfQoJfSBlbHNlIHsKCQlsb2dpbnBhZ2UoKTsKCX0KfQovKj09PT09PT09PT09PT09PT09PT09PSBMb2dpbiA9PT09PT09PT09PT09PT09PT09PT0qLwoKJGVycm1zZyA9ICcnOwoKaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7CglpZiAoSVNfUEhQSU5GTykgewoJCXBocGluZm8oKTsKCX0gZWxzZSB7CgkJJGVycm1zZyA9ICdwaHBpbmZvKCkgZnVuY3Rpb24gaGFzIG5vbi1wZXJtaXNzaWJsZSc7Cgl9Cn0KCgppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsKCWlmICghQGZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgewoJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7Cgl9IGVsc2UgewoJCSRmaWxlaW5mbyA9IHBhdGhpbmZvKCR0aGVmaWxlKTsKCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOwoJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOwoJCWhlYWRlcignQ29udGVudC1MZW5ndGg6ICcuZmlsZXNpemUoJHRoZWZpbGUpKTsKCQlAcmVhZGZpbGUoJHRoZWZpbGUpOwoJCWV4aXQ7Cgl9Cn0KCgppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7CglkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOwoJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOwoJJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7CglpZiAoISRyZXN1bHQpIHAoJzxoMj4nLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7CgkkZmlsZW5hbWUgPSBiYXNlbmFtZSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10uJ19NeVNRTC5zcWwnKTsKCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7CgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVuYW1lKTsKCSRteXNxbGRhdGEgPSAnJzsKCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsKCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgewoJCQkkbXlzcWxkYXRhIC49IHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdKTsKCQl9Cgl9CglteXNxbF9jbG9zZSgpOwoJZXhpdDsKfQoKLy8gTXlzcWwKaWYoJGRvaW5nPT0nbXlzcWxkb3duJyl7CglpZiAoISRkYm5hbWUpIHsKCQkkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOwoJfSBlbHNlIHsKCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOwoJCWlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgewoJCQkkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOwoJCX0gZWxzZSB7CgkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsKCQkJaWYoISRyZXN1bHQpewoJCQkJcSgiRFJPUCBUQUJMRSBJRiBFWElTVFMgdG1wX2FuZ2VsOyIpOwoJCQkJcSgiQ1JFQVRFIFRBQkxFIHRtcF9hbmdlbCAoY29udGVudCBMT05HQkxPQiBOT1QgTlVMTCk7Iik7CgkJCQkvL0Rvd25sb2FkIFNRTAoJCQkJcSgiTE9BRCBEQVRBIExPQ0FMIElORklMRSAnIi5hZGRzbGFzaGVzKCRteXNxbGRsZmlsZSkuIicgSU5UTyBUQUJMRSB0bXBfYW5nZWwgRklFTERTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJyBFU0NBUEVEIEJZICcnIExJTkVTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJzsiKTsKCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOwoJCQkJcSgiRFJPUCBUQUJMRSB0bXBfYW5nZWwiKTsKCQkJfQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOwoJCQlpZiAoISRyb3cpIHsKCQkJCSRlcnJtc2cgPSAnTG9hZCBmaWxlIGZhaWxlZCAnLm15c3FsX2Vycm9yKCk7CgkJCX0gZWxzZSB7CgkJCQkkZmlsZWluZm8gPSBwYXRoaW5mbygkbXlzcWxkbGZpbGUpOwoJCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJy4kZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsKCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOwoJCQkJaGVhZGVyKCJBY2NlcHQtTGVuZ3RoOiAiLnN0cmxlbigkcm93WzBdKSk7CgkJCQllY2hvICRyb3dbMF07CgkJCQlleGl0OwoJCQl9CgkJfQoJfQp9Cgo/Pgo8aHRtbD4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPHRpdGxlPjw/cGhwIGVjaG8gc3RyX3JlcGxhY2UoJy4nLCcnLCdOTlQgLSBOb05hbWVfVGVhbScpOz8+PC90aXRsZT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSx0ZHtmb250OiAxMHB0IFRhaG9tYTtjb2xvcjpncmF5O2xpbmUtaGVpZ2h0OiAxNnB4O30KCmEge2NvbG9yOiAjNzRBMjAyO3RleHQtZGVjb3JhdGlvbjpub25lO30KYTpob3Zlcntjb2xvcjogI2YwMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojZjlmOWY5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb2N1cyB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5mb3V0IHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30KLmhlYWQgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzIwMjAyMDtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7Zm9udC13ZWlnaHQ6Ym9sZDt9Ci5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30KLmhlYWQgdGQgc3Bhbntmb250LXdlaWdodDpub3JtYWw7fQpmb3Jte21hcmdpbjowO3BhZGRpbmc6MDt9Cmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQp1bC5pbmZvIGxpe21hcmdpbjowO2NvbG9yOiM0NDQ7bGluZS1oZWlnaHQ6MjRweDtoZWlnaHQ6MjRweDt9CnV7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiM3Nzc7ZmxvYXQ6bGVmdDtkaXNwbGF5OmJsb2NrO3dpZHRoOjE1MHB4O21hcmdpbi1yaWdodDoxMHB4O30KaW5wdXQsIHRleHRhcmVhLCBidXR0b24KewoJZm9udC1zaXplOiA5cHQ7Cgljb2xvcjogI2NjYzsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjNzRBMjAyOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOwp9CnNlbGVjdAp7Cglmb250LXNpemU6IDhwdDsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7Cgljb2xvcjogI2NjYzsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKfQoKPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBDaGVja0FsbChmb3JtKSB7Cglmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgewoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsKCQlpZiAoZS5uYW1lICE9ICdjaGthbGwnKQoJCWUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7CiAgICB9Cn0KZnVuY3Rpb24gJChpZCkgewoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKfQpmdW5jdGlvbiBnb2FjdGlvbihhY3QpewoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0OwoJJCgnZ29hY3Rpb24nKS5zdWJtaXQoKTsKfQo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbkxvYWQ9ImluaXQoKSIgc3R5bGU9Im1hcmdpbjowO3RhYmxlLWxheW91dDpmaXhlZDsgd29yZC1icmVhazpicmVhay1hbGwiIGJnY29sb3I9YmxhY2sgYmFja2dyb3VuZD1odHRwOi8vaTM4Mi5waG90b2J1Y2tldC5jb20vYWxidW1zL29vMjYzL3ZuaGFja2VyL2JnLTEuanBnPgoKCjxkaXYgYm9yZGVyPSIwIiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDI1cHg7IHotaW5kZXg6IDE7IHRvcDogMzAwcHg7IGxlZnQ6IDA7IiBpZD0ibG9hZGluZyIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJjZW50ZXIiPgoJCQkJPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjExMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzAwMzMwMCI+CgkJCQkJPHRyPgoJCQkJCQk8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPWNlbnRlcj4KCQkJCSA8ZGl2IGJvcmRlcj0iMSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMwRTBFMEU7IGZpbHRlcjogYWxwaGEob3BhY2l0eT03MCk7IG9wYWNpdHk6IC43OyB3aWR0aDogMTEwcHg7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiIGJvcmRlcmNvbG9yPSIjMDA2NjAwIiAgYWxpZ249ImNlbnRlciI+CgkJCQkgICBMb2FkaW5nPGltZyBzcmM9Imh0dHA6Ly9pMzgyLnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvb28yNjMvdm5oYWNrZXIvbG9hZGluZy5naWYiPgoJCQkJICA8L2Rpdj4KCQkJCTwvdGQ+CgkJCQkJPC90cj4KCQkJCTwvdGFibGU+CgkJCSA8L2Rpdj4KIDxzY3JpcHQ+CiB2YXIgbGQ9KGRvY3VtZW50LmFsbCk7CiAgdmFyIG5zND1kb2N1bWVudC5sYXllcnM7CiB2YXIgbnM2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkJiYhZG9jdW1lbnQuYWxsOwogdmFyIGllND1kb2N1bWVudC5hbGw7CiAgaWYgKG5zNCkKIAlsZD1kb2N1bWVudC5sb2FkaW5nOwogZWxzZSBpZiAobnM2KQogCWxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGU7CiBlbHNlIGlmIChpZTQpCiAJbGQ9ZG9jdW1lbnQuYWxsLmxvYWRpbmcuc3R5bGU7CiAgZnVuY3Rpb24gaW5pdCgpCiB7CiBpZihuczQpe2xkLnZpc2liaWxpdHk9ImhpZGRlbiI7fQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOwogfQogPC9zY3JpcHQ+CgoKCgo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCTx0ciBjbGFzcz0iaGVhZF9zbWFsbCI+CgkJPHRkICB3aWR0aD0xMDAlPgoJCTx0YWJsZSB3aWR0aD0xMDAlPjx0ciBjbGFzcz0iaGVhZF9zbWFsbCI+PHRkICB3aWR0aD04NnB4PjxhIHRpdGxlPSJOTlQgLSBOb05hbWVfVGVhbSIgaHJlZj0iPD9waHAgJHNlbGY7Pz4iPjxpbWcgc3JjPWh0dHBzOi8vc2NvbnRlbnQtY2RnMi0xLnh4LmZiY2RuLm5ldC9ocGhvdG9zLXh0cDEvdi90MS4wLTkvMTE5MjMyNjZfMTYzOTE5OTkwMjk5MDMyNl80OTkzNDc5ODUwMDU1NjAwMzA4X24uanBnP29oPTYyYTBjODE2MTc0ZTc0ZmViMDdmM2I2OGI5MWU0M2I1Jm9lPTU2NjA5MkU1IGhlaWdodD04NiBib3JkZXI9MD48L2E+PC90ZD48dGQ+CgkJPHNwYW4gc3R5bGU9ImZsb2F0OmxlZnQ7Ij4gPD9waHAgZWNobyAiSG9zdG5hbWU6ICIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiIiOz8+ICB8IDxhIGhyZWY9Imh0dHA6Ly90cnVuZ2tpZW4udmlldGF1LnZuLyIgdGFyZ2V0PSJfYmxhbmsiPjw/cGhwIGVjaG8gc3RyX3JlcGxhY2UoJy4nLCcnLCdOTlQgLSBXZSBBcmUgTm9OYW1lX1RlYW0nKTs/PiA8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignbG9nb3V0Jyk7Ij48Zm9udCBjb2xvcj1yZWQ+TG9nb3V0PC9mb250PjwvYT48L3NwYW4+IDxiciAvPgoKCQk8P3BocAoJCSRjdXJsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7CgkJJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOwoJCSRtc3NxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKTsKCQkkcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7CgkJJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7CgplY2hvICgoJHNhZmVfbW9kZSk/KCJTYWZlX21vZDogPGI+PGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICIpOigiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsKZWNobyAiUEhQIHZlcnNpb246IDxiPiIuQHBocHZlcnNpb24oKS4iPC9iPiAtICI7CgkJZWNobyAiY1VSTDogIi4oKCRjdXJsX29uKT8oIjxiPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiKTooIjxiPjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsKCQllY2hvICJNeVNRTDogPGI+IjsKJG15c3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpOwppZigkbXlzcWxfb24pewplY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsgfSBlbHNlIHsgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsgfQplY2hvICJNU1NRTDogPGI+IjsKJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOwppZigkbXNzcWxfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7fQplY2hvICJQb3N0Z3JlU1FMOiA8Yj4iOwokcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7CmlmKCRwZ19vbil7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjt9CmVjaG8gIk9yYWNsZTogPGI+IjsKJG9yYV9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk7CmlmKCRvcmFfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPjxCUj4iO30KCmVjaG8gIkRpc2FibGUgZnVuY3Rpb25zIDogPGI+IjsKaWYoJyc9PSgkZGY9QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5OT05FPC9mb250PjwvYj48QlI+Ijt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+JGRmPC9mb250PjwvYj48QlI+Ijt9CgplY2hvICI8Zm9udCBjb2xvcj13aGl0ZT5VbmFtZSAtYTwvZm9udD46ICIuQHN1YnN0cihAcGhwX3VuYW1lKCksMCwxMjApLiI8YnI+IjsKZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+U2VydmVyPC9mb250PjogIi5Ac3Vic3RyKCRTRVJWRVJfU09GVFdBUkUsMCwxMjApLiIgLSA8Zm9udCBjb2xvcj13aGl0ZT5pZDwvZm9udD46ICIuQGdldG15dWlkKCkuIigiLkBnZXRfY3VycmVudF91c2VyKCkuIikgLSB1aWQ9Ii5AZ2V0bXl1aWQoKS4iICgiLkBnZXRfY3VycmVudF91c2VyKCkuIikgZ2lkPSIuQGdldG15Z2lkKCkuIigiLkBnZXRfY3VycmVudF91c2VyKCkuIik8YnI+IjsKCQk/PgoJCTwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+Cgk8L3RyPgoJPHRyIGNsYXNzPSJhbHQxIj4KCQk8dGQgIHdpZHRoPTEwJT48c3BhbiBzdHlsZT0iZmxvYXQ6bGVmdDsiPltTZXJ2ZXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiI8L2ZvbnQ+Ijs/PiAtIFlvdXIgSVA6IDw/cGhwIGVjaG8gIjxmb250IGNvbG9yPXllbGxvdz4iLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiI8L2ZvbnQ+Ijs/Pl0gPC9zcGFuPiAgIDxiciAvPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxiciAvPgoJCQkKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZmlsZScpOyI+RmlsZSBNYW5hZ2VyPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGFkbWluJyk7Ij5NeVNRTCBNYW5hZ2VyPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGZpbGUnKTsiPk15U1FMIFVwbG9hZCAmYW1wOyBEb3dubG9hZDwvYT4gfAoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzaGVsbCcpOyI+RXhlY3V0ZSBDb21tYW5kPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3BocGVudicpOyI+UEhQIFZhcmlhYmxlPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPkV2YWwgUEhQIENvZGU8L2E+CgkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdicnV0ZScpOyI+QnJ1dGU8L2E+IDw/cGhwIH0/PgoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXRjcHdkJyk7Ij4vZXRjL3Bhc3N3ZDwvYT4gPD9waHAgfT8+CgkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdiYWNrY29ubmVjdCcpOyI+QmFjayBDb25uZWN0PC9hPjw/cGhwIH0/PgoJCTwvdGQ+Cgk8L3RyPgo8L3RhYmxlPgo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjE1IiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD4KPD9waHAKCmZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2dvYWN0aW9uJykpOwptYWtlaGlkZSgnYWN0aW9uJyk7CmZvcm1mb290KCk7CgokZXJybXNnICYmIG0oJGVycm1zZyk7CgovLyBEaXIgZnVuY3Rpb24KISRkaXIgJiYgJGRpciA9ICcuJzsKJG5vd3BhdGggPSBnZXRQYXRoKFNBX1JPT1QsICRkaXIpOwppZiAoc3Vic3RyKCRkaXIsIC0xKSAhPSAnLycpIHsKCSRkaXIgPSAkZGlyLicvJzsKfQokdWVkaXIgPSB1ZSgkZGlyKTsKCmlmICghJGFjdGlvbiB8fCAkYWN0aW9uID09ICdmaWxlJykgewoKCS8vIE5vbi13cml0ZWFibGUKCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsKCgkvLyBEZWxldGUgZGlyCglpZiAoJGRvaW5nID09ICdkZWxkaXInICYmICR0aGVmaWxlKSB7CgkJaWYgKCFmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsKCQkJbSgkdGhlZmlsZS4nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCW0oJ0RpcmVjdG9yeSBkZWxldGUgJy4oZGVsdHJlZSgkdGhlZmlsZSkgPyBiYXNlbmFtZSgkdGhlZmlsZSkuJyBzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIENyZWF0ZSBuZXcgZGlyCgllbHNlaWYgKCRuZXdkaXJuYW1lKSB7CgkJJG1rZGlycyA9ICRub3dwYXRoLiRuZXdkaXJuYW1lOwoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgewoJCQltKCdEaXJlY3RvcnkgaGFzIGFscmVhZHkgZXhpc3RlZCcpOwoJCX0gZWxzZSB7CgkJCW0oJ0RpcmVjdG9yeSBjcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQkJQGNobW9kKCRta2RpcnMsMDc3Nyk7CgkJfQoJfQoKCS8vIFVwbG9hZCBmaWxlCgllbHNlaWYgKCRkb3VwZmlsZSkgewoJCW0oJ0ZpbGUgdXBsb2FkICcuKEBjb3B5KCRfRklMRVNbJ3VwbG9hZGZpbGUnXVsndG1wX25hbWUnXSwkdXBsb2FkZGlyLicvJy4kX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ25hbWUnXSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJfQoKCS8vIEVkaXQgZmlsZQoJZWxzZWlmICgkZWRpdGZpbGVuYW1lICYmICRmaWxlY29udGVudCkgewoJCSRmcCA9IEBmb3BlbigkZWRpdGZpbGVuYW1lLCd3Jyk7CgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCUBmY2xvc2UoJGZwKTsKCX0KCgkvLyBNb2RpZnkKCWVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7CgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7CgkJCW0oJ1RoZSBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7CgkJCW0oJ01vZGlmeSBmaWxlIGF0dHJpYnV0ZXMgJy4oQGNobW9kKCRwZmlsZSwkbmV3cGVybSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBSZW5hbWUKCWVsc2VpZiAoJG9sZG5hbWUgJiYgJG5ld2ZpbGVuYW1lKSB7CgkJJG5uYW1lID0gJG5vd3BhdGguJG5ld2ZpbGVuYW1lOwoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsKCQkJbSgkbm5hbWUuJyBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gQ29wdQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgewoJCWlmIChmaWxlX2V4aXN0cygkdG9maWxlKSB8fCAhZmlsZV9leGlzdHMoJHNuYW1lKSkgewoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCW0oYmFzZW5hbWUoJHRvZmlsZSkuJyBjb3BpZWQgJy4oQGNvcHkoJHNuYW1lLCR0b2ZpbGUpID8gYmFzZW5hbWUoJHRvZmlsZSkuJyBzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIEZpbGUgZXhpdAoJZWxzZWlmICgkY3VyZmlsZSAmJiAkdGFyZmlsZSkgewoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgewoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7CgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBEYXRlCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgewoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSkgewoJCQltKGJhc2VuYW1lKCRjdXJmaWxlKS4nIGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOwoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gRG93bmxvYWQKCWVsc2VpZigkZG9pbmcgPT0gJ2Rvd25yYXInKSB7CgkJaWYgKCRkbCkgewoJCQkkZGZpbGVzPScnOwoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgewoJCQkJJGRmaWxlcy49JGZpbGVwYXRoLicsJzsKCQkJfQoJCQkkZGZpbGVzPXN1YnN0cigkZGZpbGVzLDAsc3RybGVuKCRkZmlsZXMpLTEpOwoJCQkkZGw9ZXhwbG9kZSgnLCcsJGRmaWxlcyk7CgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOwoJCQkkY29kZT0kemlwLT5vdXQ7CgkJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsKCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOwoJCQloZWFkZXIoJ0FjY2VwdC1MZW5ndGg6ICcuc3RybGVuKCRjb2RlKSk7CgkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDtmaWxlbmFtZT0nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX0ZpbGVzLnRhci5neicpOwoJCQllY2hvICRjb2RlOwoJCQlleGl0OwoJCX0gZWxzZSB7CgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOwoJCX0KCX0KCgkvLyBEZWxldGUgZmlsZQoJZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7CgkJaWYgKCRkbCkgewoJCQkkZGZpbGVzPScnOwoJCQkkc3VjYyA9ICRmYWlsID0gMDsKCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsKCQkJCWlmIChAdW5saW5rKCRmaWxlcGF0aCkpIHsKCQkJCQkkc3VjYysrOwoJCQkJfSBlbHNlIHsKCQkJCQkkZmFpbCsrOwoJCQkJfQoJCQl9CgkJCW0oJ0RlbGV0ZWQgZmlsZSBoYXZlIGZpbmlzaGVkPz9jaG9vc2UgJy5jb3VudCgkZGwpLicgc3VjY2VzcyAnLiRzdWNjLicgZmFpbCAnLiRmYWlsKTsKCQl9IGVsc2UgewoJCQltKCdQbGVhc2Ugc2VsZWN0IGZpbGUocyknKTsKCQl9Cgl9CgoJLy8gRnVuY3Rpb24gTmV3ZGlyCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidjcmVhdGVkaXInKSk7CgltYWtlaGlkZSgnbmV3ZGlybmFtZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJZm9ybWZvb3QoKTsKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2ZpbGVwZXJtJykpOwoJbWFrZWhpZGUoJ25ld3Blcm0nKTsKCW1ha2VoaWRlKCdwZmlsZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJZm9ybWZvb3QoKTsKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NvcHlmaWxlJykpOwoJbWFrZWhpZGUoJ3NuYW1lJyk7CgltYWtlaGlkZSgndG9maWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVuYW1lJykpOwoJbWFrZWhpZGUoJ29sZG5hbWUnKTsKCW1ha2VoaWRlKCduZXdmaWxlbmFtZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJZm9ybWZvb3QoKTsKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2ZpbGVvcGZvcm0nKSk7CgltYWtlaGlkZSgnYWN0aW9uJyk7CgltYWtlaGlkZSgnb3BmaWxlJyk7CgltYWtlaGlkZSgnZGlyJyk7Cglmb3JtZm9vdCgpOwoKCSRmcmVlID0gQGRpc2tfZnJlZV9zcGFjZSgkbm93cGF0aCk7CgkhJGZyZWUgJiYgJGZyZWUgPSAwOwoJJGFsbCA9IEBkaXNrX3RvdGFsX3NwYWNlKCRub3dwYXRoKTsKCSEkYWxsICYmICRhbGwgPSAwOwoJJHVzZWQgPSAkYWxsLSRmcmVlOwoJJHVzZWRfcGVyY2VudCA9IEByb3VuZCgxMDAvKCRhbGwvJGZyZWUpLDIpOwoJcCgnPGZvbnQgY29sb3I9eWVsbG93IGZhY2U9dGFob21hIHNpemU9Mj48Qj5GaWxlIE1hbmFnZXI8L2I+IDwvZm9udD4gQ3VycmVudCBkaXNrIGZyZWUgPGZvbnQgY29sb3I9cmVkPicuc2l6ZWNvdW50KCRmcmVlKS4nPC9mb250PiBvZiA8Zm9udCBjb2xvcj1yZWQ+Jy5zaXplY291bnQoJGFsbCkuJzwvZm9udD4gKDxmb250IGNvbG9yPXJlZD4nLiR1c2VkX3BlcmNlbnQuJzwvZm9udD4lKTwvZm9udD4nKTsKCj8+Cjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJtYXJnaW46MTBweCAwOyI+CiAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgaWQ9ImdvZGlyIiBuYW1lPSJnb2RpciI+CiAgPHRyPgogICAgPHRkIG5vd3JhcD5DdXJyZW50IERpcmVjdG9yeSAoPD9waHAgZWNobyAkZGlyX3dyaXRlYWJsZTs/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7Pz4pPC90ZD4KCTx0ZCB3aWR0aD0iMTAwJSI+PGlucHV0IG5hbWU9InZpZXdfd3JpdGFibGUiIHZhbHVlPSIwIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0iZGlyIiB2YWx1ZT0iPD9waHAgZWNobyAkbm93cGF0aDs/PiIgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOjEwMCU7bWFyZ2luOjAgOHB4OyI+PC90ZD4KICAgIDx0ZCBub3dyYXA+PGlucHV0IGNsYXNzPSJidCIgdmFsdWU9IkdPIiB0eXBlPSJzdWJtaXQiPjwvdGQ+CiAgPC90cj4KICA8L2Zvcm0+CjwvdGFibGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gY3JlYXRlZGlyKCl7Cgl2YXIgbmV3ZGlybmFtZTsKCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZGlyZWN0b3J5IG5hbWU6JywgJycpOwoJaWYgKCFuZXdkaXJuYW1lKSByZXR1cm47CgkkKCdjcmVhdGVkaXInKS5uZXdkaXJuYW1lLnZhbHVlPW5ld2Rpcm5hbWU7CgkkKCdjcmVhdGVkaXInKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBmaWxlcGVybShwZmlsZSl7Cgl2YXIgbmV3cGVybTsKCW5ld3Blcm0gPSBwcm9tcHQoJ0N1cnJlbnQgZmlsZTonK3BmaWxlKydcblBsZWFzZSBpbnB1dCBuZXcgYXR0cmlidXRlOicsICcnKTsKCWlmICghbmV3cGVybSkgcmV0dXJuOwoJJCgnZmlsZXBlcm0nKS5uZXdwZXJtLnZhbHVlPW5ld3Blcm07CgkkKCdmaWxlcGVybScpLnBmaWxlLnZhbHVlPXBmaWxlOwoJJCgnZmlsZXBlcm0nKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBjb3B5ZmlsZShzbmFtZSl7Cgl2YXIgdG9maWxlOwoJdG9maWxlID0gcHJvbXB0KCdPcmlnaW5hbCBmaWxlOicrc25hbWUrJ1xuUGxlYXNlIGlucHV0IG9iamVjdCBmaWxlIChmdWxscGF0aCk6JywgJycpOwoJaWYgKCF0b2ZpbGUpIHJldHVybjsKCSQoJ2NvcHlmaWxlJykudG9maWxlLnZhbHVlPXRvZmlsZTsKCSQoJ2NvcHlmaWxlJykuc25hbWUudmFsdWU9c25hbWU7CgkkKCdjb3B5ZmlsZScpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIHJlbmFtZShvbGRuYW1lKXsKCXZhciBuZXdmaWxlbmFtZTsKCW5ld2ZpbGVuYW1lID0gcHJvbXB0KCdGb3JtZXIgZmlsZSBuYW1lOicrb2xkbmFtZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGZpbGVuYW1lOicsICcnKTsKCWlmICghbmV3ZmlsZW5hbWUpIHJldHVybjsKCSQoJ3JlbmFtZScpLm5ld2ZpbGVuYW1lLnZhbHVlPW5ld2ZpbGVuYW1lOwoJJCgncmVuYW1lJykub2xkbmFtZS52YWx1ZT1vbGRuYW1lOwoJJCgncmVuYW1lJykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gZG9maWxlKGRvaW5nLHRoZWZpbGUsbSl7CglpZiAobSAmJiAhY29uZmlybShtKSkgewoJCXJldHVybjsKCX0KCSQoJ2ZpbGVsaXN0JykuZG9pbmcudmFsdWU9ZG9pbmc7CglpZiAodGhlZmlsZSl7CgkJJCgnZmlsZWxpc3QnKS50aGVmaWxlLnZhbHVlPXRoZWZpbGU7Cgl9CgkkKCdmaWxlbGlzdCcpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIGNyZWF0ZWZpbGUobm93cGF0aCl7Cgl2YXIgZmlsZW5hbWU7CglmaWxlbmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBmaWxlIG5hbWU6JywgJycpOwoJaWYgKCFmaWxlbmFtZSkgcmV0dXJuOwoJb3BmaWxlKCdlZGl0ZmlsZScsbm93cGF0aCArIGZpbGVuYW1lLG5vd3BhdGgpOwp9CmZ1bmN0aW9uIG9wZmlsZShhY3Rpb24sb3BmaWxlLGRpcil7CgkkKCdmaWxlb3Bmb3JtJykuYWN0aW9uLnZhbHVlPWFjdGlvbjsKCSQoJ2ZpbGVvcGZvcm0nKS5vcGZpbGUudmFsdWU9b3BmaWxlOwoJJCgnZmlsZW9wZm9ybScpLmRpci52YWx1ZT1kaXI7CgkkKCdmaWxlb3Bmb3JtJykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gZ29kaXIoZGlyLHZpZXdfd3JpdGFibGUpewoJaWYgKHZpZXdfd3JpdGFibGUpIHsKCQkkKCdnb2RpcicpLnZpZXdfd3JpdGFibGUudmFsdWU9MTsKCX0KCSQoJ2dvZGlyJykuZGlyLnZhbHVlPWRpcjsKCSQoJ2dvZGlyJykuc3VibWl0KCk7Cn0KPC9zY3JpcHQ+CiAgPD9waHAKCXRiaGVhZCgpOwoJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PHRyIGNsYXNzPSJhbHQxIj48dGQgY29sc3Bhbj0iNyIgc3R5bGU9InBhZGRpbmc6NXB4OyI+Jyk7CglwKCc8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHZhbHVlPSIiIHR5cGU9ImZpbGUiIC8+IDxpbnB1dCBjbGFzcz0iIiBuYW1lPSJkb3VwZmlsZSIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0IiAvPjxpbnB1dCBuYW1lPSJ1cGxvYWRkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjwvZGl2PicpOwoJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nXCcpOyI+V2ViUm9vdDwvYT4nKTsKCWlmICgkdmlld193cml0YWJsZSkgewoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyk7Ij5WaWV3IEFsbDwvYT4nKTsKCX0gZWxzZSB7CgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7Cgl9CglwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWRpcigpOyI+Q3JlYXRlIERpcmVjdG9yeTwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZWZpbGUoXCcnLiRub3dwYXRoLidcJyk7Ij5DcmVhdGUgRmlsZTwvYT4nKTsKCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7CgkJJG9iaiA9IG5ldyBDT00oJ3NjcmlwdGluZy5maWxlc3lzdGVtb2JqZWN0Jyk7CgkJaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7CgkJCSREcml2ZVR5cGVEQiA9IGFycmF5KDAgPT4gJ1Vua25vdycsMSA9PiAnUmVtb3ZhYmxlJywyID0+ICdGaXhlZCcsMyA9PiAnTmV0d29yaycsNCA9PiAnQ0RSb20nLDUgPT4gJ1JBTSBEaXNrJyk7CgkJCWZvcmVhY2goJG9iai0+RHJpdmVzIGFzICRkcml2ZSkgewoJCQkJaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsKCQkJCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iU2l6ZTonLnNpemVjb3VudCgkZHJpdmUtPlRvdGFsU2l6ZSkuJyYjMTM7RnJlZTonLnNpemVjb3VudCgkZHJpdmUtPkZyZWVTcGFjZSkuJyYjMTM7VHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7CgkJCQl9IGVsc2UgewoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsKCQkJCX0KCQkJfQoJCX0KCX0KCglwKCc8L3RkPjwvdHI+PC9mb3JtPicpOwoKCXAoJzx0ciBjbGFzcz0iaGVhZCI+PHRkPiZuYnNwOzwvdGQ+PHRkPkZpbGVuYW1lPC90ZD48dGQgd2lkdGg9IjE2JSI+TGFzdCBtb2RpZmllZDwvdGQ+PHRkIHdpZHRoPSIxMCUiPlNpemU8L3RkPjx0ZCB3aWR0aD0iMjAlIj5DaG1vZCAvIFBlcm1zPC90ZD48dGQgd2lkdGg9IjIyJSI+QWN0aW9uPC90ZD48L3RyPicpOwoKCS8vIEdldCBwYXRoCgkkZGlyZGF0YT1hcnJheSgpOwoJJGZpbGVkYXRhPWFycmF5KCk7CgoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7CgkJJGRpcmRhdGEgPSBHZXRMaXN0KCRub3dwYXRoKTsKCX0gZWxzZSB7CgkJLy8gT3BlbiBkaXIKCQkkZGlycz1Ab3BlbmRpcigkZGlyKTsKCQl3aGlsZSAoJGZpbGU9QHJlYWRkaXIoJGRpcnMpKSB7CgkJCSRmaWxlcGF0aD0kbm93cGF0aC4kZmlsZTsKCQkJaWYoQGlzX2RpcigkZmlsZXBhdGgpKXsKCQkJCSRkaXJkYlsnZmlsZW5hbWUnXT0kZmlsZTsKCQkJCSRkaXJkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsKCQkJCSRkaXJkYlsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZmlsZXBhdGgpOwoJCQkJJGRpcmRiWydkaXJwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsKCQkJCSRkaXJkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOwoJCQkJJGRpcmRiWydkaXJsaW5rJ109JG5vd3BhdGg7CgkJCQkkZGlyZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOwoJCQkJJGRpcmRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7CgkJCQkkZGlyZGF0YVtdPSRkaXJkYjsKCQkJfSBlbHNlIHsKCQkJCSRmaWxlZGJbJ2ZpbGVuYW1lJ109JGZpbGU7CgkJCQkkZmlsZWRiWydzaXplJ109c2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsKCQkJCSRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7CgkJCQkkZmlsZWRiWydmaWxlY2htb2QnXT1nZXRDaG1vZCgkZmlsZXBhdGgpOwoJCQkJJGZpbGVkYlsnZmlsZXBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOwoJCQkJJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOwoJCQkJJGZpbGVkYlsnZGlybGluayddPSRub3dwYXRoOwoJCQkJJGZpbGVkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7CgkJCQkkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7CgkJCQkkZmlsZWRhdGFbXT0kZmlsZWRiOwoJCQl9CgkJfS8vIHdoaWxlCgkJdW5zZXQoJGRpcmRiKTsKCQl1bnNldCgkZmlsZWRiKTsKCQlAY2xvc2VkaXIoJGRpcnMpOwoJfQoJQHNvcnQoJGRpcmRhdGEpOwoJQHNvcnQoJGZpbGVkYXRhKTsKCSRkaXJfaSA9ICcwJzsKCWZvcmVhY2goJGRpcmRhdGEgYXMgJGtleSA9PiAkZGlyZGIpewoJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgewoJCQkkdGhpc2JnID0gYmcoKTsKCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsKCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxmb250IGZhY2U9IndpbmdkaW5ncyIgc2l6ZT0iMyI+MDwvZm9udD48L3RkPicpOwoJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZmlsZW5hbWUnXS4nPC9hPjwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+LS08L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcnBlcm0nXS4nPC9hPicuJGRpcmRiWydmaWxlb3duZXInXS4nPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGRpclwnLFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnQXJlIHlvdSBzdXJlIHdpbGwgZGVsZXRlICcuJGRpcmRiWydmaWxlbmFtZSddLic/IFxcblxcbklmIG5vbi1lbXB0eSBkaXJlY3RvcnksIHdpbGwgYmUgZGVsZXRlIGFsbCB0aGUgZmlsZXMuXCcpIj5EZWw8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPjwvdGQ+Jyk7CgkJCXAoJzwvdHI+Jyk7CgkJCSRkaXJfaSsrOwoJCX0gZWxzZSB7CgkJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgewoJCQkJcCgnPHRyIGNsYXNzPWZvdXQ+Jyk7CgkJCQlwKCc8dGQgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iV2luZ2RpbmdzIDMiIHNpemU9ND49PC9mb250PjwvdGQ+PHRkIG5vd3JhcCBjb2xzcGFuPSI1Ij48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy5nZXRVcFBhdGgoJG5vd3BhdGgpLidcJyk7Ij5QYXJlbnQgRGlyZWN0b3J5PC9hPjwvdGQ+Jyk7CgkJCQlwKCc8L3RyPicpOwoJCQl9CgkJfQoJfQoKCXAoJzx0ciBiZ2NvbG9yPSJncmVlbiIgc3RseWU9ImJvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTsiPjx0ZCBjb2xzcGFuPSI2IiBoZWlnaHQ9IjUiPjwvdGQ+PC90cj4nKTsKCXAoJzxmb3JtIGlkPSJmaWxlbGlzdCIgbmFtZT0iZmlsZWxpc3QiIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9InBvc3QiPicpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsKCW1ha2VoaWRlKCd0aGVmaWxlJyk7CgltYWtlaGlkZSgnZG9pbmcnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCSRmaWxlX2kgPSAnMCc7Cglmb3JlYWNoKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpewoJCWlmKCRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7CgkJCSRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwnJywkZmlsZWRiWydzZXJ2ZXJfbGluayddKTsKCQkJJHRoaXNiZyA9IGJnKCk7CgkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkbFsnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ10iPjwvdGQ+Jyk7CgkJCXAoJzx0ZD48YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRmaWxlZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnbXRpbWUnXS4nPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ3NpemUnXS4nPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlY2htb2QnXS4nPC9hPiAvICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVwZXJtJ10uJzwvYT4nLiRmaWxlZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25maWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkRvd248L2E+IHwgJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkNvcHk8L2E+IHwgJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnZWRpdGZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+RWRpdDwvYT4gfCAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCduZXd0aW1lXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPlRpbWU8L2E+Jyk7CgkJCXAoJzwvdGQ+PC90cj4nKTsKCQkJJGZpbGVfaSsrOwoJCX0KCX0KCXAoJzx0ciBjbGFzcz0iZm91dDEiPjx0ZCBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+PHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bnJhclwnKTsiPlBhY2tpbmcgZG93bmxvYWQgc2VsZWN0ZWQ8L2E+IC0gPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxmaWxlc1wnKTsiPkRlbGV0ZSBzZWxlY3RlZDwvYT48L3RkPjx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0icmlnaHQiPicuJGRpcl9pLicgZGlyZWN0b3JpZXMgLyAnLiRmaWxlX2kuJyBmaWxlczwvdGQ+PC90cj4nKTsKCXAoJzwvZm9ybT48L3RhYmxlPicpOwp9Ly8gZW5kIGRpcgoKZWxzZWlmICgkYWN0aW9uID09ICdzcWxmaWxlJykgewoJaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsKCQkkZmlsZSA9ICRfRklMRVNbJ3VwbG9hZGZpbGUnXTsKCQkkZmlsZW5hbWUgPSAkZmlsZVsndG1wX25hbWUnXTsKCQlpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgewoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsKCQl9IGVsc2UgewoJCQlpZighJGZpbGVuYW1lKSB7CgkJCQltKCdQbGVhc2UgY2hvb3NlIGEgZmlsZScpOwoJCQl9IGVsc2UgewoJCQkJJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsKCQkJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsKCQkJCUBmY2xvc2UoJGZwKTsKCQkJCSRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsKCQkJCWlmKCEkdXBuYW1lKSAkdXBuYW1lID0gJGZpbGVbJ25hbWUnXTsKCQkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOwoJCQkJbSgkcmVzdWx0ID8gJ1VwbG9hZCBzdWNjZXNzJyA6ICdVcGxvYWQgaGFzIGZhaWxlZDogJy5teXNxbF9lcnJvcigpKTsKCQkJfQoJCX0KCX0KPz4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBteXNxbGZpbGUoZG9pbmcpewoJaWYoIWRvaW5nKSByZXR1cm47CgkkKCdkb2luZycpLnZhbHVlPWRvaW5nOwoJJCgnbXlzcWxmaWxlJykuZGJob3N0LnZhbHVlPSQoJ2RiaW5mbycpLmRiaG9zdC52YWx1ZTsKCSQoJ215c3FsZmlsZScpLmRicG9ydC52YWx1ZT0kKCdkYmluZm8nKS5kYnBvcnQudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5kYnVzZXIudmFsdWU9JCgnZGJpbmZvJykuZGJ1c2VyLnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuZGJwYXNzLnZhbHVlPSQoJ2RiaW5mbycpLmRicGFzcy52YWx1ZTsKCSQoJ215c3FsZmlsZScpLmRibmFtZS52YWx1ZT0kKCdkYmluZm8nKS5kYm5hbWUudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5jaGFyc2V0LnZhbHVlPSQoJ2RiaW5mbycpLmNoYXJzZXQudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5zdWJtaXQoKTsKfQo8L3NjcmlwdD4KPD9waHAKCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsKCSEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7CgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOwoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgSW5mb3JtYXRpb24nLCduYW1lJz0+J2RiaW5mbycpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7CglwKCc8cD4nKTsKCXAoJ0RCSG9zdDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOwoJcCgnOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsKCXAoJ0RCVXNlcjonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOwoJcCgnREJQYXNzOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7CglwKCdEQk5hbWU6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJuYW1lJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYm5hbWUpKTsKCXAoJ0RCQ2hhcnNldDonKTsKCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3QoKTsKCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im15c3FsZmlsZSIgaWQ9Im15c3FsZmlsZSI+Jyk7CglwKCc8aDI+VXBsb2FkIGZpbGU8L2gyPicpOwoJcCgnPHA+PGI+VGhpcyBvcGVyYXRpb24gdGhlIERCIHVzZXIgbXVzdCBoYXMgRklMRSBwcml2aWxlZ2U8L2I+PC9wPicpOwoJcCgnPHA+U2F2ZSBwYXRoKGZ1bGxwYXRoKTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ic2F2ZXBhdGgiIHNpemU9IjQ1IiB0eXBlPSJ0ZXh0IiAvPiBDaG9vc2UgYSBmaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB0eXBlPSJmaWxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsdXBsb2FkXCcpOyI+VXBsb2FkPC9hPjwvcD4nKTsKCXAoJzxoMj5Eb3dubG9hZCBmaWxlPC9oMj4nKTsKCXAoJzxwPkZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9Im15c3FsZGxmaWxlIiBzaXplPSIxMTUiIHR5cGU9InRleHQiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWxkb3duXCcpOyI+RG93bmxvYWQ8L2E+PC9wPicpOwoJbWFrZWhpZGUoJ2RiaG9zdCcpOwoJbWFrZWhpZGUoJ2RicG9ydCcpOwoJbWFrZWhpZGUoJ2RidXNlcicpOwoJbWFrZWhpZGUoJ2RicGFzcycpOwoJbWFrZWhpZGUoJ2RibmFtZScpOwoJbWFrZWhpZGUoJ2NoYXJzZXQnKTsKCW1ha2VoaWRlKCdkb2luZycpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsKCXAoJzwvZm9ybT4nKTsKfQoKZWxzZWlmICgkYWN0aW9uID09ICdzcWxhZG1pbicpIHsKCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsKCSEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7CgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOwoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsKCWlmKGlzc2V0KCRkYmhvc3QpKXsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJob3N0XCIgbmFtZT1cImRiaG9zdFwiIHZhbHVlPVwiJGRiaG9zdFwiIC8+XG4iOwoJfQoJaWYoaXNzZXQoJGRidXNlcikpIHsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJ1c2VyXCIgbmFtZT1cImRidXNlclwiIHZhbHVlPVwiJGRidXNlclwiIC8+XG4iOwoJfQoJaWYoaXNzZXQoJGRicGFzcykpIHsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwYXNzXCIgbmFtZT1cImRicGFzc1wiIHZhbHVlPVwiJGRicGFzc1wiIC8+XG4iOwoJfQoJaWYoaXNzZXQoJGRicG9ydCkpIHsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwb3J0XCIgbmFtZT1cImRicG9ydFwiIHZhbHVlPVwiJGRicG9ydFwiIC8+XG4iOwoJfQoJaWYoaXNzZXQoJGRibmFtZSkpIHsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJuYW1lXCIgbmFtZT1cImRibmFtZVwiIHZhbHVlPVwiJGRibmFtZVwiIC8+XG4iOwoJfQoJaWYoaXNzZXQoJGNoYXJzZXQpKSB7CgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImNoYXJzZXRcIiBuYW1lPVwiY2hhcnNldFwiIHZhbHVlPVwiJGNoYXJzZXRcIiAvPlxuIjsKCX0KCglpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsKCQlpZiAoISR0YWJsZSkgewoJCQltKCdQbGVhc2UgY2hvb3NlIHRoZSB0YWJsZScpOwoJCX0gZWxzZSB7CgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCQkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7CgkJCSRmcCA9IEBmb3BlbigkcGF0aCwndycpOwoJCQlpZiAoJGZwKSB7CgkJCQkkcmVzdWx0ID0gcSgnU0hPVyB0YWJsZXMnKTsKCQkJCWlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsKCQkJCSRteXNxbGRhdGEgPSAnJzsKCQkJCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsKCQkJCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgewoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsKCQkJCQl9CgkJCQl9CgkJCQlmY2xvc2UoJGZwKTsKCQkJCSRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwnJywkcGF0aCk7CgkJCQltKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOwoJCQkJbXlzcWxfY2xvc2UoKTsKCQkJfSBlbHNlIHsKCQkJCW0oJ0JhY2t1cCBmYWlsZWQnKTsKCQkJfQoJCX0KCX0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsKCQkka2V5c3RyID0gJHZhbHN0ciA9ICR0bXAgPSAnJzsKCQlmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7CgkJCWlmICgkdmFsKSB7CgkJCQkka2V5c3RyIC49ICR0bXAuJGtleTsKCQkJCSR2YWxzdHIgLj0gJHRtcC4iJyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7CgkJCQkkdG1wID0gJywnOwoJCQl9CgkJfQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsKCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJCW0ocSgiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSAoJGtleXN0cikgVkFMVUVTICgkdmFsc3RyKSIpID8gJ0luc2VydCBuZXcgcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7CgkJfQoJfQoJaWYgKCR1cGRhdGUgJiYgJGluc2VydHNxbCAmJiAkYmFzZTY0KSB7CgkJJHZhbHN0ciA9ICR0bXAgPSAnJzsKCQlmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7CgkJCSR2YWxzdHIgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7CgkJCSR0bXAgPSAnLCc7CgkJfQoJCWlmICgkdmFsc3RyKSB7CgkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7CgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCQltKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOwoJCX0KCX0KCWlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgewoJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7CgkJJGRlbGV0ZV9zcWwgPSAiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiOwoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOwoJCW0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsKCX0KCglpZiAoJHRhYmxlbmFtZSAmJiAkZG9pbmcgPT0gJ2Ryb3AnKSB7CgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJaWYgKHEoIkRST1AgVEFCTEUgJHRhYmxlbmFtZSIpKSB7CgkJCW0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOwoJCQkkdGFibGVuYW1lID0gJyc7CgkJfSBlbHNlIHsKCQkJbShteXNxbF9lcnJvcigpKTsKCQl9Cgl9CgoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7CgoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIE1hbmFnZXInKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCXAoJzxwPicpOwoJcCgnREJIb3N0OicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7CglwKCc6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOwoJcCgnREJVc2VyOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7CglwKCdEQlBhc3M6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsKCXAoJ0RCQ2hhcnNldDonKTsKCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2Nvbm5lY3QnLCd2YWx1ZSc9PidDb25uZWN0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsKCXAoJzwvcD4nKTsKCWZvcm1mb290KCk7Cj8+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsKCWlmIChhY3Rpb24gPT0gJ2RlbCcpIHsKCQlpZiAoIWNvbmZpcm0oJ0lzIG9yIGlzblwndCBkZWxldGlvbiByZWNvcmQ/JykpIHJldHVybjsKCX0KCSQoJ3JlY29yZGxpc3QnKS5kb2luZy52YWx1ZT1hY3Rpb247CgkkKCdyZWNvcmRsaXN0JykuYmFzZTY0LnZhbHVlPWJhc2U2NDsKCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOwoJJCgncmVjb3JkbGlzdCcpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsKCWlmKCFkYm5hbWUpIHJldHVybjsKCSQoJ3NldGRibmFtZScpLmRibmFtZS52YWx1ZT1kYm5hbWU7CgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBzZXR0YWJsZSh0YWJsZW5hbWUsZG9pbmcscGFnZSkgewoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOwoJaWYgKGRvaW5nKSB7CgkJJCgnc2V0dGFibGUnKS5kb2luZy52YWx1ZT1kb2luZzsKCX0KCWlmIChwYWdlKSB7CgkJJCgnc2V0dGFibGUnKS5wYWdlLnZhbHVlPXBhZ2U7Cgl9CgkkKCdzZXR0YWJsZScpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7CgkkKCdzZXR0YWJsZScpLnN1Ym1pdCgpOwp9Cjwvc2NyaXB0Pgo8P3BocAoJLy8gU1FMCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZWNvcmRsaXN0JykpOwoJbWFrZWhpZGUoJ2RvaW5nJyk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCW1ha2VoaWRlKCdiYXNlNjQnKTsKCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsKCXAoJGRiZm9ybSk7Cglmb3JtZm9vdCgpOwoKCS8vIERhdGEKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3NldGRibmFtZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJcCgkZGJmb3JtKTsKCWlmICghJGRibmFtZSkgewoJCW1ha2VoaWRlKCdkYm5hbWUnKTsKCX0KCWZvcm1mb290KCk7CgoKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3NldHRhYmxlJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CglwKCRkYmZvcm0pOwoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOwoJbWFrZWhpZGUoJ3BhZ2UnLCRwYWdlKTsKCW1ha2VoaWRlKCdkb2luZycpOwoJZm9ybWZvb3QoKTsKCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOwoJJHBhZ2VudW0gPSAzMDsKCSRwYWdlID0gaW50dmFsKCRwYWdlKTsKCWlmKCRwYWdlKSB7CgkJJHN0YXJ0X2xpbWl0ID0gKCRwYWdlIC0gMSkgKiAkcGFnZW51bTsKCX0gZWxzZSB7CgkJJHN0YXJ0X2xpbWl0ID0gMDsKCQkkcGFnZSA9IDE7Cgl9CglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7CgkJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsKCQkvLyBnZXQgbXlzcWwgc2VydmVyCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7CgkJcCgnPHA+TXlTUUwgJy4kbXlzcWx2ZXIuJyBydW5uaW5nIGluICcuJGRiaG9zdC4nIGFzICcuJGRidXNlci4nQCcuJGRiaG9zdC4nPC9wPicpOwoJCSRoaWdodmVyID0gJG15c3FsdmVyID4gJzQuMScgPyAxIDogMDsKCgkJLy8gU2hvdyBkYXRhYmFzZQoJCSRxdWVyeSA9IHEoIlNIT1cgREFUQUJBU0VTIik7CgkJJGRicyA9IGFycmF5KCk7CgkJJGRic1tdID0gJy0tIFNlbGVjdCBhIGRhdGFiYXNlIC0tJzsKCQl3aGlsZSgkZGIgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7CgkJCSRkYnNbJGRiWydEYXRhYmFzZSddXSA9ICRkYlsnRGF0YWJhc2UnXTsKCQl9CgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nUGxlYXNlIHNlbGVjdCBhIGRhdGFiYXNlOicsJ25hbWUnPT4nZGJbXScsJ29wdGlvbic9PiRkYnMsJ3NlbGVjdGVkJz0+JGRibmFtZSwnb25jaGFuZ2UnPT4nbW9kZGJuYW1lKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKScsJ25ld2xpbmUnPT4xKSk7CgkJJHRhYmxlZGIgPSBhcnJheSgpOwoJCWlmICgkZGJuYW1lKSB7CgkJCXAoJzxwPicpOwoJCQlwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycuJGRibmFtZS4nXCcpOyI+Jy4kZGJuYW1lLic8L2E+Jyk7CgkJCWlmICgkdGFibGVuYW1lKSB7CgkJCQlwKCcgfCBDdXJyZW50IFRhYmxlOiA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJyk7Ij4nLiR0YWJsZW5hbWUuJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdpbnNlcnRcJyk7Ij5JbnNlcnQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdJyk7CgkJCX0KCQkJcCgnPC9wPicpOwoJCQlteXNxbF9zZWxlY3RfZGIoJGRibmFtZSk7CgoJCQkkZ2V0bnVtc3FsID0gJyc7CgkJCSRydW5xdWVyeSA9IDA7CgkJCWlmICgkc3FsX3F1ZXJ5KSB7CgkJCQkkcnVucXVlcnkgPSAxOwoJCQl9CgkJCSRhbGxvd2VkaXQgPSAwOwoJCQlpZiAoJHRhYmxlbmFtZSAmJiAhJHNxbF9xdWVyeSkgewoJCQkJJHNxbF9xdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZW5hbWUiOwoJCQkJJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7CgkJCQkkc3FsX3F1ZXJ5ID0gJHNxbF9xdWVyeS4iIExJTUlUICRzdGFydF9saW1pdCwgJHBhZ2VudW0iOwoJCQkJJGFsbG93ZWRpdCA9IDE7CgkJCX0KCQkJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCI+Jyk7CgkJCXAoJzxwPjx0YWJsZSB3aWR0aD0iMjAwIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBjb2xzcGFuPSIyIj5SdW4gU1FMIHF1ZXJ5L3F1ZXJpZXMgb24gZGF0YWJhc2UgPGZvbnQgY29sb3I9cmVkPjxiPicuJGRibmFtZS4nPC9mb250PjwvYj46PEJSPkV4YW1wbGUgVkJCIFBhc3N3b3JkOiA8Zm9udCBjb2xvcj1yZWQ+dmJhdGVhbTwvZm9udD48QlI+PGZvbnQgY29sb3I9eWVsbG93PlVQREFURSBgdXNlcmAgU0VUIGBwYXNzd29yZGAgPSBcJzY5ZTUzZTVhYjk1MzZlNTVkMzFmZjUzM2FlZmM0ZmJlXCcsIHNhbHQgPSBcJ3A1VFwnIFdIRVJFIGB1c2VyaWRgID0gXCcxXCcgPC9mb250PgoJCQk8L3RkPjwvdHI+PHRyPjx0ZD48dGV4dGFyZWEgbmFtZT0ic3FsX3F1ZXJ5IiBjbGFzcz0iYXJlYSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmF1dG87Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9xdWVyeSxFTlRfUVVPVEVTKS4nPC90ZXh0YXJlYT48L3RkPjx0ZCBzdHlsZT0icGFkZGluZzowIDVweDsiPjxpbnB1dCBjbGFzcz0iYnQiIHN0eWxlPSJoZWlnaHQ6NTBweDsiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iUXVlcnkiIC8+PC90ZD48L3RyPjwvdGFibGU+PC9wPicpOwoJCQltYWtlaGlkZSgndGFibGVuYW1lJywgJHRhYmxlbmFtZSk7CgkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJCQlwKCRkYmZvcm0pOwoJCQlwKCc8L2Zvcm0+Jyk7CgkJCWlmICgkdGFibGVuYW1lIHx8ICgkcnVucXVlcnkgJiYgJHNxbF9xdWVyeSkpIHsKCQkJCWlmICgkZG9pbmcgPT0gJ3N0cnVjdHVyZScpIHsKCQkJCQkkcmVzdWx0ID0gcSgiU0hPVyBDT0xVTU5TIEZST00gJHRhYmxlbmFtZSIpOwoJCQkJCSRyb3dkYiA9IGFycmF5KCk7CgkJCQkJd2hpbGUoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7CgkJCQkJCSRyb3dkYltdID0gJHJvdzsKCQkJCQl9CgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsKCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOwoJCQkJCXAoJzx0ZD5GaWVsZDwvdGQ+Jyk7CgkJCQkJcCgnPHRkPlR5cGU8L3RkPicpOwoJCQkJCXAoJzx0ZD5OdWxsPC90ZD4nKTsKCQkJCQlwKCc8dGQ+S2V5PC90ZD4nKTsKCQkJCQlwKCc8dGQ+RGVmYXVsdDwvdGQ+Jyk7CgkJCQkJcCgnPHRkPkV4dHJhPC90ZD4nKTsKCQkJCQlwKCc8L3RyPicpOwoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7CgkJCQkJCSR0aGlzYmcgPSBiZygpOwoJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydGaWVsZCddLic8L3RkPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ051bGwnXS4nJm5ic3A7PC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snS2V5J10uJyZuYnNwOzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snRXh0cmEnXS4nJm5ic3A7PC90ZD4nKTsKCQkJCQkJcCgnPC90cj4nKTsKCQkJCQl9CgkJCQkJdGJmb290KCk7CgkJCQl9IGVsc2VpZiAoJGRvaW5nID09ICdpbnNlcnQnIHx8ICRkb2luZyA9PSAnZWRpdCcpIHsKCQkJCQkkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsKCQkJCQl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7CgkJCQkJCSRyb3dkYltdID0gJHJvdzsKCQkJCQl9CgkJCQkJJHJzID0gYXJyYXkoKTsKCQkJCQlpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7CgkJCQkJCXAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcCgnPGgyPlVwZGF0ZSByZWNvcmQgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7CgkJCQkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7CgkJCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIExJTUlUIDEiKTsKCQkJCQkJJHJzID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CgkJCQkJfQoJCQkJCXAoJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInLiRzZWxmLiciPicpOwoJCQkJCXAoJGRiZm9ybSk7CgkJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CgkJCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsJHRhYmxlbmFtZSk7CgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsKCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgewoJCQkJCQlpZiAoJHJzWyRyb3dbJ0ZpZWxkJ11dKSB7CgkJCQkJCQkkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCRyc1skcm93WydGaWVsZCddXSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdmFsdWUgPSAnJzsKCQkJCQkJfQoJCQkJCQkkdGhpc2JnID0gYmcoKTsKCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsKCQkJCQkJcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOwoJCQkJCX0KCQkJCQlpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7CgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0iSW5zZXJ0IiAvPjwvdGQ+PC90cj4nKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InVwZGF0ZSIgdmFsdWU9IlVwZGF0ZSIgLz48L3RkPjwvdHI+Jyk7CgkJCQkJCW1ha2VoaWRlKCdiYXNlNjQnLCAkYmFzZTY0KTsKCQkJCQl9CgkJCQkJcCgnPC90YWJsZT48L2Zvcm0+Jyk7CgkJCQl9IGVsc2UgewoJCQkJCSRxdWVyeXMgPSBAZXhwbG9kZSgnOycsJHNxbF9xdWVyeSk7CgkJCQkJZm9yZWFjaCgkcXVlcnlzIGFzICRudW09PiRxdWVyeSkgewoJCQkJCQlpZiAoJHF1ZXJ5KSB7CgkJCQkJCQlwKCI8cD48Yj5RdWVyeSN7JG51bX0gOiAiLmh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5LEVOVF9RVU9URVMpLiI8L2I+PC9wPiIpOwoJCQkJCQkJc3dpdGNoKHF5KCRxdWVyeSkpCgkJCQkJCQl7CgkJCQkJCQkJY2FzZSAwOgoJCQkJCQkJCQlwKCc8aDI+RXJyb3IgOiAnLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWNhc2UgMToKCQkJCQkJCQkJaWYgKHN0cnRvbG93ZXIoc3Vic3RyKCRxdWVyeSwwLDEzKSkgPT0gJ3NlbGVjdCAqIGZyb20nKSB7CgkJCQkJCQkJCQkkYWxsb3dlZGl0ID0gMTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoJGdldG51bXNxbCkgewoJCQkJCQkJCQkJJHRhdG9sID0gbXlzcWxfbnVtX3Jvd3MocSgkZ2V0bnVtc3FsKSk7CgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmICghJHRhYmxlbmFtZSkgewoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOwoJCQkJCQkJCQkJJHNxbF9saW5lID0gcHJlZ19yZXBsYWNlKCIvXC9cKlteKFwqXC8pXSpcKlwvL2kiLCAiICIsICRzcWxfbGluZSk7CgkJCQkJCQkJCQlwcmVnX21hdGNoX2FsbCgiL2Zyb21ccytgezAsMX0oW1x3XSspYHswLDF9XHMrL2kiLCRzcWxfbGluZSwkbWF0Y2hlcyk7CgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07CgkJCQkJCQkJCX0KCQkJCQkJCQkJJHJlc3VsdCA9IHEoJHF1ZXJ5KTsKCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsKCQkJCQkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsKCQkJCQkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsKCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOwoJCQkJCQkJCQkkZmllbGRudW0gPSBAbXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTsKCQkJCQkJCQkJZm9yKCRpPTA7JGk8JGZpZWxkbnVtOyRpKyspewoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7CgkJCQkJCQkJCQkkdHlwZSA9IEBteXNxbF9maWVsZF90eXBlKCRyZXN1bHQsICRpKTsKCQkJCQkJCQkJCSRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsKCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlwKCc8L3RyPicpOwoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpewoJCQkJCQkJCQkJJHRoaXNiZyA9IGJnKCk7CgkJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOwoJCQkJCQkJCQkJJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOwoJCQkJCQkJCQkJZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7CgkJCQkJCQkJCQkJaWYgKCRpbnNpZGUpIHsKCQkJCQkJCQkJCQkJJHdoZXJlIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJGluc2lkZSkuIiciOwoJCQkJCQkJCQkJCQkkdG1wID0gJyBBTkQgJzsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJJGIxIC49ICc8dGQgbm93cmFwPicuaHRtbF9jbGVhbigkaW5zaWRlKS4nJm5ic3A7PC90ZD4nOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJHdoZXJlID0gYmFzZTY0X2VuY29kZSgkd2hlcmUpOwoJCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZWRpdFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkVkaXQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZGVsXCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7CgkJCQkJCQkJCQlwKCRiMSk7CgkJCQkJCQkJCQlwKCc8L3RyPicpOwoJCQkJCQkJCQkJdW5zZXQoJGIxKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQl0YmZvb3QoKTsKCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAyOgoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7CgkJCQkJCQkJCXAoJzxoMj5hZmZlY3RlZCByb3dzIDogPGI+Jy4kYXIuJzwvYj48L2gyPicpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRxdWVyeSA9IHEoIlNIT1cgVEFCTEUgU1RBVFVTIik7CgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsKCQkJCSR0YWJsZWRiID0gYXJyYXkoKTsKCQkJCXdoaWxlKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsKCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsKCQkJCQkkdGFibGVfcm93cyA9ICR0YWJsZV9yb3dzICsgJHRhYmxlWydSb3dzJ107CgkJCQkJJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7CgkJCQkJJHRhYmxlX251bSsrOwoJCQkJCSR0YWJsZWRiW10gPSAkdGFibGU7CgkJCQl9CgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOwoJCQkJdW5zZXQoJHRhYmxlKTsKCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7CgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsKCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJCQkJcCgkZGJmb3JtKTsKCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7CgkJCQlwKCc8dGQgd2lkdGg9IjIlIiBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+Jyk7CgkJCQlwKCc8dGQ+TmFtZTwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7CgkJCQlwKCc8dGQ+RGF0YV9sZW5ndGg8L3RkPicpOwoJCQkJcCgnPHRkPkNyZWF0ZV90aW1lPC90ZD4nKTsKCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7CgkJCQlpZiAoJGhpZ2h2ZXIpIHsKCQkJCQlwKCc8dGQ+RW5naW5lPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsKCQkJCX0KCQkJCXAoJzwvdHI+Jyk7CgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgewoJCQkJCSR0aGlzYmcgPSBiZygpOwoJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7CgkJCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJyk7Ij4nLiR0YWJsZVsnTmFtZSddLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXTwvdGQ+Jyk7CgkJCQkJcCgnPHRkPicuJHRhYmxlWydSb3dzJ10uJzwvdGQ+Jyk7CgkJCQkJcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOwoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ3JlYXRlX3RpbWUnXS4nPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1VwZGF0ZV90aW1lJ10uJzwvdGQ+Jyk7CgkJCQkJaWYgKCRoaWdodmVyKSB7CgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRW5naW5lJ10uJzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ29sbGF0aW9uJ10uJzwvdGQ+Jyk7CgkJCQkJfQoJCQkJCXAoJzwvdHI+Jyk7CgkJCQl9CgkJCQlwKCc8dHIgY2xhc3M9Zm91dD4nKTsKCQkJCXAoJzx0ZD4mbmJzcDs8L3RkPicpOwoJCQkJcCgnPHRkPlRvdGFsIHRhYmxlczogJy4kdGFibGVfbnVtLic8L3RkPicpOwoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOwoJCQkJcCgnPHRkIGNvbHNwYW49IicuKCRoaWdodmVyID8gNCA6IDIpLiciPiZuYnNwOzwvdGQ+Jyk7CgkJCQlwKCc8L3RyPicpOwoKCQkJCXAoIjx0ciBjbGFzcz1cImZvdXRcIj48dGQgY29sc3Bhbj1cIiIuKCRoaWdodmVyID8gOCA6IDYpLiJcIj48aW5wdXQgbmFtZT1cInNhdmVhc2ZpbGVcIiB2YWx1ZT1cIjFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPiBTYXZlIGFzIGZpbGUgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiBuYW1lPVwicGF0aFwiIHZhbHVlPVwiIi5TQV9ST09ULiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iX015U1FMLnNxbFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjYwXCIgLz4gPGlucHV0IGNsYXNzPVwiYnRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImRvd25yYXJcIiB2YWx1ZT1cIkV4cG9ydCBzZWxlY3Rpb24gdGFibGVcIiAvPjwvdGQ+PC90cj4iKTsKCQkJCW1ha2VoaWRlKCdkb2luZycsJ2JhY2t1cG15c3FsJyk7CgkJCQlmb3JtZm9vdCgpOwoJCQkJcCgiPC90YWJsZT4iKTsKCQkJCWZyKCRxdWVyeSk7CgkJCX0KCQl9Cgl9Cgl0YmZvb3QoKTsKCUBteXNxbF9jbG9zZSgpOwp9Ly9lbmQgc3FsIGJhY2t1cAoKCmVsc2VpZiAoJGFjdGlvbiA9PSAnYmFja2Nvbm5lY3QnKSB7CgkhJHlvdXJpcCAmJiAkeW91cmlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CgkhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7CgkkdXNlZGIgPSBhcnJheSgncGVybCc9PidwZXJsJywnYyc9PidjJyk7CgoJJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWaiIuCgkJImFHOGdJbUJwWkdBaU95OWlhVzR2YzJnbk93MEtKREE5SkdOdFpEc05DaVIwWVhKblpYUTlKRUZTUjFaYk1GMDdEUW9rY0c5eWREMGtRVkpIVmxzeFhUc05DaVJwWVdSa2NqMXBibVYwWDJGMGIyNG9KSFIiLgoJCSJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIi4KCQkic05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSSIuCgkJImtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWkiLgoJCSJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIi4KCQkiT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7CgkkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDIi4KCQkiQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBEUXA3RFFvZ2FXNTBJR1prT3cwS0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnphVzQ3RFFvZ1kyaGhjaUJ5YlhOYk1qRmRQU0p5YiIuCgkJIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiLgoJCSJLU2s3RFFvZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNnRFFvZ1lucGxjbThvWVhKbmRsc3hYU3h6ZEhKc1pXNG9ZWEpuZGxzeFhTa3JNU3R6ZEhKIi4KCQkic1pXNG9ZWEpuZGxzeVhTa3BPeUFOQ2lCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc2dEUW9nYVdZZ0tDaGpiMjV1WldOMEtHWmtMQyIuCgkJIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiLgoJCSJRb2dJQ0JsZUdsMEtEQXBPdzBLSUgwTkNpQnpkSEpqWVhRb2NtMXpMQ0JoY21kMld6QmRLVHNOQ2lCemVYTjBaVzBvY20xektUc2dJQTBLSUdSMWNESW9abVFzSURBcE93MEtJR1IxY0RJb1ptUXNJREVwIi4KCQkiT3cwS0lHUjFjRElvWm1Rc0lESXBPdzBLSUdWNFpXTnNLQ0l2WW1sdUwzTm9JaXdpYzJnZ0xXa2lMQ0JPVlV4TUtUc05DaUJqYkc5elpTaG1aQ2s3SUEwS2ZRPT0iOwoKCWlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7CgkJaWYgKCR1c2UgPT0gJ3BlcmwnKSB7CgkJCWNmKCcvdG1wL2FuZ2VsX2JjJywkYmFja19jb25uZWN0KTsKCQkJJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOwoJCX0gZWxzZSB7CgkJCWNmKCcvdG1wL2FuZ2VsX2JjLmMnLCRiYWNrX2Nvbm5lY3RfYyk7CgkJCSRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsKCQkJQHVubGluaygnL3RtcC9hbmdlbF9iYy5jJyk7CgkJCSRyZXMgPSBleGVjdXRlKCIvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsKCQl9CgkJbSgiTm93IHNjcmlwdCB0cnkgY29ubmVjdCB0byAkeW91cmlwIHBvcnQgJHlvdXJwb3J0IC4uLiIpOwoJfQoKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidCYWNrIENvbm5lY3QnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsKCXAoJzxwPicpOwoJcCgnWW91ciBJUDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOwoJcCgnWW91ciBQb3J0OicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJwb3J0Jywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiR5b3VycG9ydCkpOwoJcCgnVXNlOicpOwoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9Pid1c2UnLCdvcHRpb24nPT4kdXNlZGIsJ3NlbGVjdGVkJz0+JHVzZSkpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N0YXJ0JywndmFsdWUnPT4nU3RhcnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JykpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3QoKTsKfS8vZW5kIGJhY2tjb25uZWN0IHdpbmRvdyB2aWEgTkMKCi8vIEJydXRlCmVsc2VpZiAoJGFjdGlvbiA9PSAnYnJ1dGUnKSB7CmZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidCcnV0ZSBGb3JjZXInKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnYnJ1dGUnKTsKCW1ha2VoaWRlKCdkaXInLCRicnV0ZSk7CkBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAxMDAwMDAwMDAwMDAwKTsKJGNvbm5lY3RfdGltZW91dD01OwpAc2V0X3RpbWVfbGltaXQoMCk7CiRzdWJtaXQgPSAkX1JFUVVFU1RbJ3N1Ym1pdCddOwokdXNlcnMgPSAkX1JFUVVFU1RbJ3VzZXJzJ107CiRwYXNzID0gJF9SRVFVRVNUWydwYXNzd29yZHMnXTsKJHRhcmdldCA9ICRfUkVRVUVTVFsndGFyZ2V0J107CiRvcHRpb24gPSAkX1JFUVVFU1RbJ29wdGlvbiddOwoKCiRwYXNzbGlzdCA9ICIwMTIzNDU2CjAxMjM0NTY3CjAxMjM0NTY3OAowMTIzNDU2Nzg5CjAxMjM0NTY3ODkwCjEyMzQ1NgoxMjM0NTY3CjEyMzQ1Njc4CjEyMzQ1Njc4OQoxMjM0NTY3ODkwCjExMTExMQowMDAwMDAKMjIyMjIyCjMzMzMzMwo0NDQ0NDQKNTU1NTU1CjY2NjY2Ngo3Nzc3NzcKODg4ODg4Cjk5OTk5OQoxMjMxMjMKNDU2NDU2Cjc4OTc4OQoxMjMzMjEKNDU2NjU0CjY1NDMyMQo3NjU0MzIxCjg3NjU0MzIxCjk4NzY1NDMyMQowOTg3NjU0MzIxCmFkbWluCmFkbWluaXN0cmF0b3IKYWRtaW5jcApjcGFuZWwKYWRtaW54CmFkbWlucwpwYXNzd29yZApwYXNzd29yZHMKcGFzc3cwcmQKcEBzc3cwcmQKcEBzc3dvcmQKa2hvbmdjbwoyNTI1MTMyNQpwYXNzdzByZHMiOwppZigkdGFyZ2V0ID09ICcnKXsKJHRhcmdldCA9ICdsb2NhbGhvc3QnOwp9CnByaW50ICIgPGRpdiBhbGlnbj0nY2VudGVyJz4KPGZvcm0gbWV0aG9kPSdwb3N0JyBzdHlsZT0nYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCc+PGJyPjxicj4KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzQwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT48dHI+PHRkPgo8Yj4gVGFyZ2V0ICA6IDwvZm9udD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGFyZ2V0JyBzaXplPScxNicgdmFsdWU9ICR0YXJnZXQgc3R5bGU9J2JvcmRlcjogZm9udC1mYW1pbHk6dGFob21hOyBmb250LXdlaWdodDpib2xkOyc+PC9wPjwvZm9udD48L2I+PC9wPgo8ZGl2IGFsaWduPSdjZW50ZXInPjxicj4KPFRBQkxFIHN0eWxlPSdCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlJyBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTY2MTE3IGNlbGxQYWRkaW5nPTUgd2lkdGg9JzUwJScgYmdDb2xvcj0jMzAzMDMwIGJvcmRlckNvbG9yTGlnaHQ9Izk2NjExNyBib3JkZXI9MT4KPHRyPgo8dGQgYWxpZ249J2NlbnRlcic+CjxiPlVzZXJuYW1lPC9iPjwvdGQ+Cjx0ZD4KPHAgYWxpZ249J2NlbnRlcic+CjxiPlBhc3N3b3JkPC9iPjwvdGQ+CjwvdHI+CjwvdGFibGU+CjxwIGFsaWduPSdjZW50ZXInPgo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiI7CiRpID0gMDsKd2hpbGUgKCRpIDwgNjAwMDApIHsKCiAgICAkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRpKTsKICAgIGlmICghZW1wdHkoJGxpbmUpKSB7CgogICAgICAgIHdoaWxlIChsaXN0ICgka2V5LCAkdmJhX2V0Y3B3ZCkgPSBlYWNoKCRsaW5lKSl7CiAgICAgICAgICAgIGVjaG8gIiIuJHZiYV9ldGNwd2QuIlxuIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIH0KCiAgICRpKys7Cn0KZWNobyAiCjwvdGV4dGFyZWE+Cjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ncGFzc3dvcmRzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiRwYXNzbGlzdDwvdGV4dGFyZWE+PGJyPgo8YnI+CjxiPk9wdGlvbnMgOiA8L3NwYW4+PGlucHV0IG5hbWU9J29wdGlvbicgdmFsdWU9J2NwYW5lbCcgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyBjaGVja2VkIHR5cGU9J3JhZGlvJz4gY1BhbmVsCjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPiBmdHAgPT0+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG5hbWU9J3N1Ym1pdCcgPjwvcD4KPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvZm9ybT48cCBhbGlnbj0gJ2xlZnQnPiI7Cj8+Cjw/cGhwCmZ1bmN0aW9uIGZ0cF9jaGVjaygkaG9zdCwkdXNlciwkcGFzcywkdGltZW91dCl7CiRjaCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiZnRwOi8vJGhvc3QiKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GVFBMSVNUT05MWSwgMSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsKY3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOwokZGF0YSA9IGN1cmxfZXhlYygkY2gpOwppZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAyOCApIHsKCnByaW50ICI8Yj4gRXJyb3IgOiBDb25uZWN0aW9uIHRpbWVkIG91dCAsIG1ha2UgY29uZmlkZW5jZSBhYm91dCB2YWxpZGF0aW9uIG9mIHRhcmdldCAhPC9iPiI7CmV4aXQ7fQoKZWxzZWlmICggY3VybF9lcnJubygkY2gpID09IDAgKXsKCnAoIjxiPlsgYXR0YWNrQHZiYXRlYW0ubmV0IF0jIDwvYj4KPGI+IEF0dGFja2luZyBoYXMgYmVlbiBkb25lISBVc2VybmFtZTogPGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkdXNlciA8L2ZvbnQ+IC8gUGFzc3dvcmQ6PGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkcGFzcyA8L2ZvbnQ+ID0+IDxhIGhyZWY9aHR0cDovLyR1c2VyOiRwYXNzQCRob3N0OjIwODIgdGFyZ2V0PV9ibGFuaz5Mb2dpbjwvYT48L2I+PGJyPiIpOwp9CmN1cmxfY2xvc2UoJGNoKTt9CgpmdW5jdGlvbiBjcGFuZWxfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpewokY2ggPSBjdXJsX2luaXQoKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIik7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQkFTSUMpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7CmN1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsKJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsKaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMjggKSB7CnByaW50ICI8Yj4gRXJyb3IgOiBDb25uZWN0aW9uIHRpbWVkIG91dCAsIG1ha2UgY29uZmlkZW5jZSBhYm91dCB2YWxpZGF0aW9uIG9mIHRhcmdldCAhPC9iPiI7CmV4aXQ7fQplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApewoKcCgiPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgPC9iPjxiPkF0dGFja2luZyBoYXMgYmVlbiBkb25lITwvYT4gVXNlcm5hbWU6IDxmb250IGNvbG9yPScjRkYwMDAwJz4gJHVzZXIgPC9mb250PiAvIFBhc3N3b3JkOjxmb250IGNvbG9yPScjRkYwMDAwJz4gJHBhc3MgPC9mb250PjwvYj48YnI+Iik7fWN1cmxfY2xvc2UoJGNoKTt9CgppZihpc3NldCgkc3VibWl0KSAmJiAhZW1wdHkoJHN1Ym1pdCkpewoKJHVzZXJsaXN0ID0gZXhwbG9kZSAoIlxuIiAsICR1c2VycyApOwokcGFzc2xpc3QgPSBleHBsb2RlICgiXG4iICwgJHBhc3MgKTsKcCgnPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgQXR0YWNraW5nIC4uLjwvZm9udD48L2I+PGJyPicpOwpmb3JlYWNoICgkdXNlcmxpc3QgYXMgJHVzZXIpIHsKJF91c2VyID0gdHJpbSgkdXNlcik7CmZvcmVhY2ggKCRwYXNzbGlzdCBhcyAkcGFzc3dvcmQgKSB7CiRfcGFzcyA9IHRyaW0oJHBhc3N3b3JkKTsKaWYoJG9wdGlvbiA9PSAiZnRwIil7CmZ0cF9jaGVjaygkdGFyZ2V0LCRfdXNlciwkX3Bhc3MsJGNvbm5lY3RfdGltZW91dCk7Cn0KaWYgKCRvcHRpb24gPT0gImNwYW5lbCIpCnsKY3BhbmVsX2NoZWNrKCR0YXJnZXQsJF91c2VyLCRfcGFzcywkY29ubmVjdF90aW1lb3V0KTsKfQp9Cn0KfQoKCWZvcm1mb290KCk7Cn0KCgoKCgoKZWxzZWlmICgkYWN0aW9uID09ICdldGNwd2QnKSB7CmZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidHZXQgL2V0Yy9wYXNzd2QnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnZXRjcHdkJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7CiRpID0gMDsKIGVjaG8gIjxwPjxicj48dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCJwaHBjb2RleHh4XCIgbmFtZT1cInBocGNvZGV4eHhcIiBjb2xzPVwiMTAwXCIgcm93cz1cIjI1XCI+IjsKd2hpbGUgKCRpIDwgNjAwMDApIHsKCiAgICAkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRpKTsKICAgIGlmICghZW1wdHkoJGxpbmUpKSB7CgogICAgICAgIHdoaWxlIChsaXN0ICgka2V5LCAkdmJhX2V0Y3B3ZCkgPSBlYWNoKCRsaW5lKSl7CiAgICAgICAgICAgIGVjaG8gIiIuJHZiYV9ldGNwd2QuIlxuIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIH0KCiAgICRpKys7Cn0KICBlY2hvICI8L3RleHRhcmVhPjwvcD4iOwoJZm9ybWZvb3QoKTsKfQoKZWxzZWlmICgkYWN0aW9uID09ICdldmFsJykgewoJJHBocGNvZGUgPSB0cmltKCRwaHBjb2RlKTsKCWlmKCRwaHBjb2RlKXsKCQlpZiAoIXByZWdfbWF0Y2goJyM8XD8jc2knLCAkcGhwY29kZSkpIHsKCQkJJHBocGNvZGUgPSAiPD9waHBcblxueyRwaHBjb2RlfVxuXG4/PiI7CgkJfQoJCWV2YWwoIj8iLiI+JHBocGNvZGU8PyIpOwoJfQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V2YWwgUEhQIENvZGUnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnZXZhbCcpOwoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsKCXAoJzxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuNG5nZWwubmV0L3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOwoJZm9ybWZvb3RlcigpOwp9Ly9lbmQgZXZhbAoKZWxzZWlmICgkYWN0aW9uID09ICdlZGl0ZmlsZScpIHsKCWlmKGZpbGVfZXhpc3RzKCRvcGZpbGUpKSB7CgkJJGZwPUBmb3Blbigkb3BmaWxlLCdyJyk7CgkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRvcGZpbGUpKTsKCQlAZmNsb3NlKCRmcCk7CgkJJGNvbnRlbnRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsKCX0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDcmVhdGUgLyBFZGl0IEZpbGUnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IEZpbGUgKGltcG9ydCBuZXcgZmlsZSBuYW1lIGFuZCBuZXcgZmlsZSknLCduYW1lJz0+J2VkaXRmaWxlbmFtZScsJ3ZhbHVlJz0+JG9wZmlsZSwnbmV3bGluZSc9PjEpKTsKCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidGaWxlIENvbnRlbnQnLCduYW1lJz0+J2ZpbGVjb250ZW50JywndmFsdWUnPT4kY29udGVudHMpKTsKCWZvcm1mb290ZXIoKTsKfS8vZW5kIGVkaXRmaWxlCgplbHNlaWYgKCRhY3Rpb24gPT0gJ25ld3RpbWUnKSB7Cgkkb3BmaWxlbXRpbWUgPSBAZmlsZW10aW1lKCRvcGZpbGUpOwoJLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7CgkkY2FjaGVtb250aCA9IGFycmF5KCdKYW51YXJ5Jz0+MSwnRmVicnVhcnknPT4yLCdNYXJjaCc9PjMsJ0FwcmlsJz0+NCwnTWF5Jz0+NSwnSnVuZSc9PjYsJ0p1bHknPT43LCdBdWd1c3QnPT44LCdTZXB0ZW1iZXInPT45LCdPY3RvYmVyJz0+MTAsJ05vdmVtYmVyJz0+MTEsJ0RlY2VtYmVyJz0+MTIpOwoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0Nsb25lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgdGltZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0FsdGVyIGZpbGUnLCduYW1lJz0+J2N1cmZpbGUnLCd2YWx1ZSc9PiRvcGZpbGUsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOwoJZm9ybWZvb3RlcigpOwoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J1NldCBsYXN0IG1vZGlmaWVkJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ3VycmVudCBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J2N1cmZpbGUnLCd2YWx1ZSc9PiRvcGZpbGUsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7CglwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsKCXAoJ3llYXI6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neWVhcicsJ3ZhbHVlJz0+ZGF0ZSgnWScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjQpKTsKCXAoJ21vbnRoOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21vbnRoJywndmFsdWUnPT5kYXRlKCdtJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOwoJcCgnZGF5OicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsKCXAoJ2hvdXI6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4naG91cicsJ3ZhbHVlJz0+ZGF0ZSgnSCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsKCXAoJ21pbnV0ZTonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidtaW51dGUnLCd2YWx1ZSc9PmRhdGUoJ2knLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7CglwKCdzZWNvbmQ6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3RlcigpOwp9Ly9lbmQgbmV3dGltZQoKZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsKCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7CgkJaWYoJHByb2dyYW0gJiYgJHBhcmFtZXRlcikgewoJCQkkc2hlbGw9IG5ldyBDT00oJ1NoZWxsLkFwcGxpY2F0aW9uJyk7CgkJCSRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sJHBhcmFtZXRlcik7CgkJCW0oJ1Byb2dyYW0gcnVuIGhhcyAnLighJGEgPyAnc3VjY2VzcycgOiAnZmFpbCcpKTsKCQl9CgkJISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7CgkJISRwYXJhbWV0ZXIgJiYgJHBhcmFtZXRlciA9ICcvYyBuZXQgc3RhcnQgPiAnLlNBX1JPT1QuJ2xvZy50eHQnOwoJCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIFByb2dyYW0nKSk7CgkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7CgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQcm9ncmFtJywnbmFtZSc9Pidwcm9ncmFtJywndmFsdWUnPT4kcHJvZ3JhbSwnbmV3bGluZSc9PjEpKTsKCQlwKCc8cD4nKTsKCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BhcmFtZXRlcicsJ25hbWUnPT4ncGFyYW1ldGVyJywndmFsdWUnPT4kcGFyYW1ldGVyKSk7CgkJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOwoJCXAoJzwvcD4nKTsKCQlmb3JtZm9vdCgpOwoJfQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgQ29tbWFuZCcpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOwoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsKCQkkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJz0+J3BocGZ1bmMnLCd3c2NyaXB0Jz0+J3dzY3JpcHQnLCdwcm9jX29wZW4nPT4ncHJvY19vcGVuJyk7CgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nVXNlOicsJ25hbWUnPT4nZXhlY2Z1bmMnLCdvcHRpb24nPT4kZXhlY2Z1bmNkYiwnc2VsZWN0ZWQnPT4kZXhlY2Z1bmMsJ25ld2xpbmUnPT4xKSk7Cgl9CglwKCc8cD4nKTsKCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ29tbWFuZCcsJ25hbWUnPT4nY29tbWFuZCcsJ3ZhbHVlJz0+JGNvbW1hbmQpKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsKCXAoJzwvcD4nKTsKCWZvcm1mb290KCk7CgoJaWYgKCRjb21tYW5kKSB7CgkJcCgnPGhyIHdpZHRoPSIxMDAlIiBub3NoYWRlIC8+PHByZT4nKTsKCQlpZiAoJGV4ZWNmdW5jPT0nd3NjcmlwdCcgJiYgSVNfV0lOICYmIElTX0NPTSkgewoJCQkkd3NoID0gbmV3IENPTSgnV1NjcmlwdC5zaGVsbCcpOwoJCQkkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJy4kY29tbWFuZCk7CgkJCSRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7CgkJCSRzdHJvdXRwdXQgPSAkc3Rkb3V0LT5SZWFkQWxsKCk7CgkJCWVjaG8gJHN0cm91dHB1dDsKCQl9IGVsc2VpZiAoJGV4ZWNmdW5jPT0ncHJvY19vcGVuJyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7CgkJCSRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAoJCQkgICAwID0+IGFycmF5KCdwaXBlJywgJ3InKSwKCQkJICAgMSA9PiBhcnJheSgncGlwZScsICd3JyksCgkJCSAgIDIgPT4gYXJyYXkoJ3BpcGUnLCAndycpCgkJCSk7CgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCRfU0VSVkVSWydDT01TUEVDJ10sICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsKCQkJaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgewoJCQkJZndyaXRlKCRwaXBlc1swXSwgJGNvbW1hbmQuIlxyXG4iKTsKCQkJCWZ3cml0ZSgkcGlwZXNbMF0sICJleGl0XHJcbiIpOwoJCQkJZmNsb3NlKCRwaXBlc1swXSk7CgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgewoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzFdLCAxMDI0KTsKCQkJCX0KCQkJCWZjbG9zZSgkcGlwZXNbMV0pOwoJCQkJd2hpbGUgKCFmZW9mKCRwaXBlc1syXSkpIHsKCQkJCQllY2hvIGZnZXRzKCRwaXBlc1syXSwgMTAyNCk7CgkJCQl9CgkJCQlmY2xvc2UoJHBpcGVzWzJdKTsKCQkJCXByb2NfY2xvc2UoJHByb2Nlc3MpOwoJCQl9CgkJfSBlbHNlIHsKCQkJZWNobyhleGVjdXRlKCRjb21tYW5kKSk7CgkJfQoJCXAoJzwvcHJlPicpOwoJfQp9Ly9lbmQgc2hlbGwKCmVsc2VpZiAoJGFjdGlvbiA9PSAncGhwZW52JykgewoJJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOwoJJGFkbWlubWFpbD1pc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10pID8gJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddIDogZ2V0Y2ZnKCdzZW5kbWFpbF9mcm9tJyk7CgkhJGRpc19mdW5jICYmICRkaXNfZnVuYyA9ICdObyc7CgkkaW5mbyA9IGFycmF5KAoJCTEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLAoJCTIgPT4gYXJyYXkoJ1NlcnZlciBEb21haW4nLCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSwKCQkzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSwKCQk0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksCgkJNSA9PiBhcnJheSgnU2VydmVyIE9TIENoYXJzZXQnLCRfU0VSVkVSWydIVFRQX0FDQ0VQVF9MQU5HVUFHRSddKSwKCQk2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSksCgkJNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksCgkJOCA9PiBhcnJheSgnUEhQIHJ1biBtb2RlJyxzdHJ0b3VwcGVyKHBocF9zYXBpX25hbWUoKSkpLAoJCTkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLF9fRklMRV9fKSwKCgkJMTAgPT4gYXJyYXkoJ1BIUCBWZXJzaW9uJyxQSFBfVkVSU0lPTiksCgkJMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksCgkJMTIgPT4gYXJyYXkoJ1NhZmUgTW9kZScsZ2V0Y2ZnKCdzYWZlX21vZGUnKSksCgkJMTMgPT4gYXJyYXkoJ0FkbWluaXN0cmF0b3InLCRhZG1pbm1haWwpLAoJCTE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLAoJCTE1ID0+IGFycmF5KCdlbmFibGVfZGwnLGdldGNmZygnZW5hYmxlX2RsJykpLAoJCTE2ID0+IGFycmF5KCdkaXNwbGF5X2Vycm9ycycsZ2V0Y2ZnKCdkaXNwbGF5X2Vycm9ycycpKSwKCQkxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLAoJCTE4ID0+IGFycmF5KCdtYWdpY19xdW90ZXNfZ3BjJyxnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksCgkJMTkgPT4gYXJyYXkoJ21lbW9yeV9saW1pdCcsZ2V0Y2ZnKCdtZW1vcnlfbGltaXQnKSksCgkJMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwKCQkyMSA9PiBhcnJheSgndXBsb2FkX21heF9maWxlc2l6ZScsJHVwc2l6ZSksCgkJMjIgPT4gYXJyYXkoJ21heF9leGVjdXRpb25fdGltZScsZ2V0Y2ZnKCdtYXhfZXhlY3V0aW9uX3RpbWUnKS4nIHNlY29uZChzKScpLAoJCTIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwKCSk7CgoJaWYoJHBocHZhcm5hbWUpIHsKCQltKCRwaHB2YXJuYW1lIC4nIDogJy5nZXRjZmcoJHBocHZhcm5hbWUpKTsKCX0KCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3BocGVudicpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQbGVhc2UgaW5wdXQgUEhQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKGVnOm1hZ2ljX3F1b3Rlc19ncGMpJywnbmFtZSc9PidwaHB2YXJuYW1lJywndmFsdWUnPT4kcGhwdmFybmFtZSwnbmV3bGluZSc9PjEpKTsKCWZvcm1mb290ZXIoKTsKCgkkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7Cglmb3IoJGE9MDskYTwyOyRhKyspIHsKCQlwKCc8aDI+Jy4kaHBbJGFdLicgJnJhcXVvOzwvaDI+Jyk7CgkJcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsKCQlpZiAoJGE9PTApIHsKCQkJZm9yKCRpPTE7JGk8PTk7JGkrKykgewoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOwoJCQl9CgkJfSBlbHNlaWYgKCRhID09IDEpIHsKCQkJZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7CgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7CgkJCX0KCQl9CgkJcCgnPC91bD4nKTsKCX0KfS8vZW5kIHBocGVudgoKZWxzZSB7CgltKCdVbmRlZmluZWQgQWN0aW9uJyk7Cn0KCj8+CjwvdGQ+PC90cj48L3RhYmxlPgo8ZGl2IHN0eWxlPSJwYWRkaW5nOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzBFMEUwRTtib3JkZXItdG9wOjFweCBzb2xpZCAjMEUwRTBFO2JhY2tncm91bmQ6IzBFMEUwRTsiPgoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7b2JfZW5kX2ZsdXNoKCk7Pz48L3NwYW4+CglDb3B5cmlnaHQgKEMpIDIwMTUgPEI+PC9CPiAtIERldmVsb3AgYnkgPGEgaHJlZj1odHRwOi8vdHJ1bmdraWVuLnZpZXRhdS52bi8gdGFyZ2V0PV9ibGFuaz48Qj5UUDJrMSAgIDwvQj48L2E+IC0gPEI+LSBOb05hbWVfVGVhbTwvQj4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KPC9kaXY+CjwvYm9keT4KPC9odG1sPgoKPD9waHAKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClNob3cgaW5mbyBzaGVsbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKZnVuY3Rpb24gbSgkbXNnKSB7CgllY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmMWYxZjE7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3BhZGRpbmc6MTVweDtmb250OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPic7CgllY2hvICRtc2c7CgllY2hvICc8L2Rpdj4nOwp9CmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7CglnbG9iYWwgJGFkbWluLCAkdGltZXN0YW1wLCAkX1NFUlZFUjsKCSRrZXkgPSAoJHByZWZpeCA/ICRhZG1pblsnY29va2llcHJlJ10gOiAnJykuJGtleTsKCSRsaWZlID0gJGxpZmUgPyAkbGlmZSA6ICRhZG1pblsnY29va2llbGlmZSddOwoJJHVzZXBvcnQgPSAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSA9PSA0NDMgPyAxIDogMDsKCXNldGNvb2tpZSgka2V5LCAkdmFsdWUsICR0aW1lc3RhbXArJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7Cn0KZnVuY3Rpb24gbXVsdGkoJG51bSwgJHBlcnBhZ2UsICRjdXJwYWdlLCAkdGFibGVuYW1lKSB7CgkkbXVsdGlwYWdlID0gJyc7CglpZigkbnVtID4gJHBlcnBhZ2UpIHsKCQkkcGFnZSA9IDEwOwoJCSRvZmZzZXQgPSA1OwoJCSRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7CgkJaWYoJHBhZ2UgPiAkcGFnZXMpIHsKCQkJJGZyb20gPSAxOwoJCQkkdG8gPSAkcGFnZXM7CgkJfSBlbHNlIHsKCQkJJGZyb20gPSAkY3VycGFnZSAtICRvZmZzZXQ7CgkJCSR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsKCQkJaWYoJGZyb20gPCAxKSB7CgkJCQkkdG8gPSAkY3VycGFnZSArIDEgLSAkZnJvbTsKCQkJCSRmcm9tID0gMTsKCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7CgkJCQkJJHRvID0gJHBhZ2U7CgkJCQl9CgkJCX0gZWxzZWlmKCR0byA+ICRwYWdlcykgewoJCQkJJGZyb20gPSAkY3VycGFnZSAtICRwYWdlcyArICR0bzsKCQkJCSR0byA9ICRwYWdlczsKCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7CgkJCQkJJGZyb20gPSAkcGFnZXMgLSAkcGFnZSArIDE7CgkJCQl9CgkJCX0KCQl9CgkJJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOwoJCWZvcigkaSA9ICRmcm9tOyAkaSA8PSAkdG87ICRpKyspIHsKCQkJJG11bHRpcGFnZSAuPSAkaSA9PSAkY3VycGFnZSA/ICRpLicgJyA6ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4kaS4nKTsiPlsnLiRpLiddPC9hPiAnOwoJCX0KCQkkbXVsdGlwYWdlIC49ICgkY3VycGFnZSA8ICRwYWdlcyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgKyAxKS4nKTsiPk5leHQ8L2E+JyA6ICcnKS4oJHRvIDwgJHBhZ2VzID8gJyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4kcGFnZXMuJyk7Ij5MYXN0PC9hPicgOiAnJyk7CgkJJG11bHRpcGFnZSA9ICRtdWx0aXBhZ2UgPyAnPHA+UGFnZXM6ICcuJG11bHRpcGFnZS4nPC9wPicgOiAnJzsKCX0KCXJldHVybiAkbXVsdGlwYWdlOwp9Ci8vIExvZ2luIHBhZ2UKZnVuY3Rpb24gbG9naW5wYWdlKCkgewo/Pgo8aHRtbD4KPGhlYWQ+Cgo8Ym9keSBiZ2NvbG9yPWJsYWNrIGJhY2tncm91bmQ9MS5qcGc+CgoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgo8dGl0bGU+Tk5UIC0gTm9OYW1lX1RlYW0gPC90aXRsZT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KQTpsaW5rIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiBncmVlbiB9CkE6dmlzaXRlZCB7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOnJlZH0KQTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjogbm9uZX0KQTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiBncmVlbjt9CmlucHV0LCB0ZXh0YXJlYSwgYnV0dG9uCnsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAJI0ZGRkZGRjsKCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKCWJvcmRlci1sZWZ0OiAycHggZGFzaGVkICM4QjAwMDA7Cglib3JkZXItdG9wOiAycHggZGFzaGVkICM4QjAwMDA7Cglib3JkZXItcmlnaHQ6IDJweCBkYXNoZWQgIzhCMDAwMDsKCWJvcmRlci1ib3R0b206IDJweCBkYXNoZWQgIzhCMDAwMDsKfQoKPC9zdHlsZT4KCiAgICAgICA8QlI+PEJSPgo8ZGl2IGFsaWduPWNlbnRlciA+Cgo8ZGl2Pgo8Zm9udCBjb2xvcj1ncmF5Pgo8YnIgLz48YnIgLz48YnIgLz48YnIgLz48YnIgLz4KCjxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPgoJPHNwYW4gc3R5bGU9ImZvbnQ6MjBwdCB0YWhvbWE7Ij4gPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjMwIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRvaW5nIiB2YWx1ZT0ibG9naW4iPgoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4KCTwvZm9ybT4KPEJSPgo8P3BocAplY2hvICIiLiRlcnJfbWVzcy4iIjsKPz4KCgk8Qj48Zm9udCBjb2xvcj1yZWQ+CgoKCgoKCjwvZGl2PgoKCgk8L2ZpZWxkc2V0PgoKCgo8L2hlYWQ+CjwvaHRtbD4KCgo8P3BocAoJZXhpdDsKCn0vL2VuZCBsb2dpbnBhZ2UoKQoKZnVuY3Rpb24gZXhlY3V0ZSgkY2ZlKSB7CgkkcmVzID0gJyc7CglpZiAoJGNmZSkgewoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7CgkJCUBleGVjKCRjZmUsJHJlcyk7CgkJCSRyZXMgPSBqb2luKCJcbiIsJHJlcyk7CgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKCQkJJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOwoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsKCQkJQG9iX3N0YXJ0KCk7CgkJCUBzeXN0ZW0oJGNmZSk7CgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCUBvYl9lbmRfY2xlYW4oKTsKCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKCQkJQG9iX3N0YXJ0KCk7CgkJCUBwYXNzdGhydSgkY2ZlKTsKCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsKCQkJQG9iX2VuZF9jbGVhbigpOwoJCX0gZWxzZWlmKEBpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkY2ZlLCJyIikpKSB7CgkJCSRyZXMgPSAnJzsKCQkJd2hpbGUoIUBmZW9mKCRmKSkgewoJCQkJJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7CgkJCX0KCQkJQHBjbG9zZSgkZik7CgkJfQoJfQoJcmV0dXJuICRyZXM7Cn0KZnVuY3Rpb24gd2hpY2goJHByKSB7CgkkcGF0aCA9IGV4ZWN1dGUoIndoaWNoICRwciIpOwoJcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsKfQoKZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsKCWlmKCRmcD1AZm9wZW4oJGZuYW1lLCd3JykpIHsKCQlAZnB1dHMoJGZwLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7CgkJQGZjbG9zZSgkZnApOwoJfQp9CgovLyBEZWJ1ZwpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7CglnbG9iYWwgJHN0YXJ0dGltZTsKCSRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7CgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOwoJZWNobyAnUHJvY2Vzc2VkIGluICcuJHRvdGFsdGltZS4nIHNlY29uZChzKSc7Cn0KCi8vIEZ1bmN0aW9uIGNvbm5lY3QgZGF0YWJhc2UKZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWU9JycsJGNoYXJzZXQ9JycsJGRicG9ydD0nMzMwNicpIHsKCWlmKCEkbGluayA9IEBteXNxbF9jb25uZWN0KCRkYmhvc3QuJzonLiRkYnBvcnQsICRkYnVzZXIsICRkYnBhc3MpKSB7CgkJcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOwoJCWV4aXQ7Cgl9CglpZigkbGluayAmJiAkZGJuYW1lKSB7CgkJaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUsICRsaW5rKSkgewoJCQlwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsKCQkJZXhpdDsKCQl9Cgl9CglpZigkbGluayAmJiBteXNxbF9nZXRfc2VydmVyX2luZm8oKSA+ICc0LjEnKSB7CgkJaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkY2hhcnNldCksIGFycmF5KCdnYmsnLCAnYmlnNScsICd1dGY4JykpKSB7CgkJCXEoIlNFVCBjaGFyYWN0ZXJfc2V0X2Nvbm5lY3Rpb249JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cz0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9jbGllbnQ9YmluYXJ5OyIsICRsaW5rKTsKCQl9Cgl9CglyZXR1cm4gJGxpbms7Cn0KCi8vIEFycmF5IHN0cmlwCmZ1bmN0aW9uIHNfYXJyYXkoJiRhcnJheSkgewoJaWYgKGlzX2FycmF5KCRhcnJheSkpIHsKCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsKCQkJJGFycmF5WyRrXSA9IHNfYXJyYXkoJHYpOwoJCX0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsKCQkkYXJyYXkgPSBzdHJpcHNsYXNoZXMoJGFycmF5KTsKCX0KCXJldHVybiAkYXJyYXk7Cn0KCi8vIEhUTUwgU3RyaXAKZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgewoJJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsKCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlx0IiwgIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsKCXJldHVybiAkY29udGVudDsKfQoKLy8gQ2htb2QKZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKXsKCXJldHVybiBzdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZpbGVwYXRoKSwxMCw4KSwtNCk7Cn0KCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgewoJJG1vZGUgPSBAZmlsZXBlcm1zKCRmaWxlcGF0aCk7CglpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAncyc7fQoJZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0eXBlID0gJ2wnO30KCWVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAnLSc7fQoJZWxzZWlmICgoJG1vZGUgJiAweDYwMDApID09PSAweDYwMDApIHskdHlwZSA9ICdiJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gJ2MnO30KCWVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAncCc7fQoJZWxzZSB7JHR5cGUgPSAnPyc7fQoKCSRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOwoJJG93bmVyWyd3cml0ZSddID0gKCRtb2RlICYgMDAyMDApID8gJ3cnIDogJy0nOwoJJG93bmVyWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDEwMCkgPyAneCcgOiAnLSc7CgkkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsKCSRncm91cFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDIwKSA/ICd3JyA6ICctJzsKCSRncm91cFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMTApID8gJ3gnIDogJy0nOwoJJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7Cgkkd29ybGRbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAwMikgPyAndycgOiAnLSc7Cgkkd29ybGRbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsKCglpZiggJG1vZGUgJiAweDgwMCApIHskb3duZXJbJ2V4ZWN1dGUnXSA9ICgkb3duZXJbJ2V4ZWN1dGUnXT09J3gnKSA/ICdzJyA6ICdTJzt9CglpZiggJG1vZGUgJiAweDQwMCApIHskZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkZ3JvdXBbJ2V4ZWN1dGUnXT09J3gnKSA/ICdzJyA6ICdTJzt9CglpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9CgoJcmV0dXJuICR0eXBlLiRvd25lclsncmVhZCddLiRvd25lclsnd3JpdGUnXS4kb3duZXJbJ2V4ZWN1dGUnXS4kZ3JvdXBbJ3JlYWQnXS4kZ3JvdXBbJ3dyaXRlJ10uJGdyb3VwWydleGVjdXRlJ10uJHdvcmxkWydyZWFkJ10uJHdvcmxkWyd3cml0ZSddLiR3b3JsZFsnZXhlY3V0ZSddOwp9CgpmdW5jdGlvbiBnZXRVc2VyKCRmaWxlcGF0aCkJewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgewoJCSRhcnJheSA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlcGF0aCkpOwoJCWlmICgkYXJyYXkgJiYgaXNfYXJyYXkoJGFycmF5KSkgewoJCQlyZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7CgkJfQoJfQoJcmV0dXJuICcnOwp9CgovLyBEZWxldGUgZGlyCmZ1bmN0aW9uIGRlbHRyZWUoJGRlbGRpcikgewoJJG15ZGlyPUBkaXIoJGRlbGRpcik7Cgl3aGlsZSgkZmlsZT0kbXlkaXItPnJlYWQoKSkJewoJCWlmKChpc19kaXIoJGRlbGRpci4nLycuJGZpbGUpKSAmJiAoJGZpbGUhPScuJykgJiYgKCRmaWxlIT0nLi4nKSkgewoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7CgkJCWRlbHRyZWUoJGRlbGRpci4nLycuJGZpbGUpOwoJCX0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsKCQkJQGNobW9kKCRkZWxkaXIuJy8nLiRmaWxlLDA3NzcpOwoJCQlAdW5saW5rKCRkZWxkaXIuJy8nLiRmaWxlKTsKCQl9Cgl9CgkkbXlkaXItPmNsb3NlKCk7CglAY2htb2QoJGRlbGRpciwwNzc3KTsKCXJldHVybiBAcm1kaXIoJGRlbGRpcikgPyAxIDogMDsKfQoKLy8gQmFja2dyb3VuZApmdW5jdGlvbiBiZygpIHsKCWdsb2JhbCAkYmdjOwoJcmV0dXJuICgkYmdjKyslMj09MCkgPyAnYWx0MScgOiAnYWx0Mic7Cn0KCi8vIEdldCBwYXRoCmZ1bmN0aW9uIGdldFBhdGgoJHNjcmlwdHBhdGgsICRub3dwYXRoKSB7CglpZiAoJG5vd3BhdGggPT0gJy4nKSB7CgkJJG5vd3BhdGggPSAkc2NyaXB0cGF0aDsKCX0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7Cgkkbm93cGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5vd3BhdGgpOwoJaWYgKHN1YnN0cigkbm93cGF0aCwgLTEpICE9ICcvJykgewoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOwoJfQoJcmV0dXJuICRub3dwYXRoOwp9CgovLyBHZXQgdXAgcGF0aApmdW5jdGlvbiBnZXRVcFBhdGgoJG5vd3BhdGgpIHsKCSRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOwoJJG51bSA9IGNvdW50KCRwYXRoZGIpOwoJaWYgKCRudW0gPiAyKSB7CgkJdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7Cgl9CgkkdXBwYXRoID0gaW1wbG9kZSgnLycsICRwYXRoZGIpLicvJzsKCSR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOwoJcmV0dXJuICR1cHBhdGg7Cn0KCi8vIENvbmZpZwpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsKCSRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7CglpZiAoJHJlc3VsdCA9PSAwKSB7CgkJcmV0dXJuICdObyc7Cgl9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7CgkJcmV0dXJuICdZZXMnOwoJfSBlbHNlIHsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KfQoKLy8gRnVuY3Rpb24gbmFtZQpmdW5jdGlvbiBnZXRmdW4oJGZ1bk5hbWUpIHsKCXJldHVybiAoZmFsc2UgIT09IGZ1bmN0aW9uX2V4aXN0cygkZnVuTmFtZSkpID8gJ1llcycgOiAnTm8nOwp9CgpmdW5jdGlvbiBHZXRMaXN0KCRkaXIpewoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOwoJISRqICYmICRqPTE7CglpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgewoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewoJCQkkZj1zdHJfcmVwbGFjZSgnLy8nLCcvJywkZGlyLicvJy4kZmlsZSk7CgkJCWlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicgJiYgaXNfZGlyKCRmKSl7CgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7CgkJCQkJJGRpcmRhdGFbJGpdWydmaWxlbmFtZSddPXN0cl9yZXBsYWNlKCRub3dwYXRoLCcnLCRmKTsKCQkJCQkkZGlyZGF0YVskal1bJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGYpKTsKCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOwoJCQkJCSRkaXJkYXRhWyRqXVsnZGlycGVybSddPWdldFBlcm1zKCRmKTsKCQkJCQkkZGlyZGF0YVskal1bJ2RpcmxpbmsnXT11ZSgkZGlyKTsKCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7CgkJCQkJJGRpcmRhdGFbJGpdWydjbGllbnRfbGluayddPXVlKCRmKTsKCQkJCQkkaisrOwoJCQkJfQoJCQkJR2V0TGlzdCgkZik7CgkJCX0KCQl9CgkJY2xvc2VkaXIoJGRoKTsKCQljbGVhcnN0YXRjYWNoZSgpOwoJCXJldHVybiAkZGlyZGF0YTsKCX0gZWxzZSB7CgkJcmV0dXJuIGFycmF5KCk7Cgl9Cn0KCmZ1bmN0aW9uIHF5KCRzcWwpIHsKCS8vZWNobyAkc3FsLic8YnI+JzsKCSRyZXMgPSAkZXJyb3IgPSAnJzsKCWlmKCEkcmVzID0gQG15c3FsX3F1ZXJ5KCRzcWwpKSB7CgkJcmV0dXJuIDA7Cgl9IGVsc2UgaWYoaXNfcmVzb3VyY2UoJHJlcykpIHsKCQlyZXR1cm4gMTsKCX0gZWxzZSB7CgkJcmV0dXJuIDI7Cgl9CglyZXR1cm4gMDsKfQoKZnVuY3Rpb24gcSgkc3FsKSB7CglyZXR1cm4gQG15c3FsX3F1ZXJ5KCRzcWwpOwp9CgpmdW5jdGlvbiBmcigkcXkpewoJbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsKfQoKZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7CglpZigkc2l6ZSA+IDEwNzM3NDE4MjQpIHsKCQkkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTA3Mzc0MTgyNCAqIDEwMCkgLyAxMDAgLiAnIEcnOwoJfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7CgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNDg1NzYgKiAxMDApIC8gMTAwIC4gJyBNJzsKCX0gZWxzZWlmKCRzaXplID4gMTAyNCkgewoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7Cgl9IGVsc2UgewoJCSRzaXplID0gJHNpemUgLiAnIEInOwoJfQoJcmV0dXJuICRzaXplOwp9CgovLyBaaXAKY2xhc3MgUEhQWmlwewoJdmFyICRvdXQ9Jyc7CglmdW5jdGlvbiBQSFBaaXAoJGRpcikJewoJCWlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpCXsKCQkJJGN1cmRpciA9IGdldGN3ZCgpOwoJCQlpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbGlzdCA9ICRkaXI7CgkJCWVsc2V7CgkJCQkkZmlsZWxpc3Q9JHRoaXMgLT4gR2V0RmlsZUxpc3QoJGRpcik7Ly9GaWxlIGxpc3QKCQkJCWZvcmVhY2goJGZpbGVsaXN0IGFzICRrPT4kdikgJGZpbGVsaXN0W109c3Vic3RyKCR2LHN0cmxlbigkZGlyKSsxKTsKCQkJfQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsKCQkJZWxzZSBjaGRpcigkY3VyZGlyKTsKCQkJaWYgKGNvdW50KCRmaWxlbGlzdCk+MCl7CgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpewoJCQkJCWlmIChpc19maWxlKCRmaWxlbmFtZSkpewoJCQkJCQkkZmQgPSBmb3BlbiAoJGZpbGVuYW1lLCAncicpOwoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsKCQkJCQkJZmNsb3NlICgkZmQpOwoJCQkJCQlpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7CgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7CgkJCQkJfQoJCQkJfQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsKCQkJCWNoZGlyKCRjdXJkaXIpOwoJCQl9CgkJCXJldHVybiAxOwoJCX0KCQllbHNlIHJldHVybiAwOwoJfQoKCS8vIFNob3cgZmlsZSBsaXN0CglmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsKCQlzdGF0aWMgJGE7CgkJaWYgKGlzX2RpcigkZGlyKSkgewoJCQlpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgewoJCQkJd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7CgkJCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyl7CgkJCQkJCSRmPSRkaXIgLicvJy4gJGZpbGU7CgkJCQkJCWlmKGlzX2RpcigkZikpICR0aGlzLT5HZXRGaWxlTGlzdCgkZik7CgkJCQkJCSRhW109JGY7CgkJCQkJfQoJCQkJfQoJCQkJY2xvc2VkaXIoJGRoKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGE7Cgl9CgoJdmFyICRkYXRhc2VjICAgICAgPSBhcnJheSgpOwoJdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOwoJdmFyICRlb2ZfY3RybF9kaXIgPSAiXHg1MFx4NGJceDA1XHgwNlx4MDBceDAwXHgwMFx4MDAiOwoJdmFyICRvbGRfb2Zmc2V0ICAgPSAwOwoKCWZ1bmN0aW9uIHVuaXgyRG9zVGltZSgkdW5peHRpbWUgPSAwKSB7CgkJJHRpbWVhcnJheSA9ICgkdW5peHRpbWUgPT0gMCkgPyBnZXRkYXRlKCkgOiBnZXRkYXRlKCR1bml4dGltZSk7CgkJaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsKCQkJJHRpbWVhcnJheVsneWVhciddICAgID0gMTk4MDsKCQkJJHRpbWVhcnJheVsnbW9uJ10gICAgID0gMTsKCQkJJHRpbWVhcnJheVsnbWRheSddICAgID0gMTsKCQkJJHRpbWVhcnJheVsnaG91cnMnXSAgID0gMDsKCQkJJHRpbWVhcnJheVsnbWludXRlcyddID0gMDsKCQkJJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsKCQl9IC8vIGVuZCBpZgoJCXJldHVybiAoKCR0aW1lYXJyYXlbJ3llYXInXSAtIDE5ODApIDw8IDI1KSB8ICgkdGltZWFycmF5Wydtb24nXSA8PCAyMSkgfCAoJHRpbWVhcnJheVsnbWRheSddIDw8IDE2KSB8CgkJCQkoJHRpbWVhcnJheVsnaG91cnMnXSA8PCAxMSkgfCAoJHRpbWVhcnJheVsnbWludXRlcyddIDw8IDUpIHwgKCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PiAxKTsKCX0KCglmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7CgkJJG5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRuYW1lKTsKCgkJJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsKCQkkaGV4ZHRpbWUJPSAnXHgnIC4gJGR0aW1lWzZdIC4gJGR0aW1lWzddCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzRdIC4gJGR0aW1lWzVdCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzBdIC4gJGR0aW1lWzFdOwoJCWV2YWwoJyRoZXhkdGltZSA9ICInIC4gJGhleGR0aW1lIC4gJyI7Jyk7CgkJJGZyCT0gIlx4NTBceDRiXHgwM1x4MDQiOwoJCSRmcgkuPSAiXHgxNFx4MDAiOwoJCSRmcgkuPSAiXHgwMFx4MDAiOwoJCSRmcgkuPSAiXHgwOFx4MDAiOwoJCSRmcgkuPSAkaGV4ZHRpbWU7CgoJCSR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsKCQkkY3JjID0gY3JjMzIoJGRhdGEpOwoJCSR6ZGF0YSA9IGd6Y29tcHJlc3MoJGRhdGEpOwoJCSRjX2xlbiA9IHN0cmxlbigkemRhdGEpOwoJCSR6ZGF0YSA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsKCQkkZnIgLj0gcGFjaygnVicsICRjcmMpOwoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsKCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsKCQkkZnIgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkpOwoJCSRmciAuPSBwYWNrKCd2JywgMCk7CgkJJGZyIC49ICRuYW1lOwoJCSRmciAuPSAkemRhdGE7CgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsKCQkkZnIgLj0gcGFjaygnVicsICRjX2xlbik7CgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7CgoJCSR0aGlzIC0+IGRhdGFzZWNbXSA9ICRmcjsKCQkkbmV3X29mZnNldCA9IHN0cmxlbihpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYykpOwoKCQkkY2RyZWMgPSAiXHg1MFx4NGJceDAxXHgwMiI7CgkJJGNkcmVjIC49ICJceDAwXHgwMCI7CgkJJGNkcmVjIC49ICJceDE0XHgwMCI7CgkJJGNkcmVjIC49ICJceDAwXHgwMCI7CgkJJGNkcmVjIC49ICJceDA4XHgwMCI7CgkJJGNkcmVjIC49ICRoZXhkdGltZTsKCQkkY2RyZWMgLj0gcGFjaygnVicsICRjcmMpOwoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJGNfbGVuKTsKCQkkY2RyZWMgLj0gcGFjaygnVicsICR1bmNfbGVuKTsKCQkkY2RyZWMgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkgKTsKCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsKCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsKCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsKCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsKCQkkY2RyZWMgLj0gcGFjaygnVicsIDMyICk7CgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkdGhpcyAtPiBvbGRfb2Zmc2V0ICk7CgkJJHRoaXMgLT4gb2xkX29mZnNldCA9ICRuZXdfb2Zmc2V0OwoJCSRjZHJlYyAuPSAkbmFtZTsKCgkJJHRoaXMgLT4gY3RybF9kaXJbXSA9ICRjZHJlYzsKCX0KCglmdW5jdGlvbiBmaWxlKCkgewoJCSRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7CgkJJGN0cmxkaXIgPSBpbXBsb2RlKCcnLCAkdGhpcyAtPiBjdHJsX2Rpcik7CgkJcmV0dXJuICRkYXRhIC4gJGN0cmxkaXIgLiAkdGhpcyAtPiBlb2ZfY3RybF9kaXIgLiBwYWNrKCd2Jywgc2l6ZW9mKCR0aGlzIC0+IGN0cmxfZGlyKSkgLiBwYWNrKCd2Jywgc2l6ZW9mKCR0aGlzIC0+IGN0cmxfZGlyKSkgLglwYWNrKCdWJywgc3RybGVuKCRjdHJsZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRkYXRhKSkgLiAiXHgwMFx4MDAiOwoJfQp9CgovLyBEdW1wIG15c3FsCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcD0wKSB7CgkkdGFibGVkdW1wID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTICR0YWJsZTtcbiI7CgkkdGFibGVkdW1wIC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7CgoJJGZpcnN0ZmllbGQ9MTsKCgkkZmllbGRzID0gcSgiU0hPVyBGSUVMRFMgRlJPTSAkdGFibGUiKTsKCXdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgewoJCWlmICghJGZpcnN0ZmllbGQpIHsKCQkJJHRhYmxlZHVtcCAuPSAiLFxuIjsKCQl9IGVsc2UgewoJCQkkZmlyc3RmaWVsZD0wOwoJCX0KCQkkdGFibGVkdW1wIC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7CgkJaWYgKCFlbXB0eSgkZmllbGRbIkRlZmF1bHQiXSkpIHsKCQkJJHRhYmxlZHVtcCAuPSAiIERFRkFVTFQgJyRmaWVsZFtEZWZhdWx0XSciOwoJCX0KCQlpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsKCQkJJHRhYmxlZHVtcCAuPSAiIE5PVCBOVUxMIjsKCQl9CgkJaWYgKCRmaWVsZFsnRXh0cmEnXSAhPSAiIikgewoJCQkkdGFibGVkdW1wIC49ICIgJGZpZWxkW0V4dHJhXSI7CgkJfQoJfQoJZnIoJGZpZWxkcyk7CgoJJGtleXMgPSBxKCJTSE9XIEtFWVMgRlJPTSAkdGFibGUiKTsKCXdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7CgkJJGtuYW1lPSRrZXlbJ0tleV9uYW1lJ107CgkJaWYgKCRrbmFtZSAhPSAiUFJJTUFSWSIgJiYgJGtleVsnTm9uX3VuaXF1ZSddID09IDApIHsKCQkJJGtuYW1lPSJVTklRVUV8JGtuYW1lIjsKCQl9CgkJaWYoIWlzX2FycmF5KCRpbmRleFska25hbWVdKSkgewoJCQkkaW5kZXhbJGtuYW1lXSA9IGFycmF5KCk7CgkJfQoJCSRpbmRleFska25hbWVdW10gPSAka2V5WydDb2x1bW5fbmFtZSddOwoJfQoJZnIoJGtleXMpOwoKCXdoaWxlKGxpc3QoJGtuYW1lLCAkY29sdW1ucykgPSBAZWFjaCgkaW5kZXgpKSB7CgkJJHRhYmxlZHVtcCAuPSAiLFxuIjsKCQkkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOwoKCQlpZiAoJGtuYW1lID09ICJQUklNQVJZIikgewoJCQkkdGFibGVkdW1wIC49ICIgICBQUklNQVJZIEtFWSAoJGNvbG5hbWVzKSI7CgkJfSBlbHNlIHsKCQkJaWYgKHN1YnN0cigka25hbWUsMCw2KSA9PSAiVU5JUVVFIikgewoJCQkJJGtuYW1lPXN1YnN0cigka25hbWUsNyk7CgkJCX0KCQkJJHRhYmxlZHVtcCAuPSAiICAgS0VZICRrbmFtZSAoJGNvbG5hbWVzKSI7CgkJfQoJfQoKCSR0YWJsZWR1bXAgLj0gIlxuKTtcblxuIjsKCWlmICgkZnApIHsKCQlmd3JpdGUoJGZwLCR0YWJsZWR1bXApOwoJfSBlbHNlIHsKCQllY2hvICR0YWJsZWR1bXA7Cgl9CgoJJHJvd3MgPSBxKCJTRUxFQ1QgKiBGUk9NICR0YWJsZSIpOwoJJG51bWZpZWxkcyA9IG15c3FsX251bV9maWVsZHMoJHJvd3MpOwoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsKCQkkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsKCgkJJGZpZWxkY291bnRlcj0tMTsKCQkkZmlyc3RmaWVsZD0xOwoJCXdoaWxlICgrKyRmaWVsZGNvdW50ZXI8JG51bWZpZWxkcykgewoJCQlpZiAoISRmaXJzdGZpZWxkKSB7CgkJCQkkdGFibGVkdW1wLj0iLCAiOwoJCQl9IGVsc2UgewoJCQkJJGZpcnN0ZmllbGQ9MDsKCQkJfQoKCQkJaWYgKCFpc3NldCgkcm93WyRmaWVsZGNvdW50ZXJdKSkgewoJCQkJJHRhYmxlZHVtcCAuPSAiTlVMTCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFibGVkdW1wIC49ICInIi5teXNxbF9lc2NhcGVfc3RyaW5nKCRyb3dbJGZpZWxkY291bnRlcl0pLiInIjsKCQkJfQoJCX0KCgkJJHRhYmxlZHVtcCAuPSAiKTtcbiI7CgoJCWlmICgkZnApIHsKCQkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsKCQl9IGVsc2UgewoJCQllY2hvICR0YWJsZWR1bXA7CgkJfQoJfQoJZnIoJHJvd3MpOwoJaWYgKCRmcCkgewoJCWZ3cml0ZSgkZnAsIlxuIik7Cgl9IGVsc2UgewoJCWVjaG8gIlxuIjsKCX0KfQoKZnVuY3Rpb24gdWUoJHN0cil7CglyZXR1cm4gdXJsZW5jb2RlKCRzdHIpOwp9CgpmdW5jdGlvbiBwKCRzdHIpewoJZWNobyAkc3RyLiJcbiI7Cn0KCmZ1bmN0aW9uIHRiaGVhZCgpIHsKCXAoJzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPicpOwp9CmZ1bmN0aW9uIHRiZm9vdCgpewoJcCgnPC90YWJsZT4nKTsKfQoKZnVuY3Rpb24gbWFrZWhpZGUoJG5hbWUsJHZhbHVlPScnKXsKCXAoIjxpbnB1dCBpZD1cIiRuYW1lXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIkbmFtZVwiIHZhbHVlPVwiJHZhbHVlXCIgLz4iKTsKfQoKZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsKCSRhcmdbJ3NpemUnXSA9ICRhcmdbJ3NpemUnXSA+IDAgPyAic2l6ZT1cIiRhcmdbc2l6ZV1cIiIgOiAic2l6ZT1cIjEwMFwiIjsKCSRhcmdbJ2V4dHJhJ10gPSAkYXJnWydleHRyYSddID8gJGFyZ1snZXh0cmEnXSA6ICcnOwoJISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7CgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10uJzxiciAvPicgOiAnJzsKCSRhcmdbJ2NsYXNzJ10gPSAkYXJnWydjbGFzcyddID8gJGFyZ1snY2xhc3MnXSA6ICdpbnB1dCc7CglpZiAoJGFyZ1snbmV3bGluZSddKSB7CgkJcCgiPHA+JGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPjwvcD4iKTsKCX0gZWxzZSB7CgkJcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOwoJfQp9CgpmdW5jdGlvbiBtYWtlc2VsZWN0KCRhcmcgPSBhcnJheSgpKXsKCWlmICgkYXJnWydvbmNoYW5nZSddKSB7CgkJJG9uY2hhbmdlID0gJ29uY2hhbmdlPSInLiRhcmdbJ29uY2hhbmdlJ10uJyInOwoJfQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddIDogJyc7CglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsKCXAoIiRhcmdbdGl0bGVdIDxzZWxlY3QgY2xhc3M9XCJpbnB1dFwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgJG9uY2hhbmdlPiIpOwoJCWlmIChpc19hcnJheSgkYXJnWydvcHRpb24nXSkpIHsKCQkJZm9yZWFjaCAoJGFyZ1snb3B0aW9uJ10gYXMgJGtleT0+JHZhbHVlKSB7CgkJCQlpZiAoJGFyZ1snc2VsZWN0ZWQnXT09JGtleSkgewoJCQkJCXAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCIgc2VsZWN0ZWQ+JHZhbHVlPC9vcHRpb24+Iik7CgkJCQl9IGVsc2UgewoJCQkJCXAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCI+JHZhbHVlPC9vcHRpb24+Iik7CgkJCQl9CgkJCX0KCQl9CglwKCI8L3NlbGVjdD4iKTsKCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzwvcD4nKTsKfQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgewoJISRhcmdbJ21ldGhvZCddICYmICRhcmdbJ21ldGhvZCddID0gJ3Bvc3QnOwoJISRhcmdbJ2FjdGlvbiddICYmICRhcmdbJ2FjdGlvbiddID0gJHNlbGY7CgkkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOwoJISRhcmdbJ25hbWUnXSAmJiAkYXJnWyduYW1lJ10gPSAnZm9ybTEnOwoJcCgiPGZvcm0gbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiBhY3Rpb249XCIkYXJnW2FjdGlvbl1cIiBtZXRob2Q9XCIkYXJnW21ldGhvZF1cIiAkYXJnW3RhcmdldF0+Iik7CglpZiAoJGFyZ1sndGl0bGUnXSkgewoJCXAoJzxoMj4nLiRhcmdbJ3RpdGxlJ10uJyAmcmFxdW87PC9oMj4nKTsKCX0KfQoKZnVuY3Rpb24gbWFrZXRleHQoJGFyZyA9IGFycmF5KCkpewoJISRhcmdbJ2NvbHMnXSAmJiAkYXJnWydjb2xzJ10gPSAxMDA7CgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1OwoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7CglwKCI8cD4kYXJnW3RpdGxlXTx0ZXh0YXJlYSBjbGFzcz1cImFyZWFcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGNvbHM9XCIkYXJnW2NvbHNdXCIgcm93cz1cIiRhcmdbcm93c11cIiAkYXJnW2V4dHJhXT4kYXJnW3ZhbHVlXTwvdGV4dGFyZWE+PC9wPiIpOwp9CgpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpewoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7CglwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInLiRuYW1lLiciIGlkPVwiJy4kbmFtZS4nXCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij48L3A+Jyk7CglwKCc8L2Zvcm0+Jyk7Cn0KCmZ1bmN0aW9uIGZvcm1mb290KCl7CglwKCc8L2Zvcm0+Jyk7Cn0KCi8vIEV4aXQKZnVuY3Rpb24gcHIoJGEpIHsKCWVjaG8gJzxwcmU+JzsKCXByaW50X3IoJGEpOwoJZWNobyAnPC9wcmU+JzsKfQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement