ZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGtpbnRlci5weSBiL0xpYi9saWItdGsvVGtpbnRlci5weQppbmRleCBmMmM5YTkxLi5iNWMwN2NiIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL1RraW50ZXIucHkKKysrIGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CkBAIC0zLDkgKzMsMTIgQEAKIFRraW50ZXIgcHJvdmlkZXMgY2xhc3NlcyB3aGljaCBhbGxvdyB0aGUgZGlzcGxheSwgcG9zaXRpb25pbmcgYW5kCiBjb250cm9sIG9mIHdpZGdldHMuIFRvcGxldmVsIHdpZGdldHMgYXJlIFRrIGFuZCBUb3BsZXZlbC4gT3RoZXIKIHdpZGdldHMgYXJlIEZyYW1lLCBMYWJlbCwgRW50cnksIFRleHQsIENhbnZhcywgQnV0dG9uLCBSYWRpb2J1dHRvbiwKLUNoZWNrYnV0dG9uLCBTY2FsZSwgTGlzdGJveCwgU2Nyb2xsYmFyLCBPcHRpb25NZW51LiBQcm9wZXJ0aWVzIG9mIHRoZQotd2lkZ2V0cyBhcmUgc3BlY2lmaWVkIHdpdGgga2V5d29yZCBhcmd1bWVudHMuICBLZXl3b3JkIGFyZ3VtZW50cyBoYXZlCi10aGUgc2FtZSBuYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIHVuZGVyIFRrLgorQ2hlY2tidXR0b24sIFNjYWxlLCBMaXN0Ym94LCBTY3JvbGxiYXIsIE9wdGlvbk1lbnUsIFNwaW5ib3gKK0xhYmVsRnJhbWUgYW5kIFBhbmVkV2luZG93LiAKKworUHJvcGVydGllcyBvZiB0aGUgd2lkZ2V0cyBhcmUgc3BlY2lmaWVkIHdpdGgga2V5d29yZCBhcmd1bWVudHMuICAKK0tleXdvcmQgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSAKK3VuZGVyIFRrLgogCiBXaWRnZXRzIGFyZSBwb3NpdGlvbmVkIHdpdGggb25lIG9mIHRoZSBnZW9tZXRyeSBtYW5hZ2VycyBQbGFjZSwgUGFjawogb3IgR3JpZC4gVGhlc2UgbWFuYWdlcnMgY2FuIGJlIGNhbGxlZCB3aXRoIG1ldGhvZHMgcGxhY2UsIHBhY2ssIGdyaWQKQEAgLTEzMDcsNiArMTMxMCw3IEBACiAKIGNsYXNzIFdtOgogICAgICIiIlByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd2luZG93IG1hbmFnZXIuIiIiCisgICAgCiAgICAgZGVmIHdtX2FzcGVjdChzZWxmLAogICAgICAgICAgICAgICBtaW5OdW1lcj1Ob25lLCBtaW5EZW5vbT1Ob25lLAogICAgICAgICAgICAgICBtYXhOdW1lcj1Ob25lLCBtYXhEZW5vbT1Ob25lKToKQEAgLTEzMTgsNiArMTMyMiwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgbWluTnVtZXIsIG1pbkRlbm9tLAogICAgICAgICAgICAgICAgICAgICAgbWF4TnVtZXIsIG1heERlbm9tKSkKICAgICBhc3BlY3QgPSB3bV9hc3BlY3QKKyAgICAKKyAgICBkZWYgd21fYXR0cmlidXRlcyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlRoaXMgc3ViY29tbWFuZCByZXR1cm5zIG9yIHNldHMgcGxhdGZvcm0gc3BlY2lmaWMgYXR0cmlidXRlcworICAgICAgICAKKyAgICAgICAgVGhlIGZpcnN0IGZvcm0gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGZsYWdzIGFuZCAKKyAgICAgICAgdGhlaXIgdmFsdWVzLiBUaGUgc2Vjb25kIGZvcm0gcmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYyAKKyAgICAgICAgb3B0aW9uLiBUaGUgdGhpcmQgZm9ybSBzZXRzIG9uZSBvciBtb3JlIG9mIHRoZSB2YWx1ZXMuIFRoZSB2YWx1ZXMKKyAgICAgICAgYXJlIGFzIGZvbGxvd3M6CisgICAgICAgIAorICAgICAgICBPbiBXaW5kb3dzLCAtZGlzYWJsZWQgZ2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBpbiBhIAorICAgICAgICBkaXNhYmxlZCBzdGF0ZS4gLXRvb2x3aW5kb3cgZ2V0cyBvciBzZXRzIHRoZSBzdHlsZSBvZiB0aGUgd2luZG93CisgICAgICAgIHRvIHRvb2x3aW5kb3cgKGFzIGRlZmluZWQgaW4gdGhlIE1TRE4pLiAtdG9wbW9zdCBnZXRzIG9yIHNldHMgCisgICAgICAgIHdoZXRoZXIgdGhpcyBpcyBhIHRvcG1vc3Qgd2luZG93IChkaXNwbGF5cyBhYm92ZSBhbGwgb3RoZXIgCisgICAgICAgIHdpbmRvd3MpLgorICAgICAgICAKKyAgICAgICAgT24gTWFjaW50b3NoLCBYWFhYWCAKKyAgICAgICAgCisgICAgICAgIE9uIFVuaXgsIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgdmFsdWVzLgorICAgICAgICAiIiIKKyAgICAgICAgYXJncyA9ICgnd20nLCAnYXR0cmlidXRlcycsIHNlbGYuX3cpICsgYXJncworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKGFyZ3MpCisgICAgYXR0cmlidXRlcz13bV9hdHRyaWJ1dGVzCisgICAgCiAgICAgZGVmIHdtX2NsaWVudChzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgICAiIiJTdG9yZSBOQU1FIGluIFdNX0NMSUVOVF9NQUNISU5FIHByb3BlcnR5IG9mIHRoaXMgd2lkZ2V0LiBSZXR1cm4KICAgICAgICAgY3VycmVudCB2YWx1ZS4iIiIKQEAgLTE4MTYsMjcgKzE4NDMsNjAgQEAKICAgICAiIiJCdXR0b24gd2lkZ2V0LiIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgYnV0dG9uIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgotCi0gICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsCi0gICAgICAgIGJhY2tncm91bmQsIGJkLCBiZywgYml0bWFwLCBib3JkZXJ3aWR0aCwgY29tbWFuZCwgY3Vyc29yLCBkZWZhdWx0LAotICAgICAgICBkaXNhYmxlZGZvcmVncm91bmQsIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBoZWlnaHQsCi0gICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsIGltYWdlLAotICAgICAgICBqdXN0aWZ5LCBwYWR4LCBwYWR5LCByZWxpZWYsIHN0YXRlLCB0YWtlZm9jdXMsIHRleHQsIHRleHR2YXJpYWJsZSwKLSAgICAgICAgdW5kZXJsaW5lLCB3aWR0aCwgd3JhcGxlbmd0aC4iIiIKKyAgICAgICAgCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKyAgICAgICAgCisgICAgICAgICAgICBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBiaXRtYXAsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgICAgICBkaXNhYmxlZGZvcmVncm91bmQsIGZvbnQsIGZvcmVncm91bmQgCisgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW1hZ2UsIGp1c3RpZnksIAorICAgICAgICAgICAgcGFkeCwgcGFkeSwgcmVsaWVmLCByZXBlYXRkZWxheSwKKyAgICAgICAgICAgIHJlcGVhdGludGVydmFsLCB0YWtlZm9jdXMsIHRleHQsIAorICAgICAgICAgICAgdGV4dHZhcmlhYmxlLCB1bmRlcmxpbmUsIHdyYXBsZW5ndGgKKyAgICAgICAgCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisgICAgICAgIAorICAgICAgICAgICAgY29tbWFuZCwgY29tcG91bmQsIGRlZmF1bHQsIGhlaWdodCwKKyAgICAgICAgICAgIG92ZXJyZWxpZWYsIHN0YXRlLCB3aWR0aAorICAgICAgICAiIiIKICAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2J1dHRvbicsIGNuZiwga3cpCisgICAgICAgIAogICAgIGRlZiB0a0J1dHRvbkVudGVyKHNlbGYsICpkdW1teSk6CiAgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25FbnRlcicsIHNlbGYuX3cpCisgICAgICAgIAogICAgIGRlZiB0a0J1dHRvbkxlYXZlKHNlbGYsICpkdW1teSk6CiAgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25MZWF2ZScsIHNlbGYuX3cpCisgICAgICAgIAogICAgIGRlZiB0a0J1dHRvbkRvd24oc2VsZiwgKmR1bW15KToKICAgICAgICAgc2VsZi50ay5jYWxsKCd0a0J1dHRvbkRvd24nLCBzZWxmLl93KQorICAgICAgICAKICAgICBkZWYgdGtCdXR0b25VcChzZWxmLCAqZHVtbXkpOgogICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrQnV0dG9uVXAnLCBzZWxmLl93KQorICAgICAgICAKICAgICBkZWYgdGtCdXR0b25JbnZva2Uoc2VsZiwgKmR1bW15KToKICAgICAgICAgc2VsZi50ay5jYWxsKCd0a0J1dHRvbkludm9rZScsIHNlbGYuX3cpCisgICAgICAgIAogICAgIGRlZiBmbGFzaChzZWxmKToKKyAgICAgICAgIiIiRmxhc2ggdGhlIGJ1dHRvbi4gCisgICAgICAgIAorICAgICAgICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSByZWRpc3BsYXlpbmcgCisgICAgICAgIHRoZSBidXR0b24gc2V2ZXJhbCB0aW1lcywgYWx0ZXJuYXRpbmcgYmV0d2VlbiBhY3RpdmUgYW5kIAorICAgICAgICBub3JtYWwgY29sb3JzLiBBdCB0aGUgZW5kIG9mIHRoZSBmbGFzaCB0aGUgYnV0dG9uIGlzIGxlZnQgCisgICAgICAgIGluIHRoZSBzYW1lIG5vcm1hbC9hY3RpdmUgc3RhdGUgYXMgd2hlbiB0aGUgY29tbWFuZCB3YXMgCisgICAgICAgIGludm9rZWQuIFRoaXMgY29tbWFuZCBpcyBpZ25vcmVkIGlmIHRoZSBidXR0b24ncyBzdGF0ZSBpcyAKKyAgICAgICAgZGlzYWJsZWQuCisgICAgICAgICIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZsYXNoJykKKyAgICAgICAgCiAgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnV0dG9uLiAKKyAgICAgICAgCisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kLCAKKyAgICAgICAgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRoZSBidXR0b24uIFRoaXMgY29tbWFuZCBpcyBpZ25vcmVkIGlmIHRoZSBidXR0b24ncyBzdGF0ZQorICAgICAgICBpcyBkaXNhYmxlZC4KKyAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScpCiAKICMgSW5kaWNlczoKQEAgLTIyNDksMTIgKzIzMDksMjIgQEAKICAgICAiIiJMYWJlbCB3aWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgdGV4dCBhbmQgYml0bWFwcy4iIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIGxhYmVsIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgotCi0gICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBhbmNob3IsIGJhY2tncm91bmQsIGJkLCBiZywgYml0bWFwLAotICAgICAgICBib3JkZXJ3aWR0aCwgY3Vyc29yLCBmZywgZm9udCwgZm9yZWdyb3VuZCwgaGVpZ2h0LAotICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbWFnZSwKLSAgICAgICAganVzdGlmeSwgcGFkeCwgcGFkeSwgcmVsaWVmLCB0YWtlZm9jdXMsIHRleHQsIHRleHR2YXJpYWJsZSwKLSAgICAgICAgdW5kZXJsaW5lLCB3aWR0aCwgd3JhcGxlbmd0aC4iIiIKKyAgICAgICAgCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKyAgICAgICAgCisgICAgICAgICAgICBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsIAorICAgICAgICAgICAgYmFja2dyb3VuZCwgYml0bWFwLCBib3JkZXJ3aWR0aCwgY3Vyc29yLCAKKyAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCAKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW1hZ2UsIGp1c3RpZnksIAorICAgICAgICAgICAgcGFkeCwgcGFkeSwgcmVsaWVmLCB0YWtlZm9jdXMsIHRleHQsIAorICAgICAgICAgICAgdGV4dHZhcmlhYmxlLCB1bmRlcmxpbmUsIHdyYXBsZW5ndGgKKyAgICAgICAgCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisgICAgICAgIAorICAgICAgICAgICAgaGVpZ2h0LCBzdGF0ZSwgd2lkdGgKKyAgICAgICAgICAgIAorICAgICAgICAiIiIKICAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2xhYmVsJywgY25mLCBrdykKIAogY2xhc3MgTGlzdGJveChXaWRnZXQpOgpAQCAtMjU5MSwyMCArMjY2MSwzNCBAQAogICAgICAgICAiIiJTZXQgdGhlIGZyYWN0aW9uYWwgdmFsdWVzIG9mIHRoZSBzbGlkZXIgcG9zaXRpb24gKHVwcGVyIGFuZAogICAgICAgICBsb3dlciBlbmRzIGFzIHZhbHVlIGJldHdlZW4gMCBhbmQgMSkuIiIiCiAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3NldCcpICsgYXJncykKLQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAogY2xhc3MgVGV4dChXaWRnZXQpOgogICAgICIiIlRleHQgd2lkZ2V0IHdoaWNoIGNhbiBkaXNwbGF5IHRleHQgaW4gdmFyaW91cyBmb3Jtcy4iIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIHRleHQgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisgICAgICAgIAorICAgICAgICBTVEFOREFSRCBPUFRJT05TCisgICAgICAgIAorICAgICAgICAgICAgYmFja2dyb3VuZCwgYm9yZGVyd2lkdGgsIGN1cnNvciwKKyAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbnNlcnRiYWNrZ3JvdW5kLAorICAgICAgICAgICAgaW5zZXJ0Ym9yZGVyd2lkdGgsIGluc2VydG9mZnRpbWUsCisgICAgICAgICAgICBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBwYWR4LCBwYWR5LAorICAgICAgICAgICAgcmVsaWVmLCBzZWxlY3RiYWNrZ3JvdW5kLCAKKyAgICAgICAgICAgIHNlbGVjdGJvcmRlcndpZHRoLCBzZWxlY3Rmb3JlZ3JvdW5kLAorICAgICAgICAgICAgc2V0Z3JpZCwgdGFrZWZvY3VzLCAKKyAgICAgICAgICAgIHhzY3JvbGxjb21tYW5kLCB5c2Nyb2xsY29tbWFuZCwKIAotICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgYmQsIGJnLCBib3JkZXJ3aWR0aCwgY3Vyc29yLAotICAgICAgICBleHBvcnRzZWxlY3Rpb24sIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBoZWlnaHQsCi0gICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsCi0gICAgICAgIGluc2VydGJhY2tncm91bmQsIGluc2VydGJvcmRlcndpZHRoLCBpbnNlcnRvZmZ0aW1lLAotICAgICAgICBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBwYWR4LCBwYWR5LCByZWxpZWYsCi0gICAgICAgIHNlbGVjdGJhY2tncm91bmQsIHNlbGVjdGJvcmRlcndpZHRoLCBzZWxlY3Rmb3JlZ3JvdW5kLAotICAgICAgICBzZXRncmlkLCBzcGFjaW5nMSwgc3BhY2luZzIsIHNwYWNpbmczLCBzdGF0ZSwgdGFicywgdGFrZWZvY3VzLAotICAgICAgICB3aWR0aCwgd3JhcCwgeHNjcm9sbGNvbW1hbmQsIHlzY3JvbGxjb21tYW5kLiIiIgorICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworICAgICAgICAKKyAgICAgICAgICAgIGF1dG9zZXBhcmF0b3JzLCBoZWlnaHQsIG1heHVuZG8sCisgICAgICAgICAgICBzcGFjaW5nMSwgc3BhY2luZzIsIHNwYWNpbmczLCAKKyAgICAgICAgICAgIHN0YXRlLCB0YWJzLCB1bmRvLCB3aWR0aCwgd3JhcCwKKyAgICAgICAgCisgICAgICAgICIiIgogICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGV4dCcsIGNuZiwga3cpCiAgICAgZGVmIGJib3goc2VsZiwgKmFyZ3MpOgogICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiAoeCx5LHdpZHRoLGhlaWdodCkgd2hpY2ggZ2l2ZXMgdGhlIGJvdW5kaW5nCkBAIC0yNjc1LDYgKzI3NTksNjggQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIGZ1bmNfbmFtZToKICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQoZnVuY19uYW1lKQorICAgICAgICAgICAgICAgIAorICAgICMjIG5ldyBpbiB0azguNAorICAgIGRlZiBlZGl0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kCisgICAgICAgIAorICAgICAgICBUaGlzIG1ldGhvZCBjb250cm9scyB0aGUgdW5kbyBtZWNoYW5pc20gYW5kIAorICAgICAgICB0aGUgbW9kaWZpZWQgZmxhZy4gVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoZSAKKyAgICAgICAgY29tbWFuZCBkZXBlbmRzIG9uIHRoZSBvcHRpb24gYXJndW1lbnQgdGhhdCAKKyAgICAgICAgZm9sbG93cyB0aGUgZWRpdCBhcmd1bWVudC4gVGhlIGZvbGxvd2luZyBmb3JtcyAKKyAgICAgICAgb2YgdGhlIGNvbW1hbmQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgICAgICAgIAorICAgICAgICBlZGl0X21vZGlmaWVkLCBlZGl0X3JlZG8sIGVkaXRfcmVzZXQsIGVkaXRfc2VwYXJhdG9yCisgICAgICAgIGFuZCBlZGl0X3VuZG8KKyAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2VkaXQnKSArIGFyZ3MpKSBvciAoKQorCisgICAgZGVmIGVkaXRfbW9kaWZpZWQoc2VsZiwgYXJnPU5vbmUpOgorICAgICAgICAiIiJHZXQgb3IgU2V0IHRoZSBtb2RpZmllZCBmbGFnCisgICAgICAgIAorICAgICAgICBJZiBhcmcgaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbW9kaWZpZWQKKyAgICAgICAgZmxhZyBvZiB0aGUgd2lkZ2V0LiBUaGUgaW5zZXJ0LCBkZWxldGUsIGVkaXQgdW5kbyBhbmQgCisgICAgICAgIGVkaXQgcmVkbyBjb21tYW5kcyBvciB0aGUgdXNlciBjYW4gc2V0IG9yIGNsZWFyIHRoZSAKKyAgICAgICAgbW9kaWZpZWQgZmxhZy4gSWYgYm9vbGVhbiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIAorICAgICAgICBtb2RpZmllZCBmbGFnIG9mIHRoZSB3aWRnZXQgdG8gYXJnLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgibW9kaWZpZWQiLCBhcmcpCisgICAgICAgIAorICAgIGRlZiBlZGl0X3JlZG8oc2VsZik6CisgICAgICAgICIiIlJlZG8gdGhlIGxhc3QgdW5kb25lIGVkaXQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgV2hlbiB0aGUgdW5kbyBvcHRpb24gaXMgdHJ1ZSwgcmVhcHBsaWVzIHRoZSBsYXN0IAorICAgICAgICB1bmRvbmUgZWRpdHMgcHJvdmlkZWQgbm8gb3RoZXIgZWRpdHMgd2VyZSBkb25lIHNpbmNlIAorICAgICAgICB0aGVuLiBHZW5lcmF0ZXMgYW4gZXJyb3Igd2hlbiB0aGUgcmVkbyBzdGFjayBpcyBlbXB0eS4KKyAgICAgICAgRG9lcyBub3RoaW5nIHdoZW4gdGhlIHVuZG8gb3B0aW9uIGlzIGZhbHNlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgicmVkbyIpCisgICAgICAgIAorICAgIGRlZiBlZGl0X3Jlc2V0KHNlbGYpOgorICAgICAgICAiIiJDbGVhcnMgdGhlIHVuZG8gYW5kIHJlZG8gc3RhY2tzCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJyZXNldCIpCisgICAgICAgIAorICAgIGRlZiBlZGl0X3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgIiIiSW5zZXJ0cyBhIHNlcGFyYXRvciAoYm91bmRhcnkpIG9uIHRoZSB1bmRvIHN0YWNrLiAKKyAgICAgICAgCisgICAgICAgIERvZXMgbm90aGluZyB3aGVuIHRoZSB1bmRvIG9wdGlvbiBpcyBmYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgic2VwYXJhdG9yIikKKyAgICAgICAgCisgICAgZGVmIGVkaXRfdW5kbyhzZWxmKToKKyAgICAgICAgIiIiVW5kb2VzIHRoZSBsYXN0IGVkaXQgYWN0aW9uIAorICAgICAgICAKKyAgICAgICAgSWYgdGhlIHVuZG8gb3B0aW9uIGlzIHRydWUuIEFuIGVkaXQgYWN0aW9uIGlzIGRlZmluZWQgCisgICAgICAgIGFzIGFsbCB0aGUgaW5zZXJ0IGFuZCBkZWxldGUgY29tbWFuZHMgdGhhdCBhcmUgcmVjb3JkZWQgCisgICAgICAgIG9uIHRoZSB1bmRvIHN0YWNrIGluIGJldHdlZW4gdHdvIHNlcGFyYXRvcnMuIEdlbmVyYXRlcyAKKyAgICAgICAgYW4gZXJyb3Igd2hlbiB0aGUgdW5kbyBzdGFjayBpcyBlbXB0eS4gRG9lcyBub3RoaW5nIAorICAgICAgICB3aGVuIHRoZSB1bmRvIG9wdGlvbiBpcyBmYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgidW5kbyIpCisgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBkZWYgZ2V0KHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRleHQgZnJvbSBJTkRFWDEgdG8gSU5ERVgyIChub3QgaW5jbHVkZWQpLiIiIgogICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnLCBpbmRleDEsIGluZGV4MikKQEAgLTI4NjksNiArMzAxNSw3IEBACiAgICAgICAgICIiIk9ic29sZXRlIGZ1bmN0aW9uLCB1c2Ugc2VlLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICd5dmlldycsICctcGlja3BsYWNlJykgKyB3aGF0KQogCisKIGNsYXNzIF9zZXRpdDoKICAgICAiIiJJbnRlcm5hbCBjbGFzcy4gSXQgd3JhcHMgdGhlIGNvbW1hbmQgaW4gdGhlIHdpZGdldCBPcHRpb25NZW51LiIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YXIsIHZhbHVlLCBjYWxsYmFjaz1Ob25lKToKQEAgLTMwNDgsNiArMzE5NSwzODEgQEAKIGRlZiBpbWFnZV9uYW1lcygpOiByZXR1cm4gX2RlZmF1bHRfcm9vdC50ay5jYWxsKCdpbWFnZScsICduYW1lcycpCiBkZWYgaW1hZ2VfdHlwZXMoKTogcmV0dXJuIF9kZWZhdWx0X3Jvb3QudGsuY2FsbCgnaW1hZ2UnLCAndHlwZXMnKQogCisKK2NsYXNzIFNwaW5ib3goV2lkZ2V0KToKKyAgICAiIiJzcGluYm94IHdpZGdldC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHNwaW5ib3ggd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisgICAgICAgIAorICAgICAgICBTVEFOREFSRCBPUFRJT05TCisgICAgICAgIAorICAgICAgICAgICAgYWN0aXZlYmFja2dyb3VuZCwgYmFja2dyb3VuZCwgYm9yZGVyd2lkdGgsCisgICAgICAgICAgICBjdXJzb3IsIGV4cG9ydHNlbGVjdGlvbiwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbnNlcnRiYWNrZ3JvdW5kLAorICAgICAgICAgICAgaW5zZXJ0Ym9yZGVyd2lkdGgsIGluc2VydG9mZnRpbWUsCisgICAgICAgICAgICBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBqdXN0aWZ5LCByZWxpZWYsIAorICAgICAgICAgICAgcmVwZWF0ZGVsYXksIHJlcGVhdGludGVydmFsLCAKKyAgICAgICAgICAgIHNlbGVjdGJhY2tncm91bmQsIHNlbGVjdGJvcmRlcndpZHRoCisgICAgICAgICAgICBzZWxlY3Rmb3JlZ3JvdW5kLCB0YWtlZm9jdXMsIHRleHR2YXJpYWJsZQorICAgICAgICAgICAgeHNjcm9sbGNvbW1hbmQuCisgICAgICAgICAgICAKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKyAgICAgICAgCisgICAgICAgICAgICBidXR0b25iYWNrZ3JvdW5kLCBidXR0b25jdXJzb3IsIAorICAgICAgICAgICAgYnV0dG9uZG93bnJlbGllZiwgYnV0dG9udXByZWxpZWYsIAorICAgICAgICAgICAgY29tbWFuZCwgZGlzYWJsZWRiYWNrZ3JvdW5kLCAKKyAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZm9ybWF0LCBmcm9tLCAKKyAgICAgICAgICAgIGludmFsaWRjb21tYW5kLCBpbmNyZW1lbnQsIAorICAgICAgICAgICAgcmVhZG9ubHliYWNrZ3JvdW5kLCBzdGF0ZSwgdG8sIAorICAgICAgICAgICAgdmFsaWRhdGUsIHZhbGlkYXRlY29tbWFuZCB2YWx1ZXMsCisgICAgICAgICAgICB3aWR0aCwgd3JhcCwKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdzcGluYm94JywgY25mLCBrdykKKyAgICAgICAgCisgICAgZGVmIGJib3goc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBYMSxZMSxYMixZMiBjb29yZGluYXRlcyBmb3IgYSAKKyAgICAgICAgcmVjdGFuZ2xlIHdoaWNoIGVuY2xvc2VzIHRoZSBjaGFyYWN0ZXIgZ2l2ZW4gYnkgaW5kZXguIAorICAgICAgICAKKyAgICAgICAgVGhlIGZpcnN0IHR3byBlbGVtZW50cyBvZiB0aGUgbGlzdCBnaXZlIHRoZSB4IGFuZCB5IAorICAgICAgICBjb29yZGluYXRlcyBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmVlbiAKKyAgICAgICAgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBjaGFyYWN0ZXIgKGluIHBpeGVscyByZWxhdGl2ZSAKKyAgICAgICAgdG8gdGhlIHdpZGdldCkgYW5kIHRoZSBsYXN0IHR3byBlbGVtZW50cyBnaXZlIHRoZSAKKyAgICAgICAgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2hhcmFjdGVyLCBpbiBwaXhlbHMuIFRoZSAKKyAgICAgICAgYm91bmRpbmcgYm94IG1heSByZWZlciB0byBhIHJlZ2lvbiBvdXRzaWRlIHRoZSAKKyAgICAgICAgdmlzaWJsZSBhcmVhIG9mIHRoZSB3aW5kb3cuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdiYm94JywgaW5kZXgpCisgICAgICAgIAorICAgIGRlZiBkZWxldGUoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB0aGUgc3BpbmJveC4KKyAgICAgICAgCisgICAgICAgIEZpcnN0IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGRlbGV0ZSwgCisgICAgICAgIGFuZCBsYXN0IGlzIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGp1c3QgYWZ0ZXIgCisgICAgICAgIHRoZSBsYXN0IG9uZSB0byBkZWxldGUuIElmIGxhc3QgaXNuJ3Qgc3BlY2lmaWVkIGl0IAorICAgICAgICBkZWZhdWx0cyB0byBmaXJzdCsxLCBpLmUuIGEgc2luZ2xlIGNoYXJhY3RlciBpcyAKKyAgICAgICAgZGVsZXRlZC4gIFRoaXMgY29tbWFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGZpcnN0LCBsYXN0KQorICAgICAgICAKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzcGluYm94J3Mgc3RyaW5nIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldCcpCisgICAgICAgIAorICAgIGRlZiBpY3Vyc29yKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiQWx0ZXIgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLgorICAgICAgICAKKyAgICAgICAgVGhlIGluc2VydGlvbiBjdXJzb3Igd2lsbCBiZSBkaXNwbGF5ZWQganVzdCBiZWZvcmUgCisgICAgICAgIHRoZSBjaGFyYWN0ZXIgZ2l2ZW4gYnkgaW5kZXguIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpY3Vyc29yJywgaW5kZXgpCisgICAgICAgIAorICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2lkZ2V0IGF0IHBvc2l0aW9uIHgsIHkgCisgICAgICAgIAorICAgICAgICBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiBub25lLCBidXR0b25kb3duLCBidXR0b251cCwgZW50cnkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2lkZW50aWZ5JywgeCwgeSkKKyAgICAgICAgCisgICAgZGVmIGluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbnVtZXJpY2FsIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gaW5kZXgKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGV4JywgaW5kZXgpCisgICAgICAgIAorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHMpOgorICAgICAgICAiIiJJbnNlcnQgc3RyaW5nIHMgYXQgaW5kZXggCisgICAgICAgIAorICAgICAgICAgUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCwgcykKKyAgICAgICAgCisgICAgZGVmIGludm9rZShzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiQ2F1c2VzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byBiZSBpbnZva2VkCisgICAgICAgIAorICAgICAgICBUaGUgZWxlbWVudCBjb3VsZCBiZSBidXR0b25kb3duIG9yIGJ1dHRvbnVwCisgICAgICAgIHRyaWdnZXJpbmcgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnLCBlbGVtZW50KQorICAgIAorICAgIGRlZiBzY2FuKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnc2NhbicpICsgYXJncykpIG9yICgpCisgICAgICAgICAgICAKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgpOgorICAgICAgICAiIiJSZWNvcmRzIHggYW5kIHRoZSBjdXJyZW50IHZpZXcgaW4gdGhlIHNwaW5ib3ggd2luZG93OyAKKyAgICAgICAgCisgICAgICAgIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBzY2FuIGRyYWd0byBjb21tYW5kcy4gCisgICAgICAgIFR5cGljYWxseSB0aGlzIGNvbW1hbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbW91c2UgYnV0dG9uIAorICAgICAgICBwcmVzcyBpbiB0aGUgd2lkZ2V0LiBJdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjYW4oIm1hcmsiLCB4KQorICAgICAgICAKKyAgICBkZWYgc2Nhbl9kcmFndG8oc2VsZiwgeCk6CisgICAgICAgICIiIkNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4geCBhcmd1bWVudCAKKyAgICAgICAgYW5kIHRoZSB4IGFyZ3VtZW50IHRvIHRoZSBsYXN0IHNjYW4gbWFyayBjb21tYW5kCisgICAgICAgIAorICAgICAgICBJdCB0aGVuIGFkanVzdHMgdGhlIHZpZXcgbGVmdCBvciByaWdodCBieSAxMCB0aW1lcyB0aGUgCisgICAgICAgIGRpZmZlcmVuY2UgaW4geC1jb29yZGluYXRlcy4gVGhpcyBjb21tYW5kIGlzIHR5cGljYWxseSAKKyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIG1vdXNlIG1vdGlvbiBldmVudHMgaW4gdGhlIHdpZGdldCwgdG8gCisgICAgICAgIHByb2R1Y2UgdGhlIGVmZmVjdCBvZiBkcmFnZ2luZyB0aGUgc3BpbmJveCBhdCBoaWdoIHNwZWVkCisgICAgICAgIHRocm91Z2ggdGhlIHdpbmRvdy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY2FuKCJkcmFndG8iLCB4KQorICAgICAgICAKKyAgICBkZWYgc2VsZWN0aW9uKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnc2VsZWN0aW9uJykgKyBhcmdzKSkgb3IgKCkKKyAgICAKKyAgICBkZWYgc2VsZWN0aW9uX2FkanVzdChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkxvY2F0ZSB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gbmVhcmVzdCB0byB0aGUgY2hhcmFjdGVyCisgICAgICAgIGdpdmVuIGJ5IGluZGV4LCAKKyAgICAgICAgCisgICAgICAgIFRoZW4gYWRqdXN0IHRoYXQgZW5kIG9mIHRoZSBzZWxlY3Rpb24gdG8gYmUgYXQgaW5kZXggCisgICAgICAgIChpLmUgaW5jbHVkaW5nIGJ1dCBub3QgZ29pbmcgYmV5b25kIGluZGV4KS4gVGhlIG90aGVyIAorICAgICAgICBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpcyBtYWRlIHRoZSBhbmNob3IgcG9pbnQgZm9yIGZ1dHVyZQorICAgICAgICBzZWxlY3QgdG8gY29tbWFuZHMuIElmIHRoZSBzZWxlY3Rpb24gaXNuJ3QgY3VycmVudGx5IGluIAorICAgICAgICB0aGUgc3BpbmJveCwgdGhlbiBhIG5ldyBzZWxlY3Rpb24gaXMgY3JlYXRlZCB0byBpbmNsdWRlIAorICAgICAgICB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGluZGV4IGFuZCB0aGUgbW9zdCByZWNlbnQgc2VsZWN0aW9uIAorICAgICAgICBhbmNob3IgcG9pbnQsIGluY2x1c2l2ZS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24oImFkanVzdCIsIGluZGV4KQorICAgICAgICAgICAgCisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmKToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIHNlbGVjdGlvbiAKKyAgICAgICAgCisgICAgICAgIElmIHRoZSBzZWxlY3Rpb24gaXNuJ3QgaW4gdGhpcyB3aWRnZXQgdGhlbiB0aGUgCisgICAgICAgIGNvbW1hbmQgaGFzIG5vIGVmZmVjdC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24oImNsZWFyIikKKyAgICAKKyAgICBkZWYgc2VsZWN0aW9uX2VsZW1lbnQoc2VsZiwgZWxlbWVudD1Ob25lKToKKyAgICAgICAgIiIiU2V0cyBvciBnZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4gCisgICAgICAgIAorICAgICAgICBJZiBhIHNwaW5idXR0b24gZWxlbWVudCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgCisgICAgICAgIGRpc3BsYXllZCBkZXByZXNzZWQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNlbGVjdGlvbigiZWxlbWVudCIsIGVsZW1lbnQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBMYWJlbEZyYW1lKFdpZGdldCk6CisgICAgIiIibGFiZWxmcmFtZSB3aWRnZXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBsYWJlbGZyYW1lIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorICAgICAgICAgICAKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworICAgICAgICAKKyAgICAgICAgICAgIGJvcmRlcndpZHRoLCBjdXJzb3IsIGZvbnQsIGZvcmVncm91bmQsIAorICAgICAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsIAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBwYWR4LCBwYWR5LCByZWxpZWYsIAorICAgICAgICAgICAgdGFrZWZvY3VzLCB0ZXh0CisgICAgICAgICAgICAKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKyAgICAgICAgCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBjbGFzcywgY29sb3JtYXAsIGNvbnRhaW5lciwgCisgICAgICAgICAgICBoZWlnaHQsIGxhYmVsYW5jaG9yLCBsYWJlbHdpZGdldCwgCisgICAgICAgICAgICB2aXN1YWwsIHdpZHRoCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnbGFiZWxmcmFtZScsIGNuZiwga3cpCisgICAgICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFBhbmVkV2luZG93KFdpZGdldCk6CisgICAgIiIicGFuZWR3aW5kb3cgd2lkZ2V0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgcGFuZWR3aW5kb3cgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisgICAgICAgIAorICAgICAgICBTVEFOREFSRCBPUFRJT05TCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJhY2tncm91bmQsIGJvcmRlcndpZHRoLCBjdXJzb3IsIGhlaWdodCwKKyAgICAgICAgICAgIG9yaWVudCwgcmVsaWVmLCB3aWR0aAorICAgICAgICAgICAgCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGhhbmRsZXBhZCwgaGFuZGxlc2l6ZSwgb3BhcXVlcmVzaXplLCAKKyAgICAgICAgICAgIHNhc2hjdXJzb3IsIHNhc2hwYWQsIHNhc2hyZWxpZWYsIAorICAgICAgICAgICAgc2FzaHdpZHRoLCBzaG93aGFuZGxlLAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3BhbmVkd2luZG93JywgY25mLCBrdykKKworICAgIGRlZiBhZGQoc2VsZiwgY2hpbGQsICoqa3cpOgorICAgICAgICAiIiJBZGQgYSBjaGlsZCB3aWRnZXQgdG8gdGhlIHBhbmVkd2luZG93IGluIGEgbmV3IHBhbmUuIAorICAgICAgICAKKyAgICAgICAgVGhlIGNoaWxkIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCB3aWRnZXQgCisgICAgICAgIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGFyZ3VtZW50cyB0aGF0IHNwZWNpZnkgaG93IHRvIAorICAgICAgICBtYW5hZ2UgdGhlIHdpbmRvd3MuIE9wdGlvbnMgbWF5IGhhdmUgYW55IG9mIHRoZSB2YWx1ZXMgCisgICAgICAgIGFjY2VwdGVkIGJ5IHRoZSBjb25maWd1cmUgc3ViY29tbWFuZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2FkZCcsIGNoaWxkKSArIHNlbGYuX29wdGlvbnMoa3cpKQorICAgICAgICAKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGNoaWxkKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBwYW5lIGNvbnRhaW5pbmcgY2hpbGQgZnJvbSB0aGUgcGFuZWR3aW5kb3cKKyAgICAgICAgCisgICAgICAgIEFsbCBnZW9tZXRyeSBtYW5hZ2VtZW50IG9wdGlvbnMgZm9yIGNoaWxkIHdpbGwgYmUgZm9yZ290dGVuLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdmb3JnZXQnLCBjaGlsZCkKKyAgICBmb3JnZXQ9cmVtb3ZlCisgICAgICAgIAorICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiSWRlbnRpZnkgdGhlIHBhbmVkd2luZG93IGNvbXBvbmVudCBhdCBwb2ludCB4LCB5CisgICAgICAgIAorICAgICAgICBJZiB0aGUgcG9pbnQgaXMgb3ZlciBhIHNhc2ggb3IgYSBzYXNoIGhhbmRsZSwgdGhlIHJlc3VsdCAKKyAgICAgICAgaXMgYSB0d28gZWxlbWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIGluZGV4IG9mIHRoZSBzYXNoIG9yCisgICAgICAgIGhhbmRsZSwgYW5kIGEgd29yZCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgaXMgb3ZlciBhIHNhc2ggCisgICAgICAgIG9yIGEgaGFuZGxlLCBzdWNoIGFzIHswIHNhc2h9IG9yIHsyIGhhbmRsZX0uIElmIHRoZSBwb2ludCAKKyAgICAgICAgaXMgb3ZlciBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcGFuZWR3aW5kb3csIHRoZSByZXN1bHQgaXMgCisgICAgICAgIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpZGVudGlmeScsIHgsIHkpCisgICAgICAgIAorICAgIGRlZiBwcm94eShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3Byb3h5JykgKyBhcmdzKSkgb3IgKCkgICAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBwcm94eV9jb29yZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB4IGFuZCB5IHBhaXIgb2YgdGhlIG1vc3QgcmVjZW50IHByb3h5IGxvY2F0aW9uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcm94eSgiY29vcmQiKQorICAgICAgICAKKyAgICBkZWYgcHJveHlfZm9yZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIHByb3h5IGZyb20gdGhlIGRpc3BsYXkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcm94eSgiZm9yZ2V0IikKKyAgICAgICAgCisgICAgZGVmIHByb3h5X3BsYWNlKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJQbGFjZSB0aGUgcHJveHkgYXQgdGhlIGdpdmVuIHggYW5kIHkgY29vcmRpbmF0ZXMuIAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJveHkoInBsYWNlIiwgeCwgeSkKKyAgICAgICAgCisgICAgZGVmIHNhc2goc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdzYXNoJykgKyBhcmdzKSkgb3IgKCkKKyAgICAgICAgCisgICAgZGVmIHNhc2hfY29vcmQoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgeCBhbmQgeSBwYWlyIGZvciB0aGUgc2FzaCBnaXZlbiBieSBpbmRleC4gCisgICAgICAgIAorICAgICAgICBJbmRleCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxIGxlc3MgdGhhbiB0aGUgCisgICAgICAgIG51bWJlciBvZiBwYW5lcyBpbiB0aGUgcGFuZWR3aW5kb3cuIFRoZSBjb29yZGluYXRlcyBnaXZlbiBhcmUgCisgICAgICAgIHRob3NlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBzYXNoLiAKKyAgICAgICAgcGF0aE5hbWUgc2FzaCBkcmFndG8gaW5kZXggeCB5IFRoaXMgY29tbWFuZCBjb21wdXRlcyB0aGUgCisgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHRoZSBjb29yZGluYXRlcyAKKyAgICAgICAgZ2l2ZW4gdG8gdGhlIGxhc3Qgc2FzaCBjb29yZCBjb21tYW5kIGZvciB0aGUgZ2l2ZW4gc2FzaC4gSXQgdGhlbiAKKyAgICAgICAgbW92ZXMgdGhhdCBzYXNoIHRoZSBjb21wdXRlZCBkaWZmZXJlbmNlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSAKKyAgICAgICAgZW1wdHkgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2FzaCgiY29vcmQiLCBpbmRleCkKKyAgICAgICAgCisgICAgZGVmIHNhc2hfbWFyayhzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJlY29yZHMgeCBhbmQgeSBmb3IgdGhlIHNhc2ggZ2l2ZW4gYnkgaW5kZXg7IAorICAgICAgICAKKyAgICAgICAgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGxhdGVyIGRyYWd0byBjb21tYW5kcyB0byBtb3ZlIHRoZSBzYXNoLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2FzaCgibWFyayIsIGluZGV4KQorICAgICAgICAKKyAgICBkZWYgc2FzaF9wbGFjZShzZWxmLCBpbmRleCwgeCwgeSk6CisgICAgICAgICIiIlBsYWNlIHRoZSBzYXNoIGdpdmVuIGJ5IGluZGV4IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2FzaCgicGxhY2UiLCBpbmRleCwgeCwgeSkKKyAgICAgICAgCisgICAgZGVmIHBhbmVjZ2V0KHNlbGYsIGNoaWxkLCBvcHRpb24pOgorICAgICAgICAiIiJRdWVyeSBhIG1hbmFnZW1lbnQgb3B0aW9uIGZvciB3aW5kb3cuIAorICAgICAgICAKKyAgICAgICAgT3B0aW9uIG1heSBiZSBhbnkgdmFsdWUgYWxsb3dlZCBieSB0aGUgcGFuZWNvbmZpZ3VyZSBzdWJjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHNlbGYuX3csICdwYW5lY2dldCcpICsgKGNoaWxkLCAnLScrb3B0aW9uKSkKKyAgICAgICAgCisgICAgZGVmIHBhbmVjb25maWd1cmUoc2VsZiwgdGFnT3JJZCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIG1hbmFnZW1lbnQgb3B0aW9ucyBmb3Igd2luZG93LiAKKyAgICAgICAgCisgICAgICAgIElmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHJldHVybnMgYSBsaXN0IGRlc2NyaWJpbmcgYWxsCisgICAgICAgIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBmb3IgcGF0aE5hbWUuICBJZiBvcHRpb24gaXMgCisgICAgICAgIHNwZWNpZmllZCB3aXRoIG5vIHZhbHVlLCB0aGVuIHRoZSBjb21tYW5kIHJldHVybnMgYSBsaXN0IAorICAgICAgICBkZXNjcmliaW5nIHRoZSBvbmUgbmFtZWQgb3B0aW9uICh0aGlzIGxpc3Qgd2lsbCBiZSBpZGVudGljYWwgCisgICAgICAgIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Ymxpc3Qgb2YgdGhlIHZhbHVlIHJldHVybmVkIGlmIG5vIAorICAgICAgICBvcHRpb24gaXMgc3BlY2lmaWVkKS4gSWYgb25lIG9yIG1vcmUgb3B0aW9uLXZhbHVlIHBhaXJzIGFyZSAKKyAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSBjb21tYW5kIG1vZGlmaWVzIHRoZSBnaXZlbiB3aWRnZXQgCisgICAgICAgIG9wdGlvbihzKSB0byBoYXZlIHRoZSBnaXZlbiB2YWx1ZShzKTsgaW4gdGhpcyBjYXNlIHRoZSAKKyAgICAgICAgY29tbWFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gVGhlIGZvbGxvd2luZyBvcHRpb25zIAorICAgICAgICBhcmUgc3VwcG9ydGVkOgorICAgICAgICAKKyAgICAgICAgYWZ0ZXIgd2luZG93CisgICAgICAgICAgICBJbnNlcnQgdGhlIHdpbmRvdyBhZnRlciB0aGUgd2luZG93IHNwZWNpZmllZC4gd2luZG93IAorICAgICAgICAgICAgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgd2luZG93IGFscmVhZHkgbWFuYWdlZCBieSBwYXRoTmFtZS4KKyAgICAgICAgYmVmb3JlIHdpbmRvdworICAgICAgICAgICAgSW5zZXJ0IHRoZSB3aW5kb3cgYmVmb3JlIHRoZSB3aW5kb3cgc3BlY2lmaWVkLiB3aW5kb3cgCisgICAgICAgICAgICBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSB3aW5kb3cgYWxyZWFkeSBtYW5hZ2VkIGJ5IHBhdGhOYW1lLgorICAgICAgICBoZWlnaHQgc2l6ZQorICAgICAgICAgICAgU3BlY2lmeSBhIGhlaWdodCBmb3IgdGhlIHdpbmRvdy4gVGhlIGhlaWdodCB3aWxsIGJlIHRoZSAKKyAgICAgICAgICAgIG91dGVyIGRpbWVuc2lvbiBvZiB0aGUgd2luZG93IGluY2x1ZGluZyBpdHMgYm9yZGVyLCBpZiAKKyAgICAgICAgICAgIGFueS4gSWYgc2l6ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIG9yIGlmIC1oZWlnaHQgaXMgbm90IAorICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSBoZWlnaHQgcmVxdWVzdGVkIGludGVybmFsbHkgYnkgdGhlIAorICAgICAgICAgICAgd2luZG93IHdpbGwgYmUgdXNlZCBpbml0aWFsbHk7IHRoZSBoZWlnaHQgbWF5IGxhdGVyIGJlIAorICAgICAgICAgICAgYWRqdXN0ZWQgYnkgdGhlIG1vdmVtZW50IG9mIHNhc2hlcyBpbiB0aGUgcGFuZWR3aW5kb3cuIAorICAgICAgICAgICAgU2l6ZSBtYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5IFRrX0dldFBpeGVscy4KKyAgICAgICAgbWluc2l6ZSBuCisgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtYWRlIAorICAgICAgICAgICAgbGVzcyB0aGFuIG4uIFRoaXMgY29uc3RyYWludCBvbmx5IGFmZmVjdHMgdGhlIHNpemUgb2YgCisgICAgICAgICAgICB0aGUgd2lkZ2V0IGluIHRoZSBwYW5lZCBkaW1lbnNpb24gLS0gdGhlIHggZGltZW5zaW9uIAorICAgICAgICAgICAgZm9yIGhvcml6b250YWwgcGFuZWR3aW5kb3dzLCB0aGUgeSBkaW1lbnNpb24gZm9yIAorICAgICAgICAgICAgdmVydGljYWwgcGFuZWR3aW5kb3dzLiBNYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5IAorICAgICAgICAgICAgVGtfR2V0UGl4ZWxzLgorICAgICAgICBwYWR4IG4KKyAgICAgICAgICAgIFNwZWNpZmllcyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIGhvdyBtdWNoIAorICAgICAgICAgICAgZXh0cmEgc3BhY2UgdG8gbGVhdmUgb24gZWFjaCBzaWRlIG9mIHRoZSB3aW5kb3cgaW4gCisgICAgICAgICAgICB0aGUgWC1kaXJlY3Rpb24uIFRoZSB2YWx1ZSBtYXkgaGF2ZSBhbnkgb2YgdGhlIGZvcm1zIAorICAgICAgICAgICAgYWNjZXB0ZWQgYnkgVGtfR2V0UGl4ZWxzLgorICAgICAgICBwYWR5IG4KKyAgICAgICAgICAgIFNwZWNpZmllcyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIGhvdyBtdWNoCisgICAgICAgICAgICBleHRyYSBzcGFjZSB0byBsZWF2ZSBvbiBlYWNoIHNpZGUgb2YgdGhlIHdpbmRvdyBpbiAKKyAgICAgICAgICAgIHRoZSBZLWRpcmVjdGlvbi4gVGhlIHZhbHVlIG1heSBoYXZlIGFueSBvZiB0aGUgZm9ybXMgCisgICAgICAgICAgICBhY2NlcHRlZCBieSBUa19HZXRQaXhlbHMuCisgICAgICAgIHN0aWNreSBzdHlsZQorICAgICAgICAgICAgSWYgYSB3aW5kb3cncyBwYW5lIGlzIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0ZWQgCisgICAgICAgICAgICBkaW1lbnNpb25zIG9mIHRoZSB3aW5kb3csIHRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIAorICAgICAgICAgICAgdG8gcG9zaXRpb24gKG9yIHN0cmV0Y2gpIHRoZSB3aW5kb3cgd2l0aGluIGl0cyBwYW5lLiAKKyAgICAgICAgICAgIFN0eWxlIGlzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIG9mIHRoZSAKKyAgICAgICAgICAgIGNoYXJhY3RlcnMgbiwgcywgZSBvciB3LiBUaGUgc3RyaW5nIGNhbiBvcHRpb25hbGx5IAorICAgICAgICAgICAgY29udGFpbnMgc3BhY2VzIG9yIGNvbW1hcywgYnV0IHRoZXkgYXJlIGlnbm9yZWQuIEVhY2ggCisgICAgICAgICAgICBsZXR0ZXIgcmVmZXJzIHRvIGEgc2lkZSAobm9ydGgsIHNvdXRoLCBlYXN0LCBvciB3ZXN0KSAKKyAgICAgICAgICAgIHRoYXQgdGhlIHdpbmRvdyB3aWxsICJzdGljayIgdG8uIElmIGJvdGggbiBhbmQgcyAKKyAgICAgICAgICAgIChvciBlIGFuZCB3KSBhcmUgc3BlY2lmaWVkLCB0aGUgd2luZG93IHdpbGwgYmUgCisgICAgICAgICAgICBzdHJldGNoZWQgdG8gZmlsbCB0aGUgZW50aXJlIGhlaWdodCAob3Igd2lkdGgpIG9mIAorICAgICAgICAgICAgaXRzIGNhdml0eS4KKyAgICAgICAgd2lkdGggc2l6ZQorICAgICAgICAgICAgU3BlY2lmeSBhIHdpZHRoIGZvciB0aGUgd2luZG93LiBUaGUgd2lkdGggd2lsbCBiZSAKKyAgICAgICAgICAgIHRoZSBvdXRlciBkaW1lbnNpb24gb2YgdGhlIHdpbmRvdyBpbmNsdWRpbmcgaXRzIAorICAgICAgICAgICAgYm9yZGVyLCBpZiBhbnkuIElmIHNpemUgaXMgYW4gZW1wdHkgc3RyaW5nLCBvciAKKyAgICAgICAgICAgIGlmIC13aWR0aCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSB3aWR0aCByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGludGVybmFsbHkgYnkgdGhlIHdpbmRvdyB3aWxsIGJlIHVzZWQgaW5pdGlhbGx5OyB0aGUgCisgICAgICAgICAgICB3aWR0aCBtYXkgbGF0ZXIgYmUgYWRqdXN0ZWQgYnkgdGhlIG1vdmVtZW50IG9mIHNhc2hlcyAKKyAgICAgICAgICAgIGluIHRoZSBwYW5lZHdpbmRvdy4gU2l6ZSBtYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5IAorICAgICAgICAgICAgVGtfR2V0UGl4ZWxzLgorICAgICAgICAgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgaWYgY25mIGlzIE5vbmUgYW5kIG5vdCBrdzoKKyAgICAgICAgICAgIGNuZiA9IHt9CisgICAgICAgICAgICBmb3IgeCBpbiBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCkpOgorICAgICAgICAgICAgICAgIGNuZlt4WzBdWzE6XV0gPSAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgICAgICByZXR1cm4gY25mCisgICAgICAgIGlmIHR5cGUoY25mKSA9PSBTdHJpbmdUeXBlIGFuZCBub3Qga3c6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkLCAnLScrY25mKSkKKyAgICAgICAgICAgIHJldHVybiAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkKSArCisgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgcGFuZWNvbmZpZyA9IHBhbmVjb25maWd1cmUKKworICAgIGRlZiBwYW5lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhbiBvcmRlcmVkIGxpc3Qgb2YgdGhlIGNoaWxkIHBhbmVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lcycpCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRXh0ZW5zaW9uczoKIApkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IDVkNGJiMTIuLjc2ZDlkOGUgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTE2Nyw2ICsxNjcsNyBAQAogTmlscyBGaXNjaGJlY2sKIEhlcm7hbiBNYXJ07W5leiBGb2ZmYW5pCiBEb3VnIEZvcnQKK01hcnRpbiBGcmFua2xpbgogUm9iaW4gRnJpZWRyaWNoCiBJdmFuIEZyb2huZQogSmltIEZ1bHRvbgpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IDFiNzhkZTkuLjkwYmQwMmYgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTM0OCw2ICszNDgsOCBAQAogTGlicmFyeQogLS0tLS0tLQogCistIFZhcmlvdXMgZmVhdHVyZXMgb2YgVGsgOC40IGFyZSBleHBvc2VkIGluIFRraW50ZXIucHkuCisKIC0gVmFyaW91cyBjb25maWd1cmUgbWV0aG9kcyBvZiBUa2ludGVyIGhhdmUgYmVlbiBzdHJlYW0tbGluZWQsIHNvCiAgIHRoYXQgdGFnX2NvbmZpZ3VyZSwgaW1hZ2VfY29uZmlndXJlLCB3aW5kb3dfY29uZmlndXJlIG5vdyByZXR1cm4KICAgYSBkaWN0aW9uYXJ5IHdoZW4gaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50Lgo=