ZGlmZiAtLWdpdCBhL3J1bnRpbWUvcGx1Z2luL05ldHJ3RmlsZUhhbmRsZXJzLnZpbSBiL3J1bnRpbWUvcGx1Z2luL05ldHJ3RmlsZUhhbmRsZXJzLnZpbQppbmRleCA0MDFmYzU4Li5hZGRiYTRlIDEwMDY0NAotLS0gYS9ydW50aW1lL3BsdWdpbi9OZXRyd0ZpbGVIYW5kbGVycy52aW0KKysrIGIvcnVudGltZS9wbHVnaW4vTmV0cndGaWxlSGFuZGxlcnMudmltCkBAIC0xLDMzICsxLDEyNSBAQAogIiBOZXRyd0ZpbGVIYW5kbGVyczogY29udGFpbnMgdmFyaW91cyBleHRlbnNpb24tYmFzZWQgZmlsZSBoYW5kbGVycyBmb3IKLSIgICAgICAgICAgICAgICBuZXRydydzIGJyb3dzZXIKKyIgICAgICAgICAgICAgICAgICAgIG5ldHJ3J3MgYnJvd3NlcnMnIHggY29tbWFuZAogIiBBdXRob3I6CUNoYXJsZXMgRS4gQ2FtcGJlbGwsIEpyLgotIiBEYXRlOgkJSnVsIDAyLCAyMDA0Ci0iIFZlcnNpb246CTIKKyIgRGF0ZToJCUp1bCAwNiwgMjAwNAorIiBWZXJzaW9uOgkzCiAiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAiIE5ldHJ3RmlsZUhhbmRsZXJfaHRtbDogaGFuZGxlcyBodG1sIHdoZW4gdGhlIHVzZXIgaGl0cyAieCIgd2hlbiB0aGUKICIgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgaXMgYXRvcCBhICouaHRtbCBmaWxlCi1mdW4hIE5ldHJ3RmlsZUhhbmRsZXJfaHRtbCh3ZWJwYWdlKQotIiAgY2FsbCBEZnVuYygiTmV0cndGaWxlSGFuZGxlcl9odG1sKCIuYTp3ZWJwYWdlLiIpIikKK2Z1biEgTmV0cndGaWxlSGFuZGxlcl9odG1sKHBhZ2VmaWxlKQorIiAgY2FsbCBEZnVuYygiTmV0cndGaWxlSGFuZGxlcl9odG1sKCIuYTpwYWdlZmlsZS4iKSIpCiAKLSAgbGV0IGhvc3Q9IHN1YnN0aXR1dGUoYTp3ZWJwYWdlLCdeXHdcKzovL1wlKFx3KkBcKVw9XChcd1wrXCkvLiokJywnXDEnLCdlJykKLSIgIGNhbGwgRGVjaG8oImhvc3Q8Ii5ob3N0LiI+IikKLQotICBpZiBob3N0ID09IGhvc3RuYW1lKCkgfHwgaG9zdCA9PSBzdWJzdGl0dXRlKGhvc3RuYW1lKCksJ1wuLiokJywnJywnZScpCi0gICBsZXQgcGFnZT0gc3Vic3RpdHV0ZShhOndlYnBhZ2UsJ15cd1wrOi8vXCUoXHcqQFwpXD1cKFx3XCtcKS8nLCdmaWxlOi8vXDEvJy5leHBhbmQoIiRIT01FIikuJy8nLCdlJykKLSAgZWxzZQotICAgbGV0IHBhZ2U9IHN1YnN0aXR1dGUoYTp3ZWJwYWdlLCdeXHdcKzovL1wlKFx3KkBcKVw9XChcd1wrXCkvJywnaHR0cDovL1wxLycsJ2UnKQotICBlbmRpZgorICBsZXQgcGFnZT0gc3Vic3RpdHV0ZShhOnBhZ2VmaWxlLCdeJywnZmlsZTovLycsJycpCiAKICAgaWYgZXhlY3V0YWJsZSgibW96aWxsYSIpCi0iICBjYWxsIERlY2hvKCJleGVjdXRpbmcgIW1vemlsbGEgIi5wYWdlKQorIiAgIGNhbGwgRGVjaG8oImV4ZWN1dGluZyAhbW96aWxsYSAiLnBhZ2UpCiAgICBleGUgIiFtb3ppbGxhICIucGFnZQogICBlbHNlaWYgZXhlY3V0YWJsZSgibmV0c2NhcGUiKQotIiAgY2FsbCBEZWNobygiZXhlY3V0aW5nICFuZXRzY2FwZSAiLnBhZ2UpCisiICAgY2FsbCBEZWNobygiZXhlY3V0aW5nICFuZXRzY2FwZSAiLnBhZ2UpCiAgICBleGUgIiFuZXRzY2FwZSAiLnBhZ2UKKyAgZWxzZQorIiAgIGNhbGwgRHJldCgiTmV0cndGaWxlSGFuZGxlcl9odG1sIDAiKQorICAgcmV0dXJuIDAKICAgZW5kaWYKIAotIiAgY2FsbCBEcmV0KCJOZXRyd0ZpbGVIYW5kbGVyX2h0bWwiKQorIiAgY2FsbCBEcmV0KCJOZXRyd0ZpbGVIYW5kbGVyX2h0bWwgMSIpCisgIHJldHVybiAxCitlbmRmdW4KKworIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgTmV0cndGaWxlSGFuZGxlcl9odG06IGhhbmRsZXMgaHRtbCB3aGVuIHRoZSB1c2VyIGhpdHMgIngiIHdoZW4gdGhlCisiICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIGlzIGF0b3AgYSAqLmh0bSBmaWxlCitmdW4hIE5ldHJ3RmlsZUhhbmRsZXJfaHRtKHBhZ2VmaWxlKQorIiAgY2FsbCBEZnVuYygiTmV0cndGaWxlSGFuZGxlcl9odG0oIi5hOnBhZ2VmaWxlLiIpIikKKworICBsZXQgcGFnZT0gc3Vic3RpdHV0ZShhOnBhZ2VmaWxlLCdeJywnZmlsZTovLycsJycpCisKKyAgaWYgZXhlY3V0YWJsZSgibW96aWxsYSIpCisiICAgY2FsbCBEZWNobygiZXhlY3V0aW5nICFtb3ppbGxhICIucGFnZSkKKyAgIGV4ZSAiIW1vemlsbGEgIi5wYWdlCisgIGVsc2VpZiBleGVjdXRhYmxlKCJuZXRzY2FwZSIpCisiICAgY2FsbCBEZWNobygiZXhlY3V0aW5nICFuZXRzY2FwZSAiLnBhZ2UpCisgICBleGUgIiFuZXRzY2FwZSAiLnBhZ2UKKyAgZWxzZQorIiAgIGNhbGwgRHJldCgiTmV0cndGaWxlSGFuZGxlcl9odG0gMCIpCisgICByZXR1cm4gMAorICBlbmRpZgorCisiICBjYWxsIERyZXQoIk5ldHJ3RmlsZUhhbmRsZXJfaHRtIDEiKQorICByZXR1cm4gMQorZW5kZnVuCisKKyIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIE5ldHJ3RmlsZUhhbmRsZXJfanBnOgorZnVuISBOZXRyd0ZpbGVIYW5kbGVyX2pwZyhqcGdmaWxlKQorIiAgY2FsbCBEZnVuYygiTmV0cndGaWxlSGFuZGxlcl9qcGcoanBnZmlsZTwiLmE6anBnZmlsZS4iPikiKQorCisgIGlmIGV4ZWN1dGFibGUoImdpbXAiKQorICAgZXhlICJzaWxlbnQhICFnaW1wIC1zICIuYTpqcGdmaWxlCisgIGVsc2VpZiBleGVjdXRhYmxlKGV4cGFuZCgiJFN5c3RlbVJvb3QiKS4iL1NZU1RFTTMyL01TUEFJTlQuRVhFIikKKyAgIGV4ZSAic2lsZW50ISAhIi5leHBhbmQoIiRTeXN0ZW1Sb290IikuIi9TWVNURU0zMi9NU1BBSU5UICIuYTpqcGdmaWxlCisgIGVsc2UKKyIgICBjYWxsIERyZXQoIk5ldHJ3RmlsZUhhbmRsZXJfanBnIDAiKQorICAgcmV0dXJuIDAKKyAgZW5kaWYKKworIiAgY2FsbCBEcmV0KCJOZXRyd0ZpbGVIYW5kbGVyX2pwZyAxIikKKyAgcmV0dXJuIDEKK2VuZGZ1bgorCisiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBOZXRyd0ZpbGVIYW5kbGVyX2dpZjoKK2Z1biEgTmV0cndGaWxlSGFuZGxlcl9naWYoZ2lmZmlsZSkKKyIgIGNhbGwgRGZ1bmMoIk5ldHJ3RmlsZUhhbmRsZXJfZ2lmKGdpZmZpbGU8Ii5hOmdpZmZpbGUuIj4pIikKKworICBpZiBleGVjdXRhYmxlKCJnaW1wIikKKyAgIGV4ZSAic2lsZW50ISAhZ2ltcCAtcyAiLmE6Z2lmZmlsZQorICBlbHNlaWYgZXhlY3V0YWJsZShleHBhbmQoIiRTeXN0ZW1Sb290IikuIi9TWVNURU0zMi9NU1BBSU5ULkVYRSIpCisgICBleGUgInNpbGVudCEgISIuZXhwYW5kKCIkU3lzdGVtUm9vdCIpLiIvU1lTVEVNMzIvTVNQQUlOVCAiLmE6Z2lmZmlsZQorICBlbHNlCisiICAgY2FsbCBEcmV0KCJOZXRyd0ZpbGVIYW5kbGVyX2dpZiAwIikKKyAgIHJldHVybiAwCisgIGVuZGlmCisKKyIgIGNhbGwgRHJldCgiTmV0cndGaWxlSGFuZGxlcl9naWYgMSIpCisgIHJldHVybiAxCitlbmRmdW4KKworIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgTmV0cndGaWxlSGFuZGxlcl9wbm06CitmdW4hIE5ldHJ3RmlsZUhhbmRsZXJfcG5tKHBubWZpbGUpCisiICBjYWxsIERmdW5jKCJOZXRyd0ZpbGVIYW5kbGVyX3BubShwbm1maWxlPCIuYTpwbm1maWxlLiI+KSIpCisKKyAgaWYgZXhlY3V0YWJsZSgiZ2ltcCIpCisgICBleGUgInNpbGVudCEgIWdpbXAgLXMgIi5hOnBubWZpbGUKKyAgZWxzZWlmIGV4ZWN1dGFibGUoZXhwYW5kKCIkU3lzdGVtUm9vdCIpLiIvU1lTVEVNMzIvTVNQQUlOVC5FWEUiKQorICAgZXhlICJzaWxlbnQhICEiLmV4cGFuZCgiJFN5c3RlbVJvb3QiKS4iL1NZU1RFTTMyL01TUEFJTlQgIi5hOnBubWZpbGUKKyAgZWxzZQorIiAgIGNhbGwgRHJldCgiTmV0cndGaWxlSGFuZGxlcl9wbm0gMCIpCisgICByZXR1cm4gMAorICBlbmRpZgorCisiICBjYWxsIERyZXQoIk5ldHJ3RmlsZUhhbmRsZXJfcG5tIDEiKQorICByZXR1cm4gMQorZW5kZnVuCisKKyIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIE5ldHJ3RmlsZUhhbmRsZXJfYm1wOgorZnVuISBOZXRyd0ZpbGVIYW5kbGVyX2JtcChibXBmaWxlKQorIiAgY2FsbCBEZnVuYygiTmV0cndGaWxlSGFuZGxlcl9ibXAoYm1wZmlsZTwiLmE6Ym1wZmlsZS4iPikiKQorCisgIGlmIGV4ZWN1dGFibGUoImdpbXAiKQorICAgZXhlICJzaWxlbnQhICFnaW1wIC1zICIuYTpibXBmaWxlCisgIGVsc2VpZiBleGVjdXRhYmxlKGV4cGFuZCgiJFN5c3RlbVJvb3QiKS4iL1NZU1RFTTMyL01TUEFJTlQuRVhFIikKKyAgIGV4ZSAic2lsZW50ISAhIi5leHBhbmQoIiRTeXN0ZW1Sb290IikuIi9TWVNURU0zMi9NU1BBSU5UICIuYTpibXBmaWxlCisgIGVsc2UKKyIgICBjYWxsIERyZXQoIk5ldHJ3RmlsZUhhbmRsZXJfYm1wIDAiKQorICAgcmV0dXJuIDAKKyAgZW5kaWYKKworIiAgY2FsbCBEcmV0KCJOZXRyd0ZpbGVIYW5kbGVyX2JtcCAxIikKKyAgcmV0dXJuIDEKIGVuZGZ1bgogCiAiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvcnVudGltZS9wbHVnaW4vZXhwbG9yZXIudmltIGIvcnVudGltZS9wbHVnaW4vZXhwbG9yZXIudmltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGZjYjMzLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvcGx1Z2luL2V4cGxvcmVyLnZpbQorKysgL2Rldi9udWxsCkBAIC0xLDEzMjYgKzAsMCBAQAotIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0iIEZpbGU6IGV4cGxvcmVyLnZpbQotIiBBdXRob3I6IE0gQSBBeml6IEFobWVkIChheml6QGFjb3JuLW5ldHdvcmtzLmNvbSAtIGRvZXNuJ3Qgd29yaykKLSIgTGFzdCBDaGFuZ2U6CTIwMDQgSnVuIDIyCi0iIFZlcnNpb246IDIuNSArIGNoYW5nZXMKLSIgQWRkaXRpb25zIGJ5IE1hcmsgV2FnZ29uZXIgKHdhZ2dvbmVyQGFyYWNuZXQuY29tKSBldCBhbC4KLSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGZpbGUgZXhwbG9yZXIuCi0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSIgTm9ybWFsbHksIHRoaXMgZmlsZSB3aWxsIHJlc2lkZSBpbiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgYW5kIGJlCi0iIGF1dG9tYXRpY2FsbHkgc291cmNlZC4gIElmIG5vdCwgeW91IG11c3QgbWFudWFsbHkgc291cmNlIHRoaXMgZmlsZQotIiB1c2luZyA6c291cmNlIGV4cGxvcmVyLnZpbQotIgotIiBUbyB1c2UgaXQsIGp1c3QgZWRpdCBhIGRpcmVjdG9yeSAodmkgZGlybmFtZSkgb3IgdHlwZSA6RXhwbG9yZSB0bwotIiBsYXVuY2ggdGhlIGZpbGUgZXhwbG9yZXIgaW4gdGhlIGN1cnJlbnQgd2luZG93LCBvciA6U2V4cGxvcmUgdG8gc3BsaXQKLSIgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBsYXVuY2ggZXhwbG9yZXIgdGhlcmUuCi0iCi0iIElmIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBtb2RpZmllZCwgdGhlIHdpbmRvdyBpcyBhbHdheXMgc3BsaXQuCi0iCi0iIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVsZXRlIGZpbGVzIGFuZCByZW5hbWUgZmlsZXMgd2l0aGluIGV4cGxvcmVyLgotIiBTZWUgOmhlbHAgZmlsZS1leHBsb3JlciBmb3IgbW9yZSBkZXRhaWxzCi0iCi0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSIgVXBkYXRlIGhpc3RvcnkgcmVtb3ZlZCwgaXQncyBub3QgdmVyeSBpbnRlcmVzdGluZy4KLSIgQ29udHJpYnV0b3JzIHdlcmU6IERvdWcgUG90dHMsIEJyYW0gTW9vbGVuYWFyLCBUaG9tYXMgS/ZobGVyCi0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIiBIYXMgdGhpcyBhbHJlYWR5IGJlZW4gbG9hZGVkPwotaWYgZXhpc3RzKCJsb2FkZWRfZXhwbG9yZXIiKQotICBmaW5pc2gKLWVuZGlmCi1sZXQgbG9hZGVkX2V4cGxvcmVyPTEKLQotIiBMaW5lIGNvbnRpbnVhdGlvbiB1c2VkIGhlcmUKLWxldCBzOmNwb19zYXZlID0gJmNwbwotc2V0IGNwbyZ2aW0KLQotIi0tLQotIiBEZWZhdWx0IHNldHRpbmdzIGZvciBnbG9iYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLQotIiBTcGxpdCB2ZXJ0aWNhbGx5IGluc3RlYWQgb2YgaG9yaXpvbnRhbGx5PwotaWYgIWV4aXN0cygiZzpleHBsVmVydGljYWwiKQotICBsZXQgZzpleHBsVmVydGljYWw9MAotZW5kaWYKLQotIiBIb3cgYmlnIHRvIG1ha2UgdGhlIHdpbmRvdz8gU2V0IHRvICIiIHRvIGF2b2lkIHJlc2l6aW5nCi1pZiAhZXhpc3RzKCJnOmV4cGxXaW5TaXplIikKLSAgbGV0IGc6ZXhwbFdpblNpemU9MTUKLWVuZGlmCi0KLSIgV2hlbiBvcGVuaW5nIGEgbmV3IGZpbGUvZGlyZWN0b3J5LCBzcGxpdCBiZWxvdyBjdXJyZW50IHdpbmRvdyAob3IKLSIgYWJvdmUpPyAgMSA9IGJlbG93LCAwID0gdG8gYWJvdmUKLWlmICFleGlzdHMoImc6ZXhwbFNwbGl0QmVsb3ciKQotICBsZXQgZzpleHBsU3BsaXRCZWxvdyA9ICZzcGxpdGJlbG93Ci1lbmRpZgotCi0iIFNwbGl0IHRvIHJpZ2h0IG9mIGN1cnJlbnQgd2luZG93IChvciB0byBsZWZ0KT8KLSIgMSA9IHRvIHJpZ2h0LCAwID0gdG8gbGVmdAotaWYgIWV4aXN0cygiZzpleHBsU3BsaXRSaWdodCIpCi0gIGxldCBnOmV4cGxTcGxpdFJpZ2h0ID0gJnNwbGl0cmlnaHQKLWVuZGlmCi0KLSIgU3RhcnQgdGhlIGZpcnN0IGV4cGxvcmVyIHdpbmRvdy4uLgotIiBEZWZhdWx0cyB0byBiZSB0aGUgc2FtZSBhcyBleHBsU3BsaXRCZWxvdwotaWYgIWV4aXN0cygiZzpleHBsU3RhcnRCZWxvdyIpCi0gIGxldCBnOmV4cGxTdGFydEJlbG93ID0gZzpleHBsU3BsaXRCZWxvdwotZW5kaWYKLQotIiBTdGFydCB0aGUgZmlyc3QgZXhwbG9yZXIgd2luZG93Li4uCi0iIERlZmF1bHRzIHRvIGJlIHRoZSBzYW1lIGFzIGV4cGxTcGxpdFJpZ2h0Ci1pZiAhZXhpc3RzKCJnOmV4cGxTdGFydFJpZ2h0IikKLSAgbGV0IGc6ZXhwbFN0YXJ0UmlnaHQgPSBnOmV4cGxTcGxpdFJpZ2h0Ci1lbmRpZgotCi0iIFNob3cgZGV0YWlsZWQgaGVscD8KLWlmICFleGlzdHMoImc6ZXhwbERldGFpbGVkSGVscCIpCi0gIGxldCBnOmV4cGxEZXRhaWxlZEhlbHA9MAotZW5kaWYKLQotIiBTaG93IGZpbGUgc2l6ZSBhbmQgZGF0ZXM/Ci1pZiAhZXhpc3RzKCJnOmV4cGxEZXRhaWxlZExpc3QiKQotICBsZXQgZzpleHBsRGV0YWlsZWRMaXN0PTAKLWVuZGlmCi0KLSIgRm9ybWF0IGZvciB0aGUgZGF0ZQotaWYgIWV4aXN0cygiZzpleHBsRGF0ZUZvcm1hdCIpCi0gIGxldCBnOmV4cGxEYXRlRm9ybWF0PSIlZCAlYiAlWSAlSDolTSIKLWVuZGlmCi0KLSIgRmlsZXMgdG8gaGlkZQotaWYgIWV4aXN0cygiZzpleHBsSGlkZUZpbGVzIikKLSAgbGV0IGc6ZXhwbEhpZGVGaWxlcz0nJwotZW5kaWYKLQotIiBGaWVsZCB0byBzb3J0IGJ5Ci1pZiAhZXhpc3RzKCJnOmV4cGxTb3J0QnkiKQotICBsZXQgZzpleHBsU29ydEJ5PSduYW1lJwotZW5kaWYKLQotIiBTZWdyZWdhdGUgZGlyZWN0b3JpZXM/IDEsIDAsIG9yIC0xCi1pZiAhZXhpc3RzKCJnOmV4cGxEaXJzRmlyc3QiKQotICBsZXQgZzpleHBsRGlyc0ZpcnN0PTEKLWVuZGlmCi0KLSIgU2VncmVnYXRlIGl0ZW1zIGluIHN1ZmZpeGVzIG9wdGlvbj8gMSwgMCwgb3IgLTEKLWlmICFleGlzdHMoImc6ZXhwbFN1ZmZpeGVzTGFzdCIpCi0gIGxldCBnOmV4cGxTdWZmaXhlc0xhc3Q9MQotZW5kaWYKLQotIiBJbmNsdWRlIHNlcGFyYXRvciBsaW5lcyBiZXR3ZWVuIGRpcmVjdG9yaWVzLCBmaWxlcywgYW5kIHN1ZmZpeGVzPwotaWYgIWV4aXN0cygiZzpleHBsVXNlU2VwYXJhdG9ycyIpCi0gIGxldCBnOmV4cGxVc2VTZXBhcmF0b3JzPTAKLWVuZGlmCi0KLSIgRXhlY3V0ZSBmaWxlIGhhbmRsZXIKLWlmICFleGlzdHMoImc6ZXhwbEZpbGVIYW5kbGVyIikKLSAgaWYgaGFzKCJ3aW4zMiIpCi0gICAgIiBmb3IgV2luMzIgdXNlIHJ1bmRsbDMyCi0gICAgZnVuY3Rpb24hIHM6ZXhwbEZpbGVIYW5kbGVyV2luMzIoZm4pCi0gICAgICBleGVjICdzaWxlbnQgIXN0YXJ0IHJ1bmRsbDMyIHVybC5kbGwsRmlsZVByb3RvY29sSGFuZGxlciAiJwotCQlcIC4gZXNjYXBlKGE6Zm4sICclIycpIC4gJyInCi0gICAgZW5kZnVuY3Rpb24KLSAgICBsZXQgZzpleHBsRmlsZUhhbmRsZXIgPSAiPFNJRD5leHBsRmlsZUhhbmRsZXJXaW4zMiIKLQotICBlbHNlaWYgaGFzKCJ1bml4IikKLSAgICAiIGZvciBLREUgdXNlIGtmbWNsaWVudCwgZm9yIEdOVU1FIHVzZSBnbm9tZS1vcGVuCi0gICAgaWYgZXhlY3V0YWJsZSgia2ZtY2xpZW50IikKLSAgICAgIGxldCBnOmV4cGxGaWxlSGFuZGxlckNtZCA9ICJrZm1jbGllbnQgZXhlYyIKLSAgICBlbHNlaWYgZXhlY3V0YWJsZSgiZ25vbWUtb3BlbiIpCi0gICAgICBsZXQgZzpleHBsRmlsZUhhbmRsZXJDbWQgPSAiZ25vbWUtb3BlbiIKLSAgICBlbHNlCi0gICAgICBsZXQgZzpleHBsRmlsZUhhbmRsZXJDbWQgPSAiIgotICAgIGVuZGlmCi0gICAgaWYgZzpleHBsRmlsZUhhbmRsZXJDbWQgIT0gIiIKLSAgICAgIGZ1bmN0aW9uISBzOmV4cGxGaWxlSGFuZGxlclVuaXgoZm4pCi0JaWYgJnNoZWxscmVkaXIgPX4gIiVzIgotCSAgbGV0IHJlZGlyID0gc3Vic3RpdHV0ZSgmc2hlbGxyZWRpciwgIiVzIiwgIi9kZXYvbnVsbCIsICIiKQotCWVsc2UKLQkgIGxldCByZWRpciA9ICZzaGVsbHJlZGlyIC4gIi9kZXYvbnVsbCIKLQllbmRpZgotCSIgTmVlZCB0byBlc2NhcGUgJSBhbmQgIyBidXQgbm90IHNwYWNlcy4KLQlleGVjICJzaWxlbnQgISIgLiBnOmV4cGxGaWxlSGFuZGxlckNtZCAuICIgJyIgLiBlc2NhcGUoYTpmbiwgJyUjJykgLiAiJyIgLiByZWRpcgotICAgICAgZW5kZnVuY3Rpb24KLSAgICAgIGxldCBnOmV4cGxGaWxlSGFuZGxlciA9ICI8U0lEPmV4cGxGaWxlSGFuZGxlclVuaXgiCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLSItLS0KLSIgc2NyaXB0IHZhcmlhYmxlcyAtIHRoZXNlIGFyZSB0aGUgc2FtZSBhY3Jvc3MgYWxsCi0iIGV4cGxvcmVyIHdpbmRvd3MKLQotIiBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBlc2NhcGVkIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotbGV0IHM6ZXNjcmVnZXhwID0gJy8qXiQuflwnCi0KLSIgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgZXNjYXBlZCBmb3IgZmlsZW5hbWVzCi1pZiBoYXMoImRvczE2IikgfHwgaGFzKCJkb3MzMiIpIHx8IGhhcygid2luMTYiKSB8fCBoYXMoIndpbjMyIikgfHwgaGFzKCJvczIiKQotICBsZXQgczplc2NmaWxlbmFtZSA9ICcgJSMnCi1lbHNlCi0gIGxldCBzOmVzY2ZpbGVuYW1lID0gJyBcJSNbXScKLWVuZGlmCi0KLQotIiBBIGxpbmUgdG8gdXNlIGZvciBzZXBhcmF0aW5nIHNlY3Rpb25zCi1sZXQgczpzZXBhcmF0b3I9JyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi0KLSItLS0KLSIgQ3JlYXRlIGNvbW1hbmRzCi0KLWlmICFleGlzdHMoJzpFeHBsb3JlJykKLSAgY29tbWFuZCAtbj0/IC1jb21wbGV0ZT1kaXIgRXhwbG9yZSA6Y2FsbCBzOlN0YXJ0RXhwbG9yZXIoMCwgJzxhPicpCi1lbmRpZgotaWYgIWV4aXN0cygnOlNleHBsb3JlJykKLSAgY29tbWFuZCAtbj0/IC1jb21wbGV0ZT1kaXIgU2V4cGxvcmUgOmNhbGwgczpTdGFydEV4cGxvcmVyKDEsICc8YT4nKQotZW5kaWYKLQotIi0tLQotIiBTdGFydCB0aGUgZXhwbG9yZXIgdXNpbmcgdGhlIHByZWZlcmVuY2VzIGZyb20gdGhlIGdsb2JhbCB2YXJpYWJsZXMKLSIKLWZ1bmN0aW9uISBzOlN0YXJ0RXhwbG9yZXIoc3BsaXQsIHN0YXJ0X2RpcikKLSAgbGV0IHN0YXJ0Y21kID0gImVkaXQiCi0gIGlmIGE6c3RhcnRfZGlyICE9ICIiCi0gICAgbGV0IGZuYW1lPWE6c3RhcnRfZGlyCi0gIGVsc2UKLSAgICBsZXQgZm5hbWUgPSBleHBhbmQoIiU6cDpoIikKLSAgZW5kaWYKLSAgaWYgZm5hbWUgPT0gIiIKLSAgICBsZXQgZm5hbWUgPSBnZXRjd2QoKQotICBlbmRpZgotCi0gICIgQ3JlYXRlIGEgdmFyaWFibGUgdG8gdXNlIGlmIHNwbGl0dGluZyB2ZXJ0aWNhbGx5Ci0gIGxldCBzcGxpdE1vZGUgPSAiIgotICBpZiBnOmV4cGxWZXJ0aWNhbCA9PSAxCi0gICAgbGV0IHNwbGl0TW9kZSA9ICJ2ZXJ0aWNhbCIKLSAgZW5kaWYKLQotICAiIFNhdmUgdGhlIHVzZXIncyBzZXR0aW5ncyBmb3Igc3BsaXRiZWxvdyBhbmQgc3BsaXRyaWdodAotICBsZXQgc2F2ZXNwbGl0YmVsb3cgPSAmc3BsaXRiZWxvdwotICBsZXQgc2F2ZXNwbGl0cmlnaHQgPSAmc3BsaXRyaWdodAotCi0gIGlmIGE6c3BsaXQgfHwgJm1vZGlmaWVkCi0gICAgbGV0IHN0YXJ0Y21kID0gc3BsaXRNb2RlIC4gIiAiIC4gZzpleHBsV2luU2l6ZSAuICJuZXcgIiAuIGZuYW1lCi0gICAgbGV0ICZzcGxpdGJlbG93ID0gZzpleHBsU3RhcnRCZWxvdwotICAgIGxldCAmc3BsaXRyaWdodCA9IGc6ZXhwbFN0YXJ0UmlnaHQKLSAgZWxzZQotICAgIGxldCBzdGFydGNtZCA9ICJlZGl0ICIgLiBmbmFtZQotICBlbmRpZgotICBzaWxlbnQgZXhlY3V0ZSBzdGFydGNtZAotICBsZXQgJnNwbGl0YmVsb3cgPSBzYXZlc3BsaXRiZWxvdwotICBsZXQgJnNwbGl0cmlnaHQgPSBzYXZlc3BsaXRyaWdodAotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IGZvciAnZWRpdGluZycgYSBkaXJlY3RvcnkKLSIKLWZ1bmN0aW9uISBzOkVkaXREaXIoKQotICAiIEdldCBvdXQgb2YgaGVyZSByaWdodCBhd2F5IGlmIHRoaXMgaXNuJ3QgYSBkaXJlY3RvcnkhCi0gIGxldCBuYW1lID0gZXhwYW5kKCIlIikKLSAgaWYgbmFtZSA9PSAiIgotICAgIGxldCBuYW1lID0gZXhwYW5kKCIlOnAiKQotICBlbmRpZgotICBpZiAhaXNkaXJlY3RvcnkobmFtZSkKLSAgICByZXR1cm4KLSAgZW5kaWYKLQotICAiIFR1cm4gb2ZmIHRoZSBzd2FwZmlsZSwgc2V0IHRoZSBidWZmZXIgdHlwZSBzbyB0aGF0IGl0IHdvbid0IGdldAotICAiIHdyaXR0ZW4sIGFuZCBzbyB0aGF0IGl0IHdpbGwgZ2V0IGRlbGV0ZWQgd2hlbiBpdCBnZXRzIGhpZGRlbi4KLSAgc2V0bG9jYWwgbm9yZWFkb25seSBtb2RpZmlhYmxlCi0gIHNldGxvY2FsIG5vc3dhcGZpbGUKLSAgc2V0bG9jYWwgYnVmdHlwZT1ub3dyaXRlCi0gIHNldGxvY2FsIGJ1ZmhpZGRlbj1kZWxldGUKLSAgIiBEb24ndCB3cmFwIGFyb3VuZCBsb25nIGxpbmVzCi0gIHNldGxvY2FsIG5vd3JhcAotCi0gICIgTm8gbmVlZCBmb3IgYW55IGluc2VydG1vZGUgYWJicmV2aWF0aW9ucywgc2luY2Ugd2UgZG9uJ3QgYWxsb3cKLSAgIiBpbnNlcnRpb25zIGFueXdheSEKLSAgaWFiYyA8YnVmZmVyPgotCi0gICIgTG9uZyBvciBzaG9ydCBsaXN0aW5nPyAgVXNlIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhlIGZpcnN0IHRpbWUKLSAgIiBleHBsb3JlciBpcyBjYWxsZWQsIGFmdGVyIHRoYXQgdXNlIHRoZSBzY3JpcHQgdmFyaWFibGUgYXMgc2V0IGJ5Ci0gICIgdGhlIGludGVyYWN0aXZlIHVzZXIuCi0gIGlmIGV4aXN0cygiczpsb25nbGlzdCIpCi0gICAgbGV0IHc6bG9uZ2xpc3QgPSBzOmxvbmdsaXN0Ci0gIGVsc2UKLSAgICBsZXQgdzpsb25nbGlzdCA9IGc6ZXhwbERldGFpbGVkTGlzdAotICBlbmRpZgotCi0gICIgU2hvdyBrZXlib2FyZCBzaG9ydGN1dHM/Ci0gIGlmIGV4aXN0cygiczpsb25naGVscCIpCi0gICAgbGV0IHc6bG9uZ2hlbHAgPSBzOmxvbmdoZWxwCi0gIGVsc2UKLSAgICBsZXQgdzpsb25naGVscCA9IGc6ZXhwbERldGFpbGVkSGVscAotICBlbmRpZgotCi0gICIgU2V0IHRoZSBzb3J0IGJhc2VkIG9uIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRoZSBmaXJzdCB0aW1lLiAgSWYgeW91Ci0gICIgbGF0ZXIgY2hhbmdlIHRoZSBzb3J0IG9yZGVyLCBpdCB3aWxsIGJlIHJldGFpbmVkIGluIHRoZSBzOnNvcnRieQotICAiIHZhcmlhYmxlIGZvciB0aGUgbmV4dCB0aW1lIHlvdSBvcGVuIGV4cGxvcmVyCi0gIGxldCB3OnNvcnRkaXJlY3Rpb249MQotICBsZXQgdzpzb3J0ZGlybGFiZWwgPSAiIgotICBsZXQgdzpzb3J0dHlwZSA9ICIiCi0gIGlmIGV4aXN0cygiczpzb3J0YnkiKQotICAgIGxldCBzb3J0Ynk9czpzb3J0YnkKLSAgZWxzZQotICAgIGxldCBzb3J0Ynk9ZzpleHBsU29ydEJ5Ci0gIGVuZGlmCi0gIGlmIHNvcnRieSA9fiAicmV2ZXJzZSIKLSAgICBsZXQgdzpzb3J0ZGlyZWN0aW9uPS0xCi0gICAgbGV0IHc6c29ydGRpcmxhYmVsID0gInJldmVyc2UgIgotICBlbmRpZgotICBpZiBzb3J0YnkgPX4gImRhdGUiCi0gICAgbGV0IHc6c29ydHR5cGUgPSAiZGF0ZSIKLSAgZWxzZWlmIHNvcnRieSA9fiAic2l6ZSIKLSAgICBsZXQgdzpzb3J0dHlwZSA9ICJzaXplIgotICBlbHNlCi0gICAgbGV0IHc6c29ydHR5cGUgPSAibmFtZSIKLSAgZW5kaWYKLSAgY2FsbCBzOlNldFN1ZmZpeGVzTGFzdCgpCi0KLSAgIiBJZiBkaXJlY3RvcnkgaXMgYWxyZWFkeSBsb2FkZWQsIGRvbid0IG9wZW4gaXQgYWdhaW4hCi0gIGlmIGxpbmUoJyQnKSA+IDEKLSAgICBzZXRsb2NhbCByZWFkb25seSBub21vZGlmaWFibGUKLSAgICByZXR1cm4KLSAgZW5kaWYKLQotICAiIEdldCB0aGUgY29tcGxldGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGxvb2sgYXQgd2l0aCBhIHNsYXNoIGF0Ci0gICIgdGhlIGVuZC4gIFRoaXMgYWxzbyByZW1vdmVzICIvLi4vIiBhbmQgIi8uLyIgdGhpbmdzLgotICBsZXQgYjpjb21wbGV0ZVBhdGggPSBzOlBhdGgoZXhwYW5kKCIlOnAiKSkKLQotICAiIEFkZCBhIHNsYXNoIGF0IHRoZSBlbmQKLSAgaWYgYjpjb21wbGV0ZVBhdGggIX4gJy8kJwotICAgIGxldCBiOmNvbXBsZXRlUGF0aCA9IGI6Y29tcGxldGVQYXRoIC4gJy8nCi0gIGVuZGlmCi0KLSAgIiBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBleGVjIGNvbW1hbmRzCi0gIGxldCBiOmNvbXBsZXRlUGF0aEVzYyA9IGVzY2FwZShiOmNvbXBsZXRlUGF0aCwgczplc2NmaWxlbmFtZSkKLSAgbGV0IGI6cGFyZW50RGlyRXNjID0gc3Vic3RpdHV0ZShiOmNvbXBsZXRlUGF0aEVzYywgJy9bXi9dKi8kJywgJy8nLCAnZycpCi0KLSAgIiBTZXQgdXAgc3ludGF4IGhpZ2hsaWdodGluZwotICAiIFNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBjb25kaXRpb25hbCB0aG91Z2guLi4KLSAgaWYgaGFzKCJzeW50YXgiKSAmJiBleGlzdHMoImc6c3ludGF4X29uIikgJiYgIWhhcygic3ludGF4X2l0ZW1zIikKLSAgICBzeW4gbWF0Y2ggYnJvd3NlU3lub3BzaXMgICAgIl5cIlsgLV0uKiIKLSAgICBzeW4gbWF0Y2ggYnJvd3NlRGlyZWN0b3J5ICAgIlteXCJdLiovICIKLSAgICBzeW4gbWF0Y2ggYnJvd3NlRGlyZWN0b3J5ICAgIlteXCJdLiovJCIKLSAgICBzeW4gbWF0Y2ggYnJvd3NlQ3VyRGlyICAgICAgIl5cIj0gLiokIgotICAgIHN5biBtYXRjaCBicm93c2VTb3J0QnkgICAgICAiXlwiIFNvcnRlZCBieSAuKiQiICBjb250YWlucz1icm93c2VTdWZmaXhJbmZvCi0gICAgc3luIG1hdGNoIGJyb3dzZVN1ZmZpeEluZm8gICIoLiopJCIgIGNvbnRhaW5lZAotICAgIHN5biBtYXRjaCBicm93c2VGaWx0ZXIgICAgICAiXlwiIE5vdCBTaG93aW5nOi4qJCIKLSAgICBzeW4gbWF0Y2ggYnJvd3NlRmlsZXRpbWUgICAgIqurXGRcKyQiCi0gICAgZXhlYygnc3luIG1hdGNoIGJyb3dzZVN1ZmZpeGVzICAgICInIC4gYjpzdWZmaXhlc0hpZ2hsaWdodCAuICciJykKLQotICAgICJoaSBkZWYgbGluayBicm93c2VTeW5vcHNpcyAgICBQcmVQcm9jCi0gICAgaGkgZGVmIGxpbmsgYnJvd3NlU3lub3BzaXMgICAgU3BlY2lhbAotICAgIGhpIGRlZiBsaW5rIGJyb3dzZURpcmVjdG9yeSAgIERpcmVjdG9yeQotICAgIGhpIGRlZiBsaW5rIGJyb3dzZUN1ckRpciAgICAgIFN0YXRlbWVudAotICAgIGhpIGRlZiBsaW5rIGJyb3dzZVNvcnRCeSAgICAgIFN0cmluZwotICAgIGhpIGRlZiBsaW5rIGJyb3dzZVN1ZmZpeEluZm8gIFR5cGUKLSAgICBoaSBkZWYgbGluayBicm93c2VGaWx0ZXIgICAgICBTdHJpbmcKLSAgICBoaSBkZWYgbGluayBicm93c2VGaWxldGltZSAgICBJZ25vcmUKLSAgICBoaSBkZWYgbGluayBicm93c2VTdWZmaXhlcyAgICBUeXBlCi0gIGVuZGlmCi0KLSAgIiBTZXQgZmlsdGVyIGZvciBoaWRpbmcgZmlsZXMKLSAgbGV0IGI6ZmlsdGVyRm9ybXVsYT1zdWJzdGl0dXRlKGc6ZXhwbEhpZGVGaWxlcywgJ1woW15cXF1cKSwnLCAnXDFcXHwnLCAnZycpCi0gIGlmIGI6ZmlsdGVyRm9ybXVsYSAhPSAnJwotICAgIGxldCBiOmZpbHRlcmluZz0iXG5Ob3Qgc2hvd2luZzogIiAuIGI6ZmlsdGVyRm9ybXVsYQotICBlbHNlCi0gICAgbGV0IGI6ZmlsdGVyaW5nPSIiCi0gIGVuZGlmCi0KLSAgIiBTaG93IHRoZSBmaWxlcwotICBjYWxsIHM6U2hvd0RpcmVjdG9yeSgpCi0KLSAgIiBTZXQgdXAgbWFwcGluZ3MgZm9yIHRoaXMgYnVmZmVyCi0gIGxldCBjcG9fc2F2ZSA9ICZjcG8KLSAgc2V0IGNwbyZ2aW0KLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gPGNyPiA6Y2FsbCA8U0lEPkVkaXRFbnRyeSgiIiwiZWRpdCIpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiAtICAgIDpleGVjICgic2lsZW50IGUgIiAgLiBiOnBhcmVudERpckVzYyk8Y3I+Ci0gIGlmIGV4aXN0cygiZzpleHBsRmlsZUhhbmRsZXIiKQotICAgIG5ub3JlbWFwIDxidWZmZXI+IHggICAgOmNhbGwgPFNJRD5FeGVjdXRlRW50cnkoKTxjcj4KLSAgZW5kaWYKLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gbyAgICA6Y2FsbCA8U0lEPk9wZW5FbnRyeSgpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiBPICAgIDpjYWxsIDxTSUQ+T3BlbkVudHJ5UHJldldpbmRvdygpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiBwICAgIDpjYWxsIDxTSUQ+RWRpdEVudHJ5KCIiLCJwZWRpdCIpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiA/ICAgIDpjYWxsIDxTSUQ+VG9nZ2xlSGVscCgpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiBhICAgIDpjYWxsIDxTSUQ+U2hvd0FsbEZpbGVzKCk8Y3I+Ci0gIG5ub3JlbWFwIDxidWZmZXI+IFIgICAgOmNhbGwgPFNJRD5SZW5hbWVGaWxlKCk8Y3I+Ci0gIG5ub3JlbWFwIDxidWZmZXI+IEQgICAgOi4gY2FsbCA8U0lEPkRlbGV0ZUZpbGUoKTxjcj4KLSAgdm5vcmVtYXAgPGJ1ZmZlcj4gRCAgICA6Y2FsbCA8U0lEPkRlbGV0ZUZpbGUoKTxjcj4KLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gaSAgICA6Y2FsbCA8U0lEPlRvZ2dsZUxvbmdMaXN0KCk8Y3I+Ci0gIG5ub3JlbWFwIDxidWZmZXI+IHMgICAgOmNhbGwgPFNJRD5Tb3J0U2VsZWN0KCk8Y3I+Ci0gIG5ub3JlbWFwIDxidWZmZXI+IHIgICAgOmNhbGwgPFNJRD5Tb3J0UmV2ZXJzZSgpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiBjICAgIDpleGVjICJjZCAiLmI6Y29tcGxldGVQYXRoRXNjPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiA8Mi1sZWZ0bW91c2U+IDpjYWxsIDxTSUQ+RG91YmxlQ2xpY2soKTxjcj4KLSAgaWYgZXhpc3RzKCIqRXhwbG9yZXJDdXN0b21NYXAiKQotICAgIGNhbGwgRXhwbG9yZXJDdXN0b21NYXAoKQotICBlbmRpZgotICBsZXQgJmNwbyA9IGNwb19zYXZlCi0KLSAgIiBwcmV2ZW50IHRoZSBidWZmZXIgZnJvbSBiZWluZyBtb2RpZmllZAotICBzZXRsb2NhbCByZWFkb25seSBub21vZGlmaWFibGUKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygd2luZG93cyBvcGVuIHRvIHRoaXMgYnVmZmVyIG51bWJlci4KLSIgQ2FyZSBvZiBZZWdhcHBhbiBMYWtzaG1hbi4gIFRoYW5rcyEKLWZ1biEgczpCdWZJbldpbmRvd3MoYm51bSkKLSAgbGV0IGNudCA9IDAKLSAgbGV0IHdpbm51bSA9IDEKLSAgd2hpbGUgMQotICAgIGxldCBidWZudW0gPSB3aW5idWZucih3aW5udW0pCi0gICAgaWYgYnVmbnVtIDwgMAotICAgICAgYnJlYWsKLSAgICBlbmRpZgotICAgIGlmIGJ1Zm51bSA9PSBhOmJudW0KLSAgICAgIGxldCBjbnQgPSBjbnQgKyAxCi0gICAgZW5kaWYKLSAgICBsZXQgd2lubnVtID0gd2lubnVtICsgMQotICBlbmR3aGlsZQotCi0gIHJldHVybiBjbnQKLWVuZGZ1bmN0aW9uCi0KLSIgSWYgdGhpcyBpcyB0aGUgb25seSB3aW5kb3csIG9wZW4gZmlsZSBpbiBhIG5ldyB3aW5kb3cKLSIgT3RoZXJ3aXNlLCBvcGVuIGZpbGUgaW4gdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCB3aW5kb3cKLSIKLWZ1bmN0aW9uISBzOk9wZW5FbnRyeVByZXZXaW5kb3coKQotICAiIEZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIGFueSBvdGhlciB3aW5kb3dzCi0gIGxldCBuID0gd2lubnIoKQotICB3aW5jbWQgcAotICAiIE5vIG90aGVyIHdpbmRvdz8gIFRoZW4gb3BlbiBhIG5ldyBvbmUKLSAgaWYgbiA9PSB3aW5ucigpCi0gICAgY2FsbCBzOk9wZW5FbnRyeSgpCi0gICIgT3RoZXIgd2luZG93cyBleGlzdAotICBlbHNlCi0gICAgIiBDaGVjayBpZiB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIG1vZGlmaWVkIC0gYXNrIGlmIHRoZXkgd2FudCB0byBzYXZlIQotICAgICIgV2FzIGl0IG1vZGlmaWVkLCBhbmQgaXMgaXQgdGhlIG9ubHkgd2luZG93IG9wZW4gdG8gdGhpcyBmaWxlCi0gICAgaWYgJm1vZGlmaWVkICYmIHM6QnVmSW5XaW5kb3dzKHdpbmJ1Zm5yKHdpbm5yKCkpKSA8IDIKLSAgICAgIGxldCBidWZuYW1lID0gYnVmbmFtZSh3aW5idWZucih3aW5ucigpKSkKLQotICAgICAgbGV0IGFjdGlvbj1jb25maXJtKCJTYXZlIENoYW5nZXMgaW4gIiAuIGJ1Zm5hbWUgLiAiPyIsIiZZZXNcbiZOb1xuJkNhbmNlbCIpCi0gICAgICAiIFllcyAtIHRyeSB0byBzYXZlIC0gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGNhbmNlbAotICAgICAgaWYgYWN0aW9uID09IDEKLQlsZXQgdjplcnJtc2cgPSAiIgotCXNpbGVudCB3Ci0JaWYgdjplcnJtc2cgIT0gIiIKLQkgIGVjaG9lcnIgIlVuYWJsZSB0byB3cml0ZSBidWZmZXIhIgotCSAgd2luY21kIHAKLQkgIHJldHVybgotCWVuZGlmCi0gICAgICAiIE5vLCBhYmFuZG9uIGNoYW5nZXMKLSAgICAgIGVsc2VpZiBhY3Rpb24gPT0gMgotCXNldCBub21vZGlmaWVkCi0JZWNob21zZyAiV2FybmluZywgYWJhbmRvbmluZyBjaGFuZ2VzIGluICIgLiBidWZuYW1lCi0gICAgICAiIENhbmNlbCAob3IgYW55IG90aGVyIHJlc3VsdCksIGRvbid0IGRvIHRoZSBvcGVuCi0gICAgICBlbHNlCi0Jd2luY21kIHAKLQlyZXR1cm4KLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgICB3aW5jbWQgcAotICAgIGNhbGwgczpFZGl0RW50cnkoIndpbmNtZCBwIiwiZWRpdCIpCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0KLSItLS0KLSIgT3BlbiBhIGZpbGUgb3IgZGlyZWN0b3J5IGluIGEgbmV3IHdpbmRvdy4KLSIgVXNlIGc6ZXhwbFNwbGl0QmVsb3cgYW5kIGc6ZXhwbFNwbGl0UmlnaHQgdG8gZGVjaWRlIHdoZXJlIHRvIHB1dCB0aGUKLSIgc3BsaXQgd2luZG93LCBhbmQgcmVzaXplIHRoZSBvcmlnaW5hbCBleHBsb3JlciB3aW5kb3cgaWYgaXQgaXMKLSIgbGFyZ2VyIHRoYW4gZzpleHBsV2luU2l6ZQotIgotZnVuY3Rpb24hIHM6T3BlbkVudHJ5KCkKLSAgIiBBcmUgd2Ugb24gYSBsaW5lIHdpdGggYSBmaWxlIG5hbWU/Ci0gIGxldCBsID0gZ2V0bGluZSgiLiIpCi0gIGlmIGwgPX4gJ14iJwotICAgIHJldHVybgotICBlbmRpZgotCi0gICIgQ29weSB3aW5kb3cgc2V0dGluZ3MgdG8gc2NyaXB0IHNldHRpbmdzCi0gIGxldCBzOnNvcnRieT13OnNvcnRkaXJsYWJlbCAuIHc6c29ydHR5cGUKLSAgbGV0IHM6bG9uZ2hlbHAgPSB3OmxvbmdoZWxwCi0gIGxldCBzOmxvbmdsaXN0ID0gdzpsb25nbGlzdAotCi0gICIgR2V0IHRoZSB3aW5kb3cgbnVtYmVyIG9mIHRoZSBleHBsb3JlciB3aW5kb3cKLSAgbGV0IG4gPSB3aW5ucigpCi0KLSAgIiBTYXZlIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgZm9yIHNwbGl0YmVsb3cgYW5kIHNwbGl0cmlnaHQKLSAgbGV0IHNhdmVzcGxpdGJlbG93PSZzcGxpdGJlbG93Ci0gIGxldCBzYXZlc3BsaXRyaWdodD0mc3BsaXRyaWdodAotCi0gICIgRmlndXJlIG91dCBob3cgdG8gZG8gdGhlIHNwbGl0IGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMuCi0gICIgV2Ugd2FudCB0byBzcGxpdCB0byB0aGUgKGxlZnQscmlnaHQsdG9wLGJvdHRvbSkgb2YgdGhlIGV4cGxvcmVyCi0gICIgd2luZG93LCBidXQgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBzY3JlZW4gcmVhbC1lc3RhdGUgZnJvbSB0aGUKLSAgIiB3aW5kb3cgbmV4dCB0byB0aGUgZXhwbG9yZXIgaWYgcG9zc2libGUuCi0gICIKLSAgIiAndGhlcmUnIHdpbGwgYmUgc2V0IHRvIGEgY29tbWFuZCB0byBtb3ZlIGZyb20gdGhlIHNwbGl0IHdpbmRvdwotICAiIGJhY2sgdG8gdGhlIGV4cGxvcmVyIHdpbmRvdwotICAiCi0gICIgJ2JhY2snIHdpbGwgYmUgc2V0IHRvIGEgY29tbWFuZCB0byBtb3ZlIGZyb20gdGhlIGV4cGxvcmVyIHdpbmRvdwotICAiIGJhY2sgdG8gdGhlIG5ld2x5IHNwbGl0IHdpbmRvdwotICAiCi0gICIgJ3JpZ2h0JyBhbmQgJ2JlbG93JyB3aWxsIGJlIHNldCB0byB0aGUgc2V0dGluZ3MgbmVlZGVkIGZvcgotICAiIHNwbGl0YmVsb3cgYW5kIHNwbGl0cmlnaHQgSUYgdGhlIGV4cGxvcmVyIGlzIHRoZSBvbmx5IHdpbmRvdy4KLSAgIgotICBpZiBnOmV4cGxWZXJ0aWNhbAotICAgIGlmIGc6ZXhwbFNwbGl0UmlnaHQKLSAgICAgIGxldCB0aGVyZT0id2luY21kIGgiCi0gICAgICBsZXQgYmFjayA9IndpbmNtZCBsIgotICAgICAgbGV0IHJpZ2h0PTEKLSAgICAgIGxldCBiZWxvdz0wCi0gICAgZWxzZQotICAgICAgbGV0IHRoZXJlPSJ3aW5jbWQgbCIKLSAgICAgIGxldCBiYWNrID0id2luY21kIGgiCi0gICAgICBsZXQgcmlnaHQ9MAotICAgICAgbGV0IGJlbG93PTAKLSAgICBlbmRpZgotICBlbHNlCi0gICAgaWYgZzpleHBsU3BsaXRCZWxvdwotICAgICAgbGV0IHRoZXJlPSJ3aW5jbWQgayIKLSAgICAgIGxldCBiYWNrID0id2luY21kIGoiCi0gICAgICBsZXQgcmlnaHQ9MAotICAgICAgbGV0IGJlbG93PTEKLSAgICBlbHNlCi0gICAgICBsZXQgdGhlcmU9IndpbmNtZCBqIgotICAgICAgbGV0IGJhY2sgPSJ3aW5jbWQgayIKLSAgICAgIGxldCByaWdodD0wCi0gICAgICBsZXQgYmVsb3c9MAotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgIiBHZXQgdGhlIGZpbGUgbmFtZQotICBsZXQgZm49czpHZXRGdWxsRmlsZU5hbWUoKQotCi0gICIgQXR0ZW1wdCB0byBnbyB0byBhZGphY2VudCB3aW5kb3cKLSAgZXhlYyhiYWNrKQotICAiIElmIG5vIGFkamFjZW50IHdpbmRvdywgc2V0IHNwbGl0cmlnaHQgYW5kIHNwbGl0YmVsb3cgYXBwcm9wcmlhdGVseQotICBpZiBuID09IHdpbm5yKCkKLSAgICBsZXQgJnNwbGl0cmlnaHQ9cmlnaHQKLSAgICBsZXQgJnNwbGl0YmVsb3c9YmVsb3cKLSAgZWxzZQotICAgICIgZm91bmQgYWRqYWNlbnQgd2luZG93IC0gaW52ZXJ0IHNwbGl0IGRpcmVjdGlvbgotICAgIGxldCAmc3BsaXRyaWdodD0hcmlnaHQKLSAgICBsZXQgJnNwbGl0YmVsb3c9IWJlbG93Ci0gIGVuZGlmCi0KLSAgIiBDcmVhdGUgYSB2YXJpYWJsZSB0byB1c2UgaWYgc3BsaXR0aW5nIHZlcnRpY2FsbHkKLSAgbGV0IHNwbGl0TW9kZSA9ICIiCi0gIGlmIGc6ZXhwbFZlcnRpY2FsID09IDEKLSAgICBsZXQgc3BsaXRNb2RlID0gInZlcnRpY2FsIgotICBlbmRpZgotCi0gICIgSXMgaXQgYSBkaXJlY3Rvcnk/ICBJZiBzbywgZ2V0IGEgcmVhbCBwYXRoIHRvIGl0IGluc3RlYWQgb2YKLSAgIiByZWxhdGl2ZSBwYXRoLiAgVGhpcyBhbHNvIHJlbW92ZXMgIi8uLi8iIGFuZCAiLy4vIiB0aGluZ3MuCi0gIGlmIGlzZGlyZWN0b3J5KGZuKQotICAgIGxldCBmbiA9IGZuYW1lbW9kaWZ5KGZuLCAiOnAiKQotICBlbmRpZgotCi0gICIgT3BlbiB0aGUgbmV3IHdpbmRvdwotICBleGVjKCJzaWxlbnQgIiAuIHNwbGl0TW9kZS4iIHNwICIgLiBlc2NhcGUoZm4sczplc2NmaWxlbmFtZSkpCi0KLSAgIiByZXNpemUgdGhlIGV4cGxvcmVyIHdpbmRvdyBpZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUKLSAgZXhlYyh0aGVyZSkKLSAgaWYgZzpleHBsV2luU2l6ZSA9fiAnWzAtOV1cKycgJiYgd2luaGVpZ2h0KCIiKSA+IGc6ZXhwbFdpblNpemUKLSAgICBleGVjKCJzaWxlbnQgIi5zcGxpdE1vZGUuIiByZXNpemUgIi5nOmV4cGxXaW5TaXplKQotICBlbmRpZgotICBleGVjKGJhY2spCi0KLSAgIiBSZXN0b3JlIHNwbGl0bW9kZSBzZXR0aW5ncwotICBsZXQgJnNwbGl0YmVsb3c9c2F2ZXNwbGl0YmVsb3cKLSAgbGV0ICZzcGxpdHJpZ2h0PXNhdmVzcGxpdHJpZ2h0Ci0KLWVuZGZ1bmN0aW9uCi0KLWZ1bmN0aW9uISBzOkV4ZWN1dGVFbnRyeSgpCi0gICIgQXJlIHdlIG9uIGEgbGluZSB3aXRoIGEgZmlsZSBuYW1lPwotICBsZXQgbCA9IGdldGxpbmUoIi4iKQotICBpZiBsID1+ICdeIicKLSAgICByZXR1cm4KLSAgZW5kaWYKLQotICAiIEdldCB0aGUgZmlsZSBuYW1lCi0gIGxldCBmbiA9IHM6R2V0RnVsbEZpbGVOYW1lKCkKLSAgaWYgaGFzKCJ3aW4zMiIpICYmIGZuID1+ICdeLy8nCi0gICAgbGV0IGZuID0gc3Vic3RpdHV0ZShmbiwgJy8nLCAnXFwnLCAnZycpCi0gIGVuZGlmCi0gIGV4ZWMgImNhbGwgIiAuIGc6ZXhwbEZpbGVIYW5kbGVyIC4gIihmbikiCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIERvdWJsZSBjbGljayB3aXRoIHRoZSBtb3VzZQotIgotZnVuY3Rpb24gczpEb3VibGVDbGljaygpCi0gIGlmIGV4cGFuZCgiPGNmaWxlPiIpID1+ICdbXFwvXSQnCi0gICAgY2FsbCBzOkVkaXRFbnRyeSgiIiwiZWRpdCIpCQkiIGRpcmVjdG9yeTogb3BlbiBpbiB0aGlzIHdpbmRvdwotICBlbHNlCi0gICAgY2FsbCBzOk9wZW5FbnRyeVByZXZXaW5kb3coKQkiIGZpbGU6IG9wZW4gaW4gYW5vdGhlciB3aW5kb3cKLSAgZW5kaWYKLWVuZGZ1bgotCi0iLS0tCi0iIE9wZW4gZmlsZSBvciBkaXJlY3RvcnkgaW4gdGhlIHNhbWUgd2luZG93IGFzIHRoZSBleHBsb3JlciBpcwotIiBjdXJyZW50bHkgaW4KLSIKLWZ1bmN0aW9uISBzOkVkaXRFbnRyeShtb3ZlZmlyc3QsZWRpdGNtZCkKLSAgIiBBcmUgd2Ugb24gYSBsaW5lIHdpdGggYSBmaWxlIG5hbWU/Ci0gIGxldCBsID0gZ2V0bGluZSgiLiIpCi0gIGlmIGwgPX4gJ14iJwotICAgIHJldHVybgotICBlbmRpZgotCi0gICIgQ29weSB3aW5kb3cgc2V0dGluZ3MgdG8gc2NyaXB0IHNldHRpbmdzCi0gIGxldCBzOnNvcnRieT13OnNvcnRkaXJsYWJlbCAuIHc6c29ydHR5cGUKLSAgbGV0IHM6bG9uZ2hlbHAgPSB3OmxvbmdoZWxwCi0gIGxldCBzOmxvbmdsaXN0ID0gdzpsb25nbGlzdAotCi0gICIgR2V0IHRoZSBmaWxlIG5hbWUKLSAgbGV0IGZuID0gczpHZXRGdWxsRmlsZU5hbWUoKQotICBpZiBpc2RpcmVjdG9yeShmbikKLSAgICAiIFRoaXMgcmVtb3ZlcyAiLy4uLyIgYW5kICIvLi8iIHRoaW5ncy4KLSAgICBsZXQgZm4gPSBmbmFtZW1vZGlmeShmbiwgIjpwIikKLSAgZW5kaWYKLQotICAiIE1vdmUgdG8gZGVzaXJlZCB3aW5kb3cgaWYgbmVlZGVkCi0gIGV4ZWMoYTptb3ZlZmlyc3QpCi0gICIgRWRpdCB0aGUgZmlsZS9kaXIKLSAgZXhlYyhhOmVkaXRjbWQgLiAiICIgLiBlc2NhcGUoZm4sczplc2NmaWxlbmFtZSkpCi1lbmRmdW5jdGlvbgotCi0KLSItLS0KLSIgQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIG91dCBvZiB0aGUgc3VmZml4ZXMgb3B0aW9uIGZvciBzb3J0aW5nCi0iIGFuZCBzZXQgYSBzdHJpbmcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgc29ydGluZyB3aXRoIHRoZQotIiBzdWZmaXhlcyBhdCB0aGUgZW5kIChvciB0aGUgYmVnaW5uaW5nKQotIgotZnVuY3Rpb24hIHM6U2V0U3VmZml4ZXNMYXN0KCkKLSAgbGV0IGI6c3VmZml4ZXNSZWdleHAgPSAnXCgnIC4gc3Vic3RpdHV0ZShlc2NhcGUoJnN1ZmZpeGVzLHM6ZXNjcmVnZXhwKSwnLCcsJ1xcfCcsJ2cnKSAuICdcKSQnCi0gIGxldCBiOnN1ZmZpeGVzSGlnaGxpZ2h0ID0gJ15bXiJdLipcKCcgLiBzdWJzdGl0dXRlKGVzY2FwZSgmc3VmZml4ZXMsczplc2NyZWdleHApLCcsJywnXFx8JywnZycpIC4gJ1wpXCggXHwkXCknCi0gIGlmIGhhcygiZm5hbWVfY2FzZSIpCi0gICAgbGV0IGI6c3VmZml4ZXNSZWdleHAgPSAnXEMnIC4gYjpzdWZmaXhlc1JlZ2V4cAotICAgIGxldCBiOnN1ZmZpeGVzSGlnaGxpZ2h0ID0gJ1xDJyAuIGI6c3VmZml4ZXNIaWdobGlnaHQKLSAgZWxzZQotICAgIGxldCBiOnN1ZmZpeGVzUmVnZXhwID0gJ1xjJyAuIGI6c3VmZml4ZXNSZWdleHAKLSAgICBsZXQgYjpzdWZmaXhlc0hpZ2hsaWdodCA9ICdcYycgLiBiOnN1ZmZpeGVzSGlnaGxpZ2h0Ci0gIGVuZGlmCi0gIGlmIGc6ZXhwbFN1ZmZpeGVzTGFzdCA+IDAgJiYgJnN1ZmZpeGVzICE9ICIiCi0gICAgbGV0IGI6c3VmZml4ZXNsYXN0PSIgKCIgLiAmc3VmZml4ZXMgLiAiIGF0IGVuZCBvZiBsaXN0KSIKLSAgZWxzZWlmIGc6ZXhwbFN1ZmZpeGVzTGFzdCA8IDAgJiYgJnN1ZmZpeGVzICE9ICIiCi0gICAgbGV0IGI6c3VmZml4ZXNsYXN0PSIgKCIgLiAmc3VmZml4ZXMgLiAiIGF0IHN0YXJ0IG9mIGxpc3QpIgotICBlbHNlCi0gICAgbGV0IGI6c3VmZml4ZXNsYXN0PSIgKCdzdWZmaXhlcycgbWl4ZWQgd2l0aCBmaWxlcykiCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFNob3cgdGhlIGhlYWRlciBhbmQgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeQotIgotZnVuY3Rpb24hIHM6U2hvd0RpcmVjdG9yeSgpCi0gICJEZWxldGUgYWxsIGxpbmVzCi0gIDEsJGQgXwotICAiIFByZXZlbnQgYSByZXBvcnQgb2Ygb3VyIGFjdGlvbnMgZnJvbSBzaG93aW5nIHVwCi0gIGxldCBvbGRSZXA9JnJlcG9ydAotICBsZXQgc2F2ZV9zYyA9ICZzYwotICBzZXQgcmVwb3J0PTEwMDAwIG5vc2MKLQotICAiIEFkZCB0aGUgaGVhZGVyCi0gIGNhbGwgczpBZGRIZWFkZXIoKQotICAkZCBfCi0KLSAgIiBEaXNwbGF5IHRoZSBmaWxlcwotCi0gICIgR2V0IGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzCi0gIGxldCBmaWxlcyA9IHM6UGF0aChnbG9iKGI6Y29tcGxldGVQYXRoRXNjIC4gIioiKSkKLSAgaWYgZmlsZXMgIT0gIiIgJiYgZmlsZXMgIX4gIlxuJCIKLSAgICBsZXQgZmlsZXMgPSBmaWxlcyAuICJcbiIKLSAgZW5kaWYKLQotICAiIEFkZCB0aGUgZG90IGZpbGVzIG5vdywgbWFraW5nIHN1cmUgIi4iIGlzIG5vdCBpbmNsdWRlZCEKLSAgbGV0IGZpbGVzID0gZmlsZXMgLiBzdWJzdGl0dXRlKHM6UGF0aChnbG9iKGI6Y29tcGxldGVQYXRoRXNjIC4gIi4qIikpLCAiW15cbl0qLy4vXFw9XG4iLCAnJyAsICcnKQotICBpZiBmaWxlcyAhPSAiIiAmJiBmaWxlcyAhfiAiXG4kIgotICAgIGxldCBmaWxlcyA9IGZpbGVzIC4gIlxuIgotICBlbmRpZgotCi0gICIgQXJlIHRoZXJlIGFueSBmaWxlcyBsZWZ0IGFmdGVyIGZpbHRlcmluZz8KLSAgaWYgZmlsZXMgIT0gIiIKLSAgICBub3JtYWwhIG10Ci0gICAgcHV0ID1maWxlcwotICAgIGxldCBiOm1heEZpbGVMZW4gPSAwCi0gICAgMAotICAgIC9eIj0vKzEsJGcvXi9jYWxsIHM6TWFya0RpcnMoKQotICAgIGtlZXBqdW1wcyBub3JtYWwhIGB0Ci0gICAgY2FsbCBzOkFkZEZpbGVJbmZvKCkKLSAgZW5kaWYKLQotICBub3JtYWwhIHp6Ci0KLSAgIiBNb3ZlIHRvIGZpcnN0IGRpcmVjdG9yeSBpbiB0aGUgbGlzdGluZwotICAwCi0gIC9eIj0vKzEKLQotICAiIERvIHRoZSBzb3J0Ci0gIGNhbGwgczpTb3J0TGlzdGluZygiTG9hZGVkIGNvbnRlbnRzIG9mICIuYjpjb21wbGV0ZVBhdGguIi4gIikKLQotICAiIE1vdmUgdG8gZmlyc3QgZGlyZWN0b3J5IGluIHRoZSBsaXN0aW5nCi0gIDAKLSAgL14iPS8rMQotCi0gIGxldCAmcmVwb3J0PW9sZFJlcAotICBsZXQgJnNjID0gc2F2ZV9zYwotCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIE1hcmsgd2hpY2ggaXRlbXMgYXJlIGRpcmVjdG9yaWVzIC0gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBuYW1lCi0iIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gc2l6ZS9kYXRlIGlzIG5vdCBkaXNwbGF5ZWQKLSIKLWZ1bmN0aW9uISBzOk1hcmtEaXJzKCkKLSAgbGV0IG9sZFJlcD0mcmVwb3J0Ci0gIHNldCByZXBvcnQ9MTAwMAotICAiUmVtb3ZlIHNsYXNoZXMgaWYgYWRkZWQKLSAgczsvJDs7ZQotICAiUmVtb3ZlcyBhbGwgdGhlIGxlYWRpbmcgc2xhc2hlcyBhbmQgYWRkcyBzbGFzaGVzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3JpZXMKLSAgczteLipcXFwoW15cXF0qXCkkO1wxO2UKLSAgczteLiovXChbXi9dKlwpJDtcMTtlCi0gICJub3JtYWwhIF4KLSAgbGV0IGN1cnJMaW5lPWdldGxpbmUoIi4iKQotICBpZiBpc2RpcmVjdG9yeShiOmNvbXBsZXRlUGF0aCAuIGN1cnJMaW5lKQotICAgIHM7JDsvOwotICAgIGxldCBmaWxlTGVuPXN0cmxlbihjdXJyTGluZSkrMQotICBlbHNlCi0gICAgbGV0IGZpbGVMZW49c3RybGVuKGN1cnJMaW5lKQotICAgIGlmIChiOmZpbHRlckZvcm11bGEhPSIiKSAmJiAoY3VyckxpbmUgPX4gYjpmaWx0ZXJGb3JtdWxhKQotICAgICAgIiBEb24ndCBzaG93IHRoZSBmaWxlIGlmIGl0IGlzIHRvIGJlIGZpbHRlcmVkLgotICAgICAgZCBfCi0gICAgZW5kaWYKLSAgZW5kaWYKLSAgaWYgZmlsZUxlbiA+IGI6bWF4RmlsZUxlbgotICAgIGxldCBiOm1heEZpbGVMZW49ZmlsZUxlbgotICBlbmRpZgotICBsZXQgJnJlcG9ydD1vbGRSZXAKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgTWFrZSBzdXJlIGEgcGF0aCBoYXMgcHJvcGVyIGZvcm0KLSIKLWZ1bmN0aW9uISBzOlBhdGgocCkKLSAgaWYgaGFzKCJkb3MxNiIpIHx8IGhhcygiZG9zMzIiKSB8fCBoYXMoIndpbjE2IikgfHwgaGFzKCJ3aW4zMiIpIHx8IGhhcygib3MyIikKLSAgICByZXR1cm4gc3Vic3RpdHV0ZShhOnAsJ1xcJywnLycsJ2cnKQotICBlbHNlCi0gICAgcmV0dXJuIGE6cAotICBlbmRpZgotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUgZnJvbSBhIGxpbmUgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgZm9ybXMKLSIKLWZ1bmN0aW9uISBzOkdldEZ1bGxGaWxlTmFtZUVzYygpCi0gICAgcmV0dXJuIHM6RXNjYXBlRmlsZW5hbWUoczpHZXRGdWxsRmlsZU5hbWUoKSkKLWVuZGZ1bmN0aW9uCi0KLWZ1bmN0aW9uISBzOkdldEZpbGVOYW1lRXNjKCkKLSAgICByZXR1cm4gczpFc2NhcGVGaWxlbmFtZShzOkdldEZpbGVOYW1lKCkpCi1lbmRmdW5jdGlvbgotCi1mdW5jdGlvbiEgczpFc2NhcGVGaWxlbmFtZShuYW1lKQotICAgIHJldHVybiBlc2NhcGUoYTpuYW1lLHM6ZXNjZmlsZW5hbWUpCi1lbmRmdW5jdGlvbgotCi0KLWZ1bmN0aW9uISBzOkdldEZ1bGxGaWxlTmFtZSgpCi0gIHJldHVybiBzOkV4dHJhY3RGdWxsRmlsZU5hbWUoZ2V0bGluZSgiLiIpKQotZW5kZnVuY3Rpb24KLQotZnVuY3Rpb24hIHM6R2V0RmlsZU5hbWUoKQotICByZXR1cm4gczpFeHRyYWN0RmlsZU5hbWUoZ2V0bGluZSgiLiIpKQotZW5kZnVuY3Rpb24KLQotZnVuY3Rpb24hIHM6RXh0cmFjdEZ1bGxGaWxlTmFtZShsaW5lKQotICAgICAgbGV0IGZuPXM6RXh0cmFjdEZpbGVOYW1lKGE6bGluZSkKLSAgICAgIGlmIGZuID09ICcvJwotCXJldHVybiBiOmNvbXBsZXRlUGF0aAotICAgICAgZWxzZQotCXJldHVybiBiOmNvbXBsZXRlUGF0aCAuIHM6RXh0cmFjdEZpbGVOYW1lKGE6bGluZSkKLSAgICAgIGVuZGlmCi1lbmRmdW5jdGlvbgotCi1mdW5jdGlvbiEgczpFeHRyYWN0RmlsZU5hbWUobGluZSkKLSAgcmV0dXJuIHN1YnN0aXR1dGUoc3RycGFydChhOmxpbmUsMCxiOm1heEZpbGVMZW4pLCdcc1wrJCcsJycsJycpCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIEdldCB0aGUgc2l6ZSBvZiB0aGUgZmlsZQotZnVuY3Rpb24hIHM6RXh0cmFjdEZpbGVTaXplKGxpbmUpCi0gIGlmICh3OmxvbmdsaXN0PT0wKQotICAgIHJldHVybiBnZXRmc2l6ZShzOkV4dHJhY3RGaWxlTmFtZShhOmxpbmUpKQotICBlbHNlCi0gICAgcmV0dXJuIHN0cnBhcnQoYTpsaW5lLGI6bWF4RmlsZUxlbisyLGI6bWF4RmlsZVNpemVMZW4pCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIEdldCB0aGUgZGF0ZSBvZiB0aGUgZmlsZSBhcyBhIG51bWJlcgotZnVuY3Rpb24hIHM6RXh0cmFjdEZpbGVEYXRlKGxpbmUpCi0gIGlmIHc6bG9uZ2xpc3Q9PTAKLSAgICByZXR1cm4gZ2V0ZnRpbWUoczpFeHRyYWN0RmlsZU5hbWUoYTpsaW5lKSkKLSAgZWxzZQotICAgIHJldHVybiBzdHJwYXJ0KG1hdGNoc3RyKHN0cnBhcnQoYTpsaW5lLGI6bWF4RmlsZUxlbitiOm1heEZpbGVTaXplTGVuKzQpLCKrqy4qIiksMikgKyAwCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0KLSItLS0KLSIgQWRkIHRoZSBoZWFkZXIgd2l0aCBoZWxwIGluZm9ybWF0aW9uCi0iCi1mdW5jdGlvbiEgczpBZGRIZWFkZXIoKQotICAgIGxldCBzYXZlX2Y9QGYKLSAgICAxCi0gICAgaWYgdzpsb25naGVscD09MQotICAgICAgbGV0IEBmPSJcIiA8ZW50ZXI+IDogb3BlbiBmaWxlIG9yIGRpcmVjdG9yeVxuIgotCSAgIFwuIlwiIG8gOiBvcGVuIG5ldyB3aW5kb3cgZm9yIGZpbGUvZGlyZWN0b3J5XG4iCi0JICAgXC4iXCIgTyA6IG9wZW4gZmlsZSBpbiBwcmV2aW91c2x5IHZpc2l0ZWQgd2luZG93XG4iCi0JICAgXC4iXCIgcCA6IHByZXZpZXcgdGhlIGZpbGVcbiIKLSAgICAgIGlmIGV4aXN0cygiZzpleHBsRmlsZUhhbmRsZXIiKQotCWxldCBAZj1AZi4iXCIgeCA6IGV4ZWN1dGUgZmlsZSBvciBkaXJlY3RvcnlcbiIKLSAgICAgIGVuZGlmCi0gICAgICBsZXQgQGY9QGYKLQkgICBcLiJcIiBpIDogdG9nZ2xlIHNpemUvZGF0ZSBsaXN0aW5nXG4iCi0JICAgXC4iXCIgcyA6IHNlbGVjdCBzb3J0IGZpZWxkICAgIHIgOiByZXZlcnNlIHNvcnRcbiIKLQkgICBcLiJcIiAtIDogZ28gdXAgb25lIGxldmVsICAgICAgYyA6IGNkIHRvIHRoaXMgZGlyXG4iCi0JICAgXC4iXCIgUiA6IHJlbmFtZSBmaWxlICAgICAgICAgIEQgOiBkZWxldGUgZmlsZVxuIgotCSAgIFwuIlwiIDpoZWxwIGZpbGUtZXhwbG9yZXIgZm9yIGRldGFpbGVkIGhlbHBcbiIKLSAgICBlbHNlCi0gICAgICBsZXQgQGY9IlwiIFByZXNzID8gZm9yIGtleWJvYXJkIHNob3J0Y3V0c1xuIgotICAgIGVuZGlmCi0gICAgbGV0IEBmPUBmLiJcIiBTb3J0ZWQgYnkgIi53OnNvcnRkaXJsYWJlbC53OnNvcnR0eXBlLmI6c3VmZml4ZXNsYXN0LmI6ZmlsdGVyaW5nLiJcbiIKLSAgICBsZXQgQGY9QGYuIlwiPSAiLmI6Y29tcGxldGVQYXRoLiJcbiIKLSAgICBwdXQhIGYKLSAgICBsZXQgQGY9c2F2ZV9mCi1lbmRmdW5jdGlvbgotCi0KLSItLS0KLSIgU2hvdyB0aGUgc2l6ZSBhbmQgZGF0ZSBmb3IgZWFjaCBmaWxlCi0iCi1mdW5jdGlvbiEgczpBZGRGaWxlSW5mbygpCi0gIGxldCBzYXZlX3NjID0gJnNjCi0gIHNldCBub3NjCi0KLSAgIiBNYXJrIG91ciBzdGFydGluZyBwb2ludAotICBub3JtYWwhIG10Ci0KLSAgY2FsbCBzOlJlbW92ZVNlcGFyYXRvcnMoKQotCi0gICIgUmVtb3ZlIGFsbCBpbmZvCi0gIDAKLSAgL14iPS8rMSwkZy9eL2NhbGwgc2V0bGluZShsaW5lKCIuIiksczpHZXRGaWxlTmFtZSgpKQotCi0gICIgQWRkIGluZm8gaWYgcmVxdWVzdGVkCi0gIGlmIHc6bG9uZ2xpc3Q9PTEKLSAgICAiIEFkZCBmaWxlIHNpemUgYW5kIGNhbGN1bGF0ZSBtYXhpbXVtIGxlbmd0aCBvZiBmaWxlIHNpemUgZmllbGQKLSAgICBsZXQgYjptYXhGaWxlU2l6ZUxlbiA9IDAKLSAgICAwCi0gICAgL14iPS8rMSwkZy9eL2xldCBmbj1zOkdldEZ1bGxGaWxlTmFtZSgpIHwKLQkJICAgXGxldCBmaWxlU2l6ZT1nZXRmc2l6ZShmbikgfAotCQkgICBcbGV0IGZpbGVTaXplTGVuPXN0cmxlbihmaWxlU2l6ZSkgfAotCQkgICBcaWYgZmlsZVNpemVMZW4gPiBiOm1heEZpbGVTaXplTGVuIHwKLQkJICAgXCAgbGV0IGI6bWF4RmlsZVNpemVMZW4gPSBmaWxlU2l6ZUxlbiB8Ci0JCSAgIFxlbmRpZiB8Ci0JCSAgIFxleGVjICJub3JtYWwhICIuKGI6bWF4RmlsZUxlbi1zdHJsZW4oZ2V0bGluZSgiLiIpKSsyKS4iQSBcPGVzYz4iIHwKLQkJICAgXGV4ZWMgJ3MvJC8nLmZpbGVTaXplLicvJwotCi0gICAgIiBSaWdodCBqdXN0aWZ5IHRoZSBmaWxlIHNpemVzIGFuZAotICAgICIgYWRkIGZpbGUgbW9kaWZpY2F0aW9uIGRhdGUKLSAgICAwCi0gICAgL14iPS8rMSwkZy9eL2xldCBmbj1zOkdldEZ1bGxGaWxlTmFtZSgpIHwKLQkJICAgXGV4ZWMgIm5vcm1hbCEgQSBcPGVzYz4kYiIuKGI6bWF4RmlsZUxlbitiOm1heEZpbGVTaXplTGVuLXN0cmxlbihnZXRsaW5lKCIuIikpKzMpLiJpIFw8ZXNjPlwiX3giIHwKLQkJICAgXGV4ZWMgJ3MvJC8gJy5lc2NhcGUoczpGaWxlTW9kRGF0ZShmbiksICcvJykuJy8nCi0gICAgc2V0bG9jYWwgbm9tb2RpZmllZAotICBlbmRpZgotCi0gIGNhbGwgczpBZGRTZXBhcmF0b3JzKCkKLQotICAiIHJldHVybiB0byBzdGFydAotICBrZWVwanVtcHMgbm9ybWFsISBgdAotCi0gIGxldCAmc2MgPSBzYXZlX3NjCi1lbmRmdW5jdGlvbgotCi0KLSItLS0tCi0iIEdldCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgZm9yIGEgZmlsZQotIgotZnVuY3Rpb24hIHM6RmlsZU1vZERhdGUobmFtZSkKLSAgbGV0IGZpbGV0aW1lPWdldGZ0aW1lKGE6bmFtZSkKLSAgaWYgZmlsZXRpbWUgPiAwCi0gICAgcmV0dXJuIHN0cmZ0aW1lKGc6ZXhwbERhdGVGb3JtYXQsZmlsZXRpbWUpIC4gIiCrqyIgLiBmaWxldGltZQotICBlbHNlCi0gICAgcmV0dXJuICIiCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIERlbGV0ZSBhIGZpbGUgb3IgZmlsZXMKLSIKLWZ1bmN0aW9uISBzOkRlbGV0ZUZpbGUoKSByYW5nZQotICBsZXQgb2xkUmVwID0gJnJlcG9ydAotICBsZXQgJnJlcG9ydCA9IDEwMDAKLQotICBsZXQgZmlsZXNEZWxldGVkID0gMAotICBsZXQgc3RvcERlbCA9IDAKLSAgbGV0IGRlbEFsbCA9IDAKLSAgbGV0IGN1cnJMaW5lID0gYTpmaXJzdGxpbmUKLSAgbGV0IGxhc3RMaW5lID0gYTpsYXN0bGluZQotICBzZXRsb2NhbCBub3JlYWRvbmx5IG1vZGlmaWFibGUKLQotICB3aGlsZSAoKGN1cnJMaW5lIDw9IGxhc3RMaW5lKSAmJiAoc3RvcERlbD09MCkpCi0gICAgZXhlYyhjdXJyTGluZSkKLSAgICBsZXQgZmlsZU5hbWU9czpHZXRGdWxsRmlsZU5hbWUoKQotICAgIGlmIGlzZGlyZWN0b3J5KGZpbGVOYW1lKQotICAgICAgZWNobyBmaWxlTmFtZS4iIDogRGlyZWN0b3J5IGRlbGV0aW9uIG5vdCBzdXBwb3J0ZWQgeWV0IgotICAgICAgbGV0IGN1cnJMaW5lID0gY3VyckxpbmUgKyAxCi0gICAgZWxzZQotICAgICAgaWYgZGVsQWxsID09IDAKLQlsZXQgc3VyZT1pbnB1dCgiRGVsZXRlICIuZmlsZU5hbWUuIiAoeS9uL2EvcSk/ICIpCi0JaWYgc3VyZT09ImEiCi0JICBsZXQgZGVsQWxsID0gMQotCWVuZGlmCi0gICAgICBlbmRpZgotICAgICAgaWYgKHN1cmU9PSJ5IikgfHwgKHN1cmU9PSJhIikKLQlsZXQgc3VjY2Vzcz1kZWxldGUoZmlsZU5hbWUpCi0JaWYgc3VjY2VzcyE9MAotCSAgZXhlYyAoIiAiKQotCSAgZWNobyAiXG5DYW5ub3QgZGVsZXRlICIuZmlsZU5hbWUKLQkgIGxldCBjdXJyTGluZSA9IGN1cnJMaW5lICsgMQotCWVsc2UKLQkgIGQgXwotCSAgbGV0IGZpbGVzRGVsZXRlZCA9IGZpbGVzRGVsZXRlZCArIDEKLQkgIGxldCBsYXN0TGluZSA9IGxhc3RMaW5lIC0gMQotCWVuZGlmCi0gICAgICBlbHNlaWYgc3VyZT09InEiCi0JbGV0IHN0b3BEZWwgPSAxCi0gICAgICBlbHNlaWYgc3VyZT09Im4iCi0JbGV0IGN1cnJMaW5lID0gY3VyckxpbmUgKyAxCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZHdoaWxlCi0gIGVjaG8gIlxuIi5maWxlc0RlbGV0ZWQuIiBmaWxlcyBkZWxldGVkIgotICBsZXQgJnJlcG9ydCA9IG9sZFJlcAotICBzZXRsb2NhbCBub21vZGlmaWVkCi0gIHNldGxvY2FsIHJlYWRvbmx5IG5vbW9kaWZpYWJsZQotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBSZW5hbWUgYSBmaWxlCi0iCi1mdW5jdGlvbiEgczpSZW5hbWVGaWxlKCkKLSAgbGV0IGZpbGVOYW1lPXM6R2V0RnVsbEZpbGVOYW1lKCkKLSAgc2V0bG9jYWwgbm9yZWFkb25seSBtb2RpZmlhYmxlCi0gIGlmIGlzZGlyZWN0b3J5KGZpbGVOYW1lKQotICAgIGVjaG8gIkRpcmVjdG9yeSByZW5hbWluZyBub3Qgc3VwcG9ydGVkIHlldCIKLSAgZWxzZWlmIGZpbGVyZWFkYWJsZShmaWxlTmFtZSkKLSAgICBsZXQgYWx0TmFtZT1pbnB1dCgiUmVuYW1lICIuZmlsZU5hbWUuIiB0byA6ICIpCi0gICAgZWNobyAiICIKLSAgICBpZiBhbHROYW1lPT0iIgotICAgICAgc2V0bG9jYWwgcmVhZG9ubHkgbm9tb2RpZmlhYmxlCi0gICAgICByZXR1cm4KLSAgICBlbmRpZgotICAgIGxldCBzdWNjZXNzPXJlbmFtZShmaWxlTmFtZSwgYjpjb21wbGV0ZVBhdGguYWx0TmFtZSkKLSAgICBpZiBzdWNjZXNzIT0wCi0gICAgICBlY2hvICJDYW5ub3QgcmVuYW1lICIuZmlsZU5hbWUuICIgdG8gIi5hbHROYW1lCi0gICAgZWxzZQotICAgICAgZWNobyAiUmVuYW1lZCAiLmZpbGVOYW1lLiIgdG8gIi5hbHROYW1lCi0gICAgICBsZXQgb2xkUmVwPSZyZXBvcnQKLSAgICAgIHNldCByZXBvcnQ9MTAwMAotICAgICAgZSEKLSAgICAgIGxldCAmcmVwb3J0PW9sZFJlcAotICAgIGVuZGlmCi0gIGVuZGlmCi0gIHNldGxvY2FsIG5vbW9kaWZpZWQKLSAgc2V0bG9jYWwgcmVhZG9ubHkgbm9tb2RpZmlhYmxlCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFRvZ2dsZSBiZXR3ZWVuIHNob3J0IGFuZCBsb25nIGhlbHAKLSIKLWZ1bmN0aW9uISBzOlRvZ2dsZUhlbHAoKQotICBpZiBleGlzdHMoInc6bG9uZ2hlbHAiKSAmJiB3OmxvbmdoZWxwPT0wCi0gICAgbGV0IHc6bG9uZ2hlbHA9MQotICAgIGxldCBzOmxvbmdoZWxwPTEKLSAgZWxzZQotICAgIGxldCB3OmxvbmdoZWxwPTAKLSAgICBsZXQgczpsb25naGVscD0wCi0gIGVuZGlmCi0gICIgQWxsb3cgbW9kaWZpY2F0aW9uCi0gIHNldGxvY2FsIG5vcmVhZG9ubHkgbW9kaWZpYWJsZQotICBjYWxsIHM6VXBkYXRlSGVhZGVyKCkKLSAgIiBEaXNhbGxvdyBtb2RpZmljYXRpb24KLSAgc2V0bG9jYWwgcmVhZG9ubHkgbm9tb2RpZmlhYmxlCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFVwZGF0ZSB0aGUgaGVhZGVyCi0iCi1mdW5jdGlvbiEgczpVcGRhdGVIZWFkZXIoKQotICBsZXQgb2xkUmVwPSZyZXBvcnQKLSAgc2V0IHJlcG9ydD0xMDAwMAotICAiIFNhdmUgcG9zaXRpb24KLSAgbm9ybWFsISBtdAotICAiIFJlbW92ZSBvbGQgaGVhZGVyCi0gIDAKLSAgMSwvXiI9LyBkIF8KLSAgIiBBZGQgbmV3IGhlYWRlcgotICBjYWxsIHM6QWRkSGVhZGVyKCkKLSAgIiBHbyBiYWNrIHdoZXJlIHdlIGNhbWUgZnJvbSBpZiBwb3NzaWJsZQotICAwCi0gIGlmIGxpbmUoIid0IikgIT0gMAotICAgIGtlZXBqdW1wcyBub3JtYWwhIGB0Ci0gIGVuZGlmCi0KLSAgbGV0ICZyZXBvcnQ9b2xkUmVwCi0gIHNldGxvY2FsIG5vbW9kaWZpZWQKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgVG9nZ2xlIGxvbmcgdnMuIHNob3J0IGxpc3RpbmcKLSIKLWZ1bmN0aW9uISBzOlRvZ2dsZUxvbmdMaXN0KCkKLSAgc2V0bG9jYWwgbm9yZWFkb25seSBtb2RpZmlhYmxlCi0gIGlmIGV4aXN0cygidzpsb25nbGlzdCIpICYmIHc6bG9uZ2xpc3Q9PTEKLSAgICBsZXQgdzpsb25nbGlzdD0wCi0gICAgbGV0IHM6bG9uZ2xpc3Q9MAotICBlbHNlCi0gICAgbGV0IHc6bG9uZ2xpc3Q9MQotICAgIGxldCBzOmxvbmdsaXN0PTEKLSAgZW5kaWYKLSAgY2FsbCBzOkFkZEZpbGVJbmZvKCkKLSAgc2V0bG9jYWwgcmVhZG9ubHkgbm9tb2RpZmlhYmxlCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFNob3cgYWxsIGZpbGVzIC0gcmVtb3ZlIGZpbHRlcmluZwotIgotZnVuY3Rpb24hIHM6U2hvd0FsbEZpbGVzKCkKLSAgc2V0bG9jYWwgbm9yZWFkb25seSBtb2RpZmlhYmxlCi0gIGxldCBiOmZpbHRlckZvcm11bGE9IiIKLSAgbGV0IGI6ZmlsdGVyaW5nPSIiCi0gIGNhbGwgczpTaG93RGlyZWN0b3J5KCkKLSAgc2V0bG9jYWwgcmVhZG9ubHkgbm9tb2RpZmlhYmxlCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIEZpZ3VyZSBvdXQgd2hhdCBzZWN0aW9uIHdlIGFyZSBpbgotIgotZnVuY3Rpb24hIHM6R2V0U2VjdGlvbigpCi0gIGxldCBmbj1zOkdldEZpbGVOYW1lKCkKLSAgbGV0IHNlY3Rpb249ImZpbGUiCi0gIGlmIGZuID1+ICcvJCcKLSAgICBsZXQgc2VjdGlvbj0iZGlyZWN0b3J5IgotICBlbHNlaWYgZm4gPX4gYjpzdWZmaXhlc1JlZ2V4cAotICAgIGxldCBzZWN0aW9uPSJzdWZmaXhlcyIKLSAgZW5kaWYKLSAgcmV0dXJuIHNlY3Rpb24KLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgUmVtb3ZlIHNlY3Rpb24gc2VwYXJhdG9ycwotIgotZnVuY3Rpb24hIHM6UmVtb3ZlU2VwYXJhdG9ycygpCi0gIGlmICFnOmV4cGxVc2VTZXBhcmF0b3JzCi0gICAgcmV0dXJuCi0gIGVuZGlmCi0gIDAKLSAgc2lsZW50ISBleGVjICcvXiI9LysxLCRnL14nIC4gczpzZXBhcmF0b3IgLiAiL2QgXyIKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgQWRkIHNlY3Rpb24gc2VwYXJhdG9ycwotIiAgIGJldHdlZW4gZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGlmIHRoZXkgYXJlIHNlcGFyYXRlZAotIiAgIGJldHdlZW4gZmlsZXMgYW5kICdzdWZmaXhlcycgZmlsZXMgaWYgdGhleSBhcmUgc2VwYXJhdGVkCi1mdW5jdGlvbiEgczpBZGRTZXBhcmF0b3JzKCkKLSAgaWYgIWc6ZXhwbFVzZVNlcGFyYXRvcnMKLSAgICByZXR1cm4KLSAgZW5kaWYKLSAgMAotICAvXiI9LysxCi0gIGxldCBsYXN0c2VjPXM6R2V0U2VjdGlvbigpCi0gICsxCi0gIC4sJGcvXi9sZXQgc2VjPXM6R2V0U2VjdGlvbigpIHwKLQkgICAgICAgXGlmIGc6ZXhwbERpcnNGaXJzdCAhPSAwICYmIHNlYyAhPSBsYXN0c2VjICYmCi0JICAgICAgIFwgICAobGFzdHNlYyA9PSAiZGlyZWN0b3J5IiB8fCBzZWMgPT0gImRpcmVjdG9yeSIpIHwKLQkgICAgICAgXCAgZXhlYyAibm9ybWFsISBJIiAuIHM6c2VwYXJhdG9yIC4gIlxuXDxlc2M+IiB8Ci0JICAgICAgIFxlbHNlaWYgZzpleHBsU3VmZml4ZXNMYXN0ICE9IDAgJiYgc2VjICE9IGxhc3RzZWMgJiYKLQkgICAgICAgXCAgIChsYXN0c2VjID09ICJzdWZmaXhlcyIgfHwgc2VjID09ICJzdWZmaXhlcyIpIHwKLQkgICAgICAgXCAgZXhlYyAibm9ybWFsISBJIiAuIHM6c2VwYXJhdG9yIC4gIlxuXDxlc2M+IiB8Ci0JICAgICAgIFxlbmRpZiB8Ci0JICAgICAgIFxsZXQgbGFzdHNlYz1zZWMKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgR2VuZXJhbCBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbgotIgotZnVuY3Rpb24hIHM6U3RyQ21wKGxpbmUxLCBsaW5lMiwgZGlyZWN0aW9uKQotICBpZiBhOmxpbmUxIDwgYTpsaW5lMgotICAgIHJldHVybiAtYTpkaXJlY3Rpb24KLSAgZWxzZWlmIGE6bGluZTEgPiBhOmxpbmUyCi0gICAgcmV0dXJuIGE6ZGlyZWN0aW9uCi0gIGVsc2UKLSAgICByZXR1cm4gMAotICBlbmRpZgotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBGdW5jdGlvbiBmb3IgdXNlIHdpdGggU29ydCgpLCB0byBjb21wYXJlIHRoZSBmaWxlIG5hbWVzCi0iIERlZmF1bHQgc29ydCBpcyB0byBwdXQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBidXQgd2l0aCBhbGwgZGlyZWN0b3J5Ci0iIG5hbWVzIGJlZm9yZSBhbGwgZmlsZSBuYW1lcwotIgotZnVuY3Rpb24hIHM6RmlsZU5hbWVDbXAobGluZTEsIGxpbmUyLCBkaXJlY3Rpb24pCi0gIGxldCBmMT1zOkV4dHJhY3RGaWxlTmFtZShhOmxpbmUxKQotICBsZXQgZjI9czpFeHRyYWN0RmlsZU5hbWUoYTpsaW5lMikKLQotICAiIFB1dCBkaXJlY3RvcnkgbmFtZXMgYmVmb3JlIGZpbGUgbmFtZXMKLSAgaWYgKGc6ZXhwbERpcnNGaXJzdCAhPSAwKSAmJiAoZjEgPX4gJ1wvJCcpICYmIChmMiAhfiAnXC8kJykKLSAgICByZXR1cm4gLWc6ZXhwbERpcnNGaXJzdAotICBlbHNlaWYgKGc6ZXhwbERpcnNGaXJzdCAhPSAwKSAmJiAoZjEgIX4gJ1wvJCcpICYmIChmMiA9fiAnXC8kJykKLSAgICByZXR1cm4gZzpleHBsRGlyc0ZpcnN0Ci0gIGVsc2VpZiAoZzpleHBsU3VmZml4ZXNMYXN0ICE9IDApICYmIChmMSA9fiBiOnN1ZmZpeGVzUmVnZXhwKSAmJiAoZjIgIX4gYjpzdWZmaXhlc1JlZ2V4cCkKLSAgICByZXR1cm4gZzpleHBsU3VmZml4ZXNMYXN0Ci0gIGVsc2VpZiAoZzpleHBsU3VmZml4ZXNMYXN0ICE9IDApICYmIChmMSAhfiBiOnN1ZmZpeGVzUmVnZXhwKSAmJiAoZjIgPX4gYjpzdWZmaXhlc1JlZ2V4cCkKLSAgICByZXR1cm4gLWc6ZXhwbFN1ZmZpeGVzTGFzdAotICBlbHNlCi0gICAgcmV0dXJuIHM6U3RyQ21wKHN1YnN0aXR1dGUoZjEsICIvJCIsICIiLCAiIiksIHN1YnN0aXR1dGUoZjIsICIvJCIsICIiLCAiIiksIGE6ZGlyZWN0aW9uKQotICBlbmRpZgotCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIEZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBTb3J0KCksIHRvIGNvbXBhcmUgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIGRhdGVzCi0iIERlZmF1bHQgc29ydCBpcyB0byBwdXQgTkVXRVNUIGZpbGVzIGZpcnN0LiAgUmV2ZXJzZSB3aWxsIHB1dCBvbGRlc3QKLSIgZmlsZXMgZmlyc3QKLSIKLWZ1bmN0aW9uISBzOkZpbGVEYXRlQ21wKGxpbmUxLCBsaW5lMiwgZGlyZWN0aW9uKQotICBsZXQgZjE9czpFeHRyYWN0RmlsZU5hbWUoYTpsaW5lMSkKLSAgbGV0IGYyPXM6RXh0cmFjdEZpbGVOYW1lKGE6bGluZTIpCi0gIGxldCB0MT1zOkV4dHJhY3RGaWxlRGF0ZShhOmxpbmUxKQotICBsZXQgdDI9czpFeHRyYWN0RmlsZURhdGUoYTpsaW5lMikKLQotICAiIFB1dCBkaXJlY3RvcnkgbmFtZXMgYmVmb3JlIGZpbGUgbmFtZXMKLSAgaWYgKGc6ZXhwbERpcnNGaXJzdCAhPSAwKSAmJiAoZjEgPX4gJ1wvJCcpICYmIChmMiAhfiAnXC8kJykKLSAgICByZXR1cm4gLWc6ZXhwbERpcnNGaXJzdAotICBlbHNlaWYgKGc6ZXhwbERpcnNGaXJzdCAhPSAwKSAmJiAoZjEgIX4gJ1wvJCcpICYmIChmMiA9fiAnXC8kJykKLSAgICByZXR1cm4gZzpleHBsRGlyc0ZpcnN0Ci0gIGVsc2VpZiAoZzpleHBsU3VmZml4ZXNMYXN0ICE9IDApICYmIChmMSA9fiBiOnN1ZmZpeGVzUmVnZXhwKSAmJiAoZjIgIX4gYjpzdWZmaXhlc1JlZ2V4cCkKLSAgICByZXR1cm4gZzpleHBsU3VmZml4ZXNMYXN0Ci0gIGVsc2VpZiAoZzpleHBsU3VmZml4ZXNMYXN0ICE9IDApICYmIChmMSAhfiBiOnN1ZmZpeGVzUmVnZXhwKSAmJiAoZjIgPX4gYjpzdWZmaXhlc1JlZ2V4cCkKLSAgICByZXR1cm4gLWc6ZXhwbFN1ZmZpeGVzTGFzdAotICBlbHNlaWYgdDEgPiB0MgotICAgIHJldHVybiAtYTpkaXJlY3Rpb24KLSAgZWxzZWlmIHQxIDwgdDIKLSAgICByZXR1cm4gYTpkaXJlY3Rpb24KLSAgZWxzZQotICAgIHJldHVybiBzOlN0ckNtcChzdWJzdGl0dXRlKGYxLCAiLyQiLCAiIiwgIiIpLCBzdWJzdGl0dXRlKGYyLCAiLyQiLCAiIiwgIiIpLCAxKQotICBlbmRpZgotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBGdW5jdGlvbiBmb3IgdXNlIHdpdGggU29ydCgpLCB0byBjb21wYXJlIHRoZSBmaWxlIHNpemVzCi0iIERlZmF1bHQgc29ydCBpcyB0byBwdXQgbGFyZ2VzdCBmaWxlcyBmaXJzdC4gIFJldmVyc2Ugd2lsbCBwdXQKLSIgc21hbGxlc3QgZmlsZXMgZmlyc3QKLSIKLWZ1bmN0aW9uISBzOkZpbGVTaXplQ21wKGxpbmUxLCBsaW5lMiwgZGlyZWN0aW9uKQotICBsZXQgZjE9czpFeHRyYWN0RmlsZU5hbWUoYTpsaW5lMSkKLSAgbGV0IGYyPXM6RXh0cmFjdEZpbGVOYW1lKGE6bGluZTIpCi0gIGxldCBzMT1zOkV4dHJhY3RGaWxlU2l6ZShhOmxpbmUxKQotICBsZXQgczI9czpFeHRyYWN0RmlsZVNpemUoYTpsaW5lMikKLQotICBpZiAoZzpleHBsRGlyc0ZpcnN0ICE9IDApICYmIChmMSA9fiAnXC8kJykgJiYgKGYyICF+ICdcLyQnKQotICAgIHJldHVybiAtZzpleHBsRGlyc0ZpcnN0Ci0gIGVsc2VpZiAoZzpleHBsRGlyc0ZpcnN0ICE9IDApICYmIChmMSAhfiAnXC8kJykgJiYgKGYyID1+ICdcLyQnKQotICAgIHJldHVybiBnOmV4cGxEaXJzRmlyc3QKLSAgZWxzZWlmIChnOmV4cGxTdWZmaXhlc0xhc3QgIT0gMCkgJiYgKGYxID1+IGI6c3VmZml4ZXNSZWdleHApICYmIChmMiAhfiBiOnN1ZmZpeGVzUmVnZXhwKQotICAgIHJldHVybiBnOmV4cGxTdWZmaXhlc0xhc3QKLSAgZWxzZWlmIChnOmV4cGxTdWZmaXhlc0xhc3QgIT0gMCkgJiYgKGYxICF+IGI6c3VmZml4ZXNSZWdleHApICYmIChmMiA9fiBiOnN1ZmZpeGVzUmVnZXhwKQotICAgIHJldHVybiAtZzpleHBsU3VmZml4ZXNMYXN0Ci0gIGVsc2VpZiBzMSA+IHMyCi0gICAgcmV0dXJuIC1hOmRpcmVjdGlvbgotICBlbHNlaWYgczEgPCBzMgotICAgIHJldHVybiBhOmRpcmVjdGlvbgotICBlbHNlCi0gICAgcmV0dXJuIHM6U3RyQ21wKHN1YnN0aXR1dGUoZjEsICIvJCIsICIiLCAiIiksIHN1YnN0aXR1dGUoZjIsICIvJCIsICIiLCAiIiksIDEpCi0gIGVuZGlmCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFNvcnQgbGluZXMuICBTb3J0UigpIGlzIGNhbGxlZCByZWN1cnNpdmVseS4KLSIKLWZ1bmN0aW9uISBzOlNvcnRSKHN0YXJ0LCBlbmQsIGNtcCwgZGlyZWN0aW9uKQotCi0gICIgQm90dG9tIG9mIHRoZSByZWN1cnNpb24gaWYgc3RhcnQgcmVhY2hlcyBlbmQKLSAgaWYgYTpzdGFydCA+PSBhOmVuZAotICAgIHJldHVybgotICBlbmRpZgotICAiCi0gIGxldCBwYXJ0aXRpb24gPSBhOnN0YXJ0IC0gMQotICBsZXQgbWlkZGxlID0gcGFydGl0aW9uCi0gIGxldCBwYXJ0U3RyID0gZ2V0bGluZSgoYTpzdGFydCArIGE6ZW5kKSAvIDIpCi0gIGxldCBpID0gYTpzdGFydAotICB3aGlsZSAoaSA8PSBhOmVuZCkKLSAgICBsZXQgc3RyID0gZ2V0bGluZShpKQotICAgIGV4ZWMgImxldCByZXN1bHQgPSAiIC4gYTpjbXAgLiAiKHN0ciwgcGFydFN0ciwgIiAuIGE6ZGlyZWN0aW9uIC4gIikiCi0gICAgaWYgcmVzdWx0IDw9IDAKLSAgICAgICIgTmVlZCB0byBwdXQgaXQgYmVmb3JlIHRoZSBwYXJ0aXRpb24uICBTd2FwIGxpbmVzIGkgYW5kIHBhcnRpdGlvbi4KLSAgICAgIGxldCBwYXJ0aXRpb24gPSBwYXJ0aXRpb24gKyAxCi0gICAgICBpZiByZXN1bHQgPT0gMAotCWxldCBtaWRkbGUgPSBwYXJ0aXRpb24KLSAgICAgIGVuZGlmCi0gICAgICBpZiBpICE9IHBhcnRpdGlvbgotCWxldCBzdHIyID0gZ2V0bGluZShwYXJ0aXRpb24pCi0JY2FsbCBzZXRsaW5lKGksIHN0cjIpCi0JY2FsbCBzZXRsaW5lKHBhcnRpdGlvbiwgc3RyKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICAgIGxldCBpID0gaSArIDEKLSAgZW5kd2hpbGUKLQotICAiIE5vdyB3ZSBoYXZlIGEgcG9pbnRlciB0byB0aGUgIm1pZGRsZSIgZWxlbWVudCwgYXMgZmFyIGFzIHBhcnRpdGlvbmluZwotICAiIGdvZXMsIHdoaWNoIGNvdWxkIGJlIGFueXdoZXJlIGJlZm9yZSB0aGUgcGFydGl0aW9uLiAgTWFrZSBzdXJlIGl0IGlzIGF0Ci0gICIgdGhlIGVuZCBvZiB0aGUgcGFydGl0aW9uLgotICBpZiBtaWRkbGUgIT0gcGFydGl0aW9uCi0gICAgbGV0IHN0ciA9IGdldGxpbmUobWlkZGxlKQotICAgIGxldCBzdHIyID0gZ2V0bGluZShwYXJ0aXRpb24pCi0gICAgY2FsbCBzZXRsaW5lKG1pZGRsZSwgc3RyMikKLSAgICBjYWxsIHNldGxpbmUocGFydGl0aW9uLCBzdHIpCi0gIGVuZGlmCi0gIGNhbGwgczpTb3J0UihhOnN0YXJ0LCBwYXJ0aXRpb24gLSAxLCBhOmNtcCxhOmRpcmVjdGlvbikKLSAgY2FsbCBzOlNvcnRSKHBhcnRpdGlvbiArIDEsIGE6ZW5kLCBhOmNtcCxhOmRpcmVjdGlvbikKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgVG8gU29ydCBhIHJhbmdlIG9mIGxpbmVzLCBwYXNzIHRoZSByYW5nZSB0byBTb3J0KCkgYWxvbmcgd2l0aCB0aGUgbmFtZSBvZiBhCi0iIGZ1bmN0aW9uIHRoYXQgd2lsbCBjb21wYXJlIHR3byBsaW5lcy4KLSIKLWZ1bmN0aW9uISBzOlNvcnQoY21wLGRpcmVjdGlvbikgcmFuZ2UKLSAgY2FsbCBzOlNvcnRSKGE6Zmlyc3RsaW5lLCBhOmxhc3RsaW5lLCBhOmNtcCwgYTpkaXJlY3Rpb24pCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFJldmVyc2UgdGhlIGN1cnJlbnQgc29ydCBvcmRlcgotIgotZnVuY3Rpb24hIHM6U29ydFJldmVyc2UoKQotICBpZiBleGlzdHMoInc6c29ydGRpcmVjdGlvbiIpICYmIHc6c29ydGRpcmVjdGlvbiA9PSAtMQotICAgIGxldCB3OnNvcnRkaXJlY3Rpb24gPSAxCi0gICAgbGV0IHc6c29ydGRpcmxhYmVsICA9ICIiCi0gIGVsc2UKLSAgICBsZXQgdzpzb3J0ZGlyZWN0aW9uID0gLTEKLSAgICBsZXQgdzpzb3J0ZGlybGFiZWwgID0gInJldmVyc2UgIgotICBlbmRpZgotICBsZXQgczpzb3J0Ynk9dzpzb3J0ZGlybGFiZWwgLiB3OnNvcnR0eXBlCi0gIGNhbGwgczpTb3J0TGlzdGluZygiIikKLWVuZGZ1bmN0aW9uCi0KLSItLS0KLSIgVG9nZ2xlIHRocm91Z2ggdGhlIGRpZmZlcmVudCBzb3J0IG9yZGVycwotIgotZnVuY3Rpb24hIHM6U29ydFNlbGVjdCgpCi0gICIgU2VsZWN0IHRoZSBuZXh0IHNvcnQgb3B0aW9uCi0gIGlmICFleGlzdHMoInc6c29ydHR5cGUiKQotICAgIGxldCB3OnNvcnR0eXBlPSJuYW1lIgotICBlbHNlaWYgdzpzb3J0dHlwZSA9PSAibmFtZSIKLSAgICBsZXQgdzpzb3J0dHlwZT0ic2l6ZSIKLSAgZWxzZWlmIHc6c29ydHR5cGUgPT0gInNpemUiCi0gICAgbGV0IHc6c29ydHR5cGU9ImRhdGUiCi0gIGVsc2UKLSAgICBsZXQgdzpzb3J0dHlwZT0ibmFtZSIKLSAgZW5kaWYKLSAgbGV0IHM6c29ydGJ5PXc6c29ydGRpcmxhYmVsIC4gdzpzb3J0dHlwZQotICBjYWxsIHM6U29ydExpc3RpbmcoIiIpCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFNvcnQgdGhlIGZpbGUgbGlzdGluZwotIgotZnVuY3Rpb24hIHM6U29ydExpc3RpbmcobXNnKQotICAgICIgU2F2ZSB0aGUgbGluZSB3ZSBzdGFydCBvbiBzbyB3ZSBjYW4gZ28gYmFjayB0aGVyZSB3aGVuIGRvbmUKLSAgICAiIHNvcnRpbmcKLSAgICBsZXQgc3RhcnRsaW5lID0gZ2V0bGluZSgiLiIpCi0gICAgbGV0IGNvbD1jb2woIi4iKQotICAgIGxldCBsaW49bGluZSgiLiIpCi0KLSAgICAiIEFsbG93IG1vZGlmaWNhdGlvbgotICAgIHNldGxvY2FsIG5vcmVhZG9ubHkgbW9kaWZpYWJsZQotCi0gICAgIiBTZW5kIGEgbWVzc2FnZSBhYm91dCB3aGF0IHdlJ3JlIGRvaW5nCi0gICAgIiBEb24ndCByZWFsbHkgbmVlZCB0aGlzIC0gaXQgY2FuIGNhdXNlIGhpdCByZXR1cm4gcHJvbXB0cwotIiAgIGVjaG8gYTptc2cgLiAiU29ydGluZyBieSIgLiB3OnNvcnRkaXJsYWJlbCAuIHc6c29ydHR5cGUKLQotICAgICIgQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIG91dCBvZiB0aGUgc3VmZml4ZXMgb3B0aW9uIGluIGNhc2UKLSAgICAiIHdlIG5lZWQgaXQuCi0gICAgY2FsbCBzOlNldFN1ZmZpeGVzTGFzdCgpCi0KLSAgICAiIFJlbW92ZSBzZWN0aW9uIHNlcGFyYXRvcnMKLSAgICBjYWxsIHM6UmVtb3ZlU2VwYXJhdG9ycygpCi0KLSAgICAiIERvIHRoZSBzb3J0Ci0gICAgMAotICAgIGlmIHc6c29ydHR5cGUgPT0gInNpemUiCi0gICAgICAvXiI9LysxLCRjYWxsIHM6U29ydCgiczpGaWxlU2l6ZUNtcCIsdzpzb3J0ZGlyZWN0aW9uKQotICAgIGVsc2VpZiB3OnNvcnR0eXBlID09ICJkYXRlIgotICAgICAgL14iPS8rMSwkY2FsbCBzOlNvcnQoInM6RmlsZURhdGVDbXAiLHc6c29ydGRpcmVjdGlvbikKLSAgICBlbHNlCi0gICAgICAvXiI9LysxLCRjYWxsIHM6U29ydCgiczpGaWxlTmFtZUNtcCIsdzpzb3J0ZGlyZWN0aW9uKQotICAgIGVuZGlmCi0KLSAgICAiIFJlcGxhY2UgdGhlIGhlYWRlciB3aXRoIHVwZGF0ZWQgaW5mb3JtYXRpb24KLSAgICBjYWxsIHM6VXBkYXRlSGVhZGVyKCkKLQotICAgICIgUmVzdG9yZSBzZWN0aW9uIHNlcGFyYXRvcnMKLSAgICBjYWxsIHM6QWRkU2VwYXJhdG9ycygpCi0KLSAgICAiIFJldHVybiB0byB0aGUgcG9zaXRpb24gd2Ugc3RhcnRlZCBvbgotICAgIDAKLSAgICBpZiBzZWFyY2goJ1xtXicuZXNjYXBlKHN0YXJ0bGluZSxzOmVzY3JlZ2V4cCksJ1cnKSA8PSAwCi0gICAgICBleGVjdXRlIGxpbgotICAgIGVuZGlmCi0gICAgZXhlY3V0ZSAibm9ybWFsISIgY29sIC4gInwiCi0KLSAgICAiIERpc2FsbG93IG1vZGlmaWNhdGlvbgotICAgIHNldGxvY2FsIG5vbW9kaWZpZWQKLSAgICBzZXRsb2NhbCByZWFkb25seSBub21vZGlmaWFibGUKLQotZW5kZnVuY3Rpb24KLQotIi0tLQotIiBTZXR1cCBmb3IgZWRpdGluZyBkaXJlY3RvcmllcyBhZnRlciBzdGFydGluZyB1cCBieSBnb2luZyB0byBlYWNoIHdpbmRvdy4KLSIgUmVxdWlyZWQgZm9yICJ2aW0gLW8gZmlsZW5hbWUgZGlybmFtZSIKLSIKLWZ1bmN0aW9uISBzOkVkaXRBbGwoKQotICBpZiB3aW5idWZucigyKSA9PSAtMQotICAgIHJldHVybgotICBlbmRpZgotICBsZXQgY21kID0gd2lucmVzdGNtZCgpCi0gIGxldCBjdXJ3aW4gPSB3aW5ucigpCi0gIHdoaWxlIDEKLSAgICB3aW5jbWQgdwotICAgIGlmIHdpbm5yKCkgPT0gY3Vyd2luCi0gICAgICBicmVhawotICAgIGVuZGlmCi0gICAgY2FsbCBzOkVkaXREaXIoKQotICBlbmR3aGlsZQotICBleGUgY21kCi1lbmRmdW5jdGlvbgotCi0iLS0tCi0iIFNldCB1cCB0aGUgYXV0b2NvbW1hbmQgdG8gYWxsb3cgZGlyZWN0b3JpZXMgdG8gYmUgZWRpdGVkCi0iCi1hdWdyb3VwIGZpbGVFeHBsb3JlcgotICBhdSEKLSAgIiBGaWxsIHRoZSB3aW5kb3cgd2hlbiBlbnRlcmluZyB0aGUgYnVmZmVyOyAiOmVkaXQgZGlyIi4KLSAgYXUgQnVmRW50ZXIgKiBjYWxsIHM6RWRpdERpcigpCi0gICIgU2V0IHRoZSB3aW5kb3cgdmFyaWFibGVzIGFmdGVyIGEgc3BsaXQ7ICI6c3BsaXQiLgotICBhdSBXaW5FbnRlciAqIGlmICFleGlzdHMoInc6c29ydGRpcmVjdGlvbiIpIHwgY2FsbCBzOkVkaXREaXIoKSB8IGVuZGlmCi0gICIgRmlsbCB0aGUgd2luZG93cyBhZnRlciBWaW0gaGFzIHN0YXJ0ZWQgdXAuCi0gIGF1IFZpbUVudGVyICogY2FsbCBzOkVkaXRBbGwoKQotYXVncm91cCBlbmQKLQotIiByZXN0b3JlICdjcG8nCi1sZXQgJmNwbyA9IHM6Y3BvX3NhdmUKLXVubGV0IHM6Y3BvX3NhdmUKZGlmZiAtLWdpdCBhL3J1bnRpbWUvcGx1Z2luL25ldHJ3LnZpbSBiL3J1bnRpbWUvcGx1Z2luL25ldHJ3LnZpbQppbmRleCA5ZjRmOTFiLi5lNmFmNDFiIDEwMDY0NAotLS0gYS9ydW50aW1lL3BsdWdpbi9uZXRydy52aW0KKysrIGIvcnVudGltZS9wbHVnaW4vbmV0cncudmltCkBAIC0xLDcgKzEsNyBAQAogIiBuZXRydy52aW06IEhhbmRsZXMgZmlsZSB0cmFuc2ZlciBhbmQgcmVtb3RlIGRpcmVjdG9yeSBsaXN0aW5nIGFjcm9zcyBhIG5ldHdvcmsKLSIgTGFzdCBDaGFuZ2U6CUp1biAzMCwgMjAwNAorIiBMYXN0IENoYW5nZToJSnVsIDA4LCAyMDA0CiAiIE1haW50YWluZXI6CUNoYXJsZXMgRS4gQ2FtcGJlbGwsIEpyLiBQaEQgICA8ZHJjaGlwTk9TUEFNIGF0IGNhbXBiZWxsZmFtaWx5LmJpej4KLSIgVmVyc2lvbjoJNDdnCUFTVFJPLU9OTFkKKyIgVmVyc2lvbjoJNDdsCSBBU1RSTy1PTkxZCiAiIExpY2Vuc2U6CVZpbSBMaWNlbnNlICAoc2VlIHZpbSdzIDpoZWxwIGxpY2Vuc2UpCiAiCiAiICBCdXQgYmUgZG9lcnMgb2YgdGhlIHdvcmQsIGFuZCBub3Qgb25seSBoZWFyZXJzLCBkZWx1ZGluZyB5b3VyIG93biBzZWx2ZXMKQEAgLTEyLDggKzEyLDkgQEAKIGlmIGV4aXN0cygibG9hZGVkX25ldHJ3IikgfHwgJmNwCiAgIGZpbmlzaAogZW5kaWYKLWxldCBsb2FkZWRfbmV0cncgPSAidjQ3ZwlBU1RSTy1PTkxZIgotbGV0IHM6c2F2ZV9jcG8gICA9ICZjcG8KK2xldCBsb2FkZWRfbmV0cncgICAgPSAidjQ3bAkgQVNUUk8tT05MWSIKK2xldCBzOnNhdmVfY3BvICAgICAgPSAmY3BvCitsZXQgbG9hZGVkX2V4cGxvcmVyID0gMQogc2V0IGNwbyZ2aW0KIAogIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc0LDYgKzc1LDM2IEBACiAgIiBhbHRlcm5hdGl2ZTogcmV2ZXJzZSAgKHogeSB4IC4uLikKICBsZXQgZzpuZXRyd19zb3J0X2RpcmVjdGlvbj0gIm5vcm1hbCIKIGVuZGlmCitpZiAhZXhpc3RzKCJnOm5ldHJ3X2xvbmdsaXN0IikgfHwgZzpuZXRyd19sb25nbGlzdCA9PSAwCisgbGV0IGc6bmV0cndfbG9uZ2xpc3Q9IDAKK2Vsc2UKKyBsZXQgZzpuZXRyd19sb25nbGlzdD0gMQorIGxldCBnOm5ldHJ3X2xpc3RfY21kPSAic3NoIEhPU1ROQU1FIGxzIC1GTGEgLWwiCitlbmRpZgoraWYgIWV4aXN0cygiZzpuZXRyd190aW1lZm10IikKKyBsZXQgZzpuZXRyd190aW1lZm10PSAiJWMiCitlbmRpZgoraWYgIWV4aXN0cygiZzpuZXRyd19sb2NhbF9ybWRpciIpCisgbGV0IGc6bmV0cndfbG9jYWxfcm1kaXI9ICJybWRpciIKK2VuZGlmCitpZiAhZXhpc3RzKCJnOm5ldHJ3X2xvY2FsX3JlbmFtZSIpCisgaWYgaGFzKCJ3aW4zMiIpCisgIGxldCBnOm5ldHJ3X2xvY2FsX3JlbmFtZT0gInJlbiIKKyBlbHNlaWYgaGFzKCJ1bml4IikKKyAgbGV0IGc6bmV0cndfbG9jYWxfcmVuYW1lPSAibXYiCisgZW5kaWYKK2VuZGlmCitpZiAhZXhpc3RzKCJnOm5ldHJ3X2xvY2FsX21rZGlyIikKKyBsZXQgZzpuZXRyd19sb2NhbF9ta2Rpcj0gIm1rZGlyIgorZW5kaWYKK2lmICFleGlzdHMoImc6bmV0cndfbWtkaXJfY21kIikKKyBsZXQgZzpuZXRyd19ta2Rpcl9jbWQ9ICJzc2ggSE9TVE5BTUUgbWtkaXIiCitlbmRpZgorCisiIEJ1ZkVudGVyIGV2ZW50IGlnbm9yZWQgYnkgZGVjaG8gd2hlbiBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdHJ1ZQorIiAgSGFzIGEgc2lkZSBlZmZlY3QgdGhhdCBkb2F1IEJ1ZlJlYWRQb3N0IGRvZXNuJ3Qgd29yaywgc28KKyIgIGZpbGVzIHJlYWQgYnkgbmV0d29yayB0cmFuc2ZlciBhcmVuJ3QgYXBwcm9wcmlhdGVseSBoaWdobGlnaHRlZC4KKyJsZXQgZzpkZWNob19idWZlbnRlciA9IDEJIkRlY2hvCiAKICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiIERlZmF1bHQgdmFsdWVzIGZvciBnbG9iYWwgcHJvdG9jb2wgdmFyaWFibGVzIHt7ezEKQEAgLTEyNSwxMSArMTU2LDEzIEBACiAKICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiIFRyYW5zcGFyZW5jeSBTdXBwb3J0OiB7e3sxCi0iIEF1dG8tZGV0ZWN0aW9uIGZvciBmdHA6Ly8qLCByY3A6Ly8qLCBzY3A6Ly8qLCBzZnRwOi8vKiwgaHR0cDovLyosIGRhdjovLyosCi0iIGFuZCByc3luYzovLyoKLSIgU2hvdWxkIG1ha2UgZmlsZSB0cmFuc2ZlcnMgYWNyb3NzIG5ldHdvcmtzIHRyYW5zcGFyZW50LiAgQ3VycmVudGx5IEkgaGF2ZW4ndAotIiBzdXBwb3J0ZWQgYXBwZW5kcy4gIEhleSwgZ290dGEgbGVhdmUgc29tZXRoaW5nIGZvciBhIGZ1dHVyZSA8bmV0cncudmltPiEKKyAiIEZpbGUgRXhwbG9yZXI6IHt7ezIKIGlmIHZlcnNpb24gPj0gNjAwCisgYXVncm91cCBGaWxlRXhwbG9yZXIKKyAgYXUhCisgIGF1IEJ1ZkVudGVyICogY2FsbCA8U0lEPkxvY2FsQnJvd3NlKGV4cGFuZCgiPGFmaWxlPiIpKQorIGF1Z3JvdXAgRU5ECisgIiBOZXR3b3JrIEhhbmRsZXI6IHt7ezIKICBhdWdyb3VwIE5ldHdvcmsKICAgYXUhCiAgIGlmIGhhcygid2luMzIiKQpAQCAtMzI4LDcgKzM2MSw3IEBACiAiICAgIGNhbGwgRGVjaG8oInJlYWQgdmlhIGZ0cCsubmV0cmMgKG1ldGhvZCAjMikiKQogICAgICBsZXQgbmV0cndfZm5hbWU9IGI6bmV0cndfZm5hbWUKICAgICAgbmV3Ci0gICAgIHNldCBmZj11bml4CisgICAgIHNldGxvY2FsIGZmPXVuaXgKICAgICAgZXhlICJwdXQgPSciLmc6bmV0cndfZnRwbW9kZS4iJyIKICAgICAgZXhlICJwdXQgPSdnZXQgIi5uZXRyd19mbmFtZS4iICIudG1wZmlsZS4iJyIKICAgICAgaWYgZXhpc3RzKCJnOm5ldHJ3X3BvcnQiKSAmJiBnOm5ldHJ3X3BvcnQgIT0gIiIKQEAgLTM1Myw3ICszODYsNyBAQAogIiAgICBjYWxsIERlY2hvKCJyZWFkIHZpYSBmdHArbWlwZiAobWV0aG9kICMzKSIpCiAgICAgbGV0IG5ldHJ3X2ZuYW1lPSBiOm5ldHJ3X2ZuYW1lCiAgICAgbmV3Ci0gICAgc2V0IGZmPXVuaXgKKyAgICBzZXRsb2NhbCBmZj11bml4CiAgICAgaWYgZXhpc3RzKCJnOm5ldHJ3X3BvcnQiKSAmJiBnOm5ldHJ3X3BvcnQgIT0gIiIKICAgICAgcHV0ID0nb3BlbiAnLmc6bmV0cndfbWFjaGluZS4nICcuZzpuZXRyd19wb3J0CiAgICAgZWxzZQpAQCAtNDQ0LDcgKzQ3Nyw3IEBACiAgICAgIiBDb25zdHJ1Y3QgZXhlY3V0aW9uIHN0cmluZyAoZm91ciBsaW5lcykgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCBmaWx0ZXIKICAgICBsZXQgbmV0cndfZm5hbWU9IGI6bmV0cndfZm5hbWUKICAgICBuZXcKLSAgICBzZXQgZmY9dW5peAorICAgIHNldGxvY2FsIGZmPXVuaXgKICAgICBpZiBleGlzdHMoImc6bmV0cndfcG9ydCIpICYmIGc6bmV0cndfcG9ydCAhPSAiIgogICAgICBwdXQgPSdvcGVuICcuZzpuZXRyd19tYWNoaW5lLicgJy5nOm5ldHJ3X3BvcnQKICAgICBlbHNlCkBAIC01MzgsNyArNTcxLDcgQEAKICAgIHVubGV0IGI6bmV0cndfZm5hbWUKICAgZW5kaWYKICAgY2FsbCBzOk5ldE9wdGlvblJlc3RvcmUoKQotIAorCiAiICBjYWxsIERyZXQoIk5ldFJlYWQiKQogZW5kZnVuCiAiIGVuZCBvZiBOZXRSZWFkCkBAIC02MTQsNyArNjQ3LDcgQEAKICAgICBleGUgYnVmbnIoIiMiKS4iYndpcGUhIgogICAgZWxzZQogICAgIGxldCBvbGR1bD0gJnVsCi0gICAgc2V0IHVsPS0xCisgICAgc2V0bG9jYWwgdWw9LTEKICAgICBleGUgYTpyZWFkY21kLiIgIi52OmNtZGFyZy4iICIuZm5hbWUKICAgICBpZiBkZWxsaW5lID4gMAogICAgICAiIHdpcGUgb3V0IGxhc3QgbGluZSwgd2hpY2ggc2hvdWxkIGJlIGEgYmxhbmsgbGluZSBhbnl3YXkKQEAgLTY0MSw2ICs2NzQsMTEgQEAKICIgICBjYWxsIERlY2hvKCJjYWxsaW5nIE5ldFJlYWRGaXh1cChtZXRob2Q8Ii5hOm1ldGhvZC4iPiBsaW5lMT0iLmxpbmUxLiIgbGluZTI9Ii5saW5lMi4iKSIpCiAgICBjYWxsIE5ldFJlYWRGaXh1cChhOm1ldGhvZCwgbGluZTEsIGxpbmUyKQogICBlbmRpZgorCisgICIgdXBkYXRlIHRoZSBCdWZmZXJzIG1lbnUKKyAgaWYgaGFzKCJndWkiKSAmJiBoYXMoImd1aV9ydW5uaW5nIikKKyAgIHNpbGVudCEgZW1lbnUgQnVmZmVycy5SZWZyZXNoXCBtZW51CisgIGVuZGlmCiAgCiAiICBjYWxsIERlY2hvKCJyZWFkY21kPCIuYTpyZWFkY21kLiI+IGNtZGFyZzwiLnY6Y21kYXJnLiI+IGZuYW1lPCIuYTpmbmFtZS4iPiByZWFkYWJsZT0iLmZpbGVyZWFkYWJsZShhOmZuYW1lKSkKICAKQEAgLTc2Myw3ICs4MDEsNyBAQAogICAgZWxzZWlmIGI6bmV0cndfbWV0aG9kID09IDIJIiB3cml0ZSB3aXRoIGZ0cCArIDwubmV0cmM+CiAgICAgbGV0IG5ldHJ3X2ZuYW1lID0gYjpuZXRyd19mbmFtZQogICAgIG5ldwotICAgIHNldCBmZj11bml4CisgICAgc2V0bG9jYWwgZmY9dW5peAogICAgIGV4ZSAicHV0ID0nIi5nOm5ldHJ3X2Z0cG1vZGUuIiciCiAiICAgIGNhbGwgRGVjaG8oIiBOZXRXcml0ZTogcHV0ID0nIi5nOm5ldHJ3X2Z0cG1vZGUuIiciKQogICAgIGV4ZSAicHV0ID0ncHV0ICIudG1wZmlsZS4iICIubmV0cndfZm5hbWUuIiciCkBAIC03ODgsNyArODI2LDcgQEAKICAgIGVsc2VpZiBiOm5ldHJ3X21ldGhvZCA9PSAzCSIgd3JpdGUgd2l0aCBmdHAgKyBtYWNoaW5lLCBpZCwgcGFzc3dkLCBhbmQgZm5hbWUKICAgICBsZXQgbmV0cndfZm5hbWU9IGI6bmV0cndfZm5hbWUKICAgICBuZXcKLSAgICBzZXQgZmY9dW5peAorICAgIHNldGxvY2FsIGZmPXVuaXgKICAgICBpZiBleGlzdHMoImc6bmV0cndfcG9ydCIpICYmIGc6bmV0cndfcG9ydCAhPSAiIgogICAgICBwdXQgPSdvcGVuICcuZzpuZXRyd19tYWNoaW5lLicgJy5nOm5ldHJ3X3BvcnQKICAgICBlbHNlCkBAIC04NTAsNyArODg4LDcgQEAKICAgICAiIENvbnN0cnVjdCBleGVjdXRpb24gc3RyaW5nIChmb3VyIGxpbmVzKSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIGZpbHRlcgogICAgIGxldCBuZXRyd19mbmFtZT0gYjpuZXRyd19mbmFtZQogICAgIG5ldwotICAgIHNldCBmZj11bml4CisgICAgc2V0bG9jYWwgZmY9dW5peAogICAgIGlmIGV4aXN0cygiZzpuZXRyd19wb3J0IikgJiYgZzpuZXRyd19wb3J0ICE9ICIiCiAgICAgIHB1dCA9J29wZW4gJy5nOm5ldHJ3X21hY2hpbmUuJyAnLmc6bmV0cndfcG9ydAogICAgIGVsc2UKQEAgLTg5NSw3ICs5MzMsNyBAQAogICAgICBsZXQgdWlkX21hY2hpbmUgPSBnOm5ldHJ3X21hY2hpbmUKICAgICBlbmRpZgogICAgIG5ldwotICAgIHNldCBmZj11bml4CisgICAgc2V0bG9jYWwgZmY9dW5peAogICAgIHB1dCA9J3B1dCAnLnRtcGZpbGUuJyAnLm5ldHJ3X2ZuYW1lCiAgICAgbm9ybSAxR2RkCiAiICAgIGNhbGwgRGVjaG8oImV4ZWN1dGluZzogJSEiLmc6bmV0cndfc2Z0cF9jbWQuJyAnLnVpZF9tYWNoaW5lKQpAQCAtOTU5LDE4ICs5OTcsMTggQEAKICIgIGNhbGwgRGVjaG8oInNldCB1cCBwYXRoICAgPCIucGF0aCAgIC4iPiIpCiAiICBjYWxsIERlY2hvKCJzZXQgdXAgZm5hbWUgIDwiLmZuYW1lICAuIj4iKQogCi0gICBsZXQgbGlzdGNtZCA9IHN1YnN0aXR1dGUoZzpuZXRyd19saXN0X2NtZCwnXDxIT1NUTkFNRVw+Jyx1c2VyLm1hY2hpbmUsJycpCisgIGxldCBsaXN0Y21kID0gc3Vic3RpdHV0ZShnOm5ldHJ3X2xpc3RfY21kLCdcPEhPU1ROQU1FXD4nLHVzZXIubWFjaGluZSwnJykKIAotICAgIiBvcHRpb25hbGx5IHNvcnQgYnkgdGltZSAoLXQpIG9yIGJ5IHNpemUgKC1TKQotICAgaWYgZzpuZXRyd19zb3J0X2J5ID1+ICJedCIKLSAgICBsZXQgbGlzdGNtZD0gbGlzdGNtZC4idCIKLSAgIGVsc2VpZiBnOm5ldHJ3X3NvcnRfYnkgPX4gIl5zIgotICAgIGxldCBsaXN0Y21kPSBsaXN0Y21kLiJTIgotICAgZW5kaWYKLSAgICIgb3B0aW9uYWxseSBzb3J0IGluIHJldmVyc2UKLSAgIGlmIGc6bmV0cndfc29ydF9kaXJlY3Rpb24gPX4gIl5yIgotICAgIGxldCBsaXN0Y21kPSBsaXN0Y21kLiJyIgotICAgZW5kaWYKKyAgIiBvcHRpb25hbGx5IHNvcnQgYnkgdGltZSAoLXQpIG9yIGJ5IHNpemUgKC1TKQorICBpZiBnOm5ldHJ3X3NvcnRfYnkgPX4gIl50IgorICAgbGV0IGxpc3RjbWQ9IGxpc3RjbWQuInQiCisgIGVsc2VpZiBnOm5ldHJ3X3NvcnRfYnkgPX4gIl5zIgorICAgbGV0IGxpc3RjbWQ9IGxpc3RjbWQuIlMiCisgIGVuZGlmCisgICIgb3B0aW9uYWxseSBzb3J0IGluIHJldmVyc2UKKyAgaWYgZzpuZXRyd19zb3J0X2RpcmVjdGlvbiA9fiAiXnIiCisgICBsZXQgbGlzdGNtZD0gbGlzdGNtZC4iciIKKyAgZW5kaWYKIAogIiAgY2FsbCBEZWNobygic2V0IHVwIGxpc3RjbWQ8Ii5saXN0Y21kLiI+IikKIApAQCAtOTkzLDEyICsxMDMxLDEyIEBACiAKICAgICIgcmVtb3RlLXJlYWQgdGhlIHJlcXVlc3RlZCBmaWxlIGludG8gY3VycmVudCBidWZmZXIKICAgIGVuZXchCi0gICBleGUgImZpbGUgIi5tZXRob2QuIjovLyIudXNlci5tYWNoaW5lLiIvIi5wYXRoCisgICBleGUgImZpbGUgIi5tZXRob2QuIjovLyIudXNlci5tYWNoaW5lLiIvIi5lc2NhcGUocGF0aCwnICcpCiAgICBleGUgInNpbGVudCBkb2F1IEJ1ZlJlYWRQcmUgIi5mbmFtZQogICAgc2lsZW50IGNhbGwgczpOZXRSZWFkKG1ldGhvZC4iOi8vIi51c2VyLm1hY2hpbmUuIi8iLnBhdGgpCiAgICBleGUgInNpbGVudCBkb2F1IEJ1ZlJlYWRQb3N0ICIuZm5hbWUKLSAgIDFkCi0gICBzZXQgbm9tb2QKKyAgIGtlZXBqdW1wcyAxZAorICAgc2V0bG9jYWwgbm9tb2QKIAogIiAgIGNhbGwgRHJldCgiTmV0QnJvd3NlIDAgOiBmaWxlPCIuZm5hbWUuIj4iKQogICAgcmV0dXJuIDAKQEAgLTEwMjEsMjYgKzEwNTksMjggQEAKICAgZWxzZQogICAgZW5ldyEKICAgZW5kaWYKLSAgc2V0bG9jYWwgYnQ9bm9maWxlIGJoPXdpcGUgbm9ibAotICBleGUgJ2ZpbGUgJy5idWZuYW1lCi0gIHNldCBidD1ub3dyaXRlIGJoPWhpZGUgbm9ibAotICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8Y3I+ICAgICAgIDpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLGV4cGFuZCgiPGNXT1JEPiIpKSk8Y3I+CisgIHNldGxvY2FsIHRzPTMyIGJ0PW5vZmlsZSBiaD13aXBlIG5vYmwKKyAgZXhlICdmaWxlICcuZXNjYXBlKGJ1Zm5hbWUsJyAnKQorICBzZXRsb2NhbCBidD1ub3dyaXRlIGJoPWhpZGUgbm9ibAorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8Y3I+CTpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLDxTSUQ+TmV0R2V0RGlyKCkpKTxjcj4KICAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPGMtbD4JOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksJy4vJykpPGNyPgogICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiAtCQk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZSg8U0lEPk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSwnLi4vJykpPGNyPgogICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiBhCQk6bGV0IGc6bmV0cndfbGlzdF9zaG93YWxsPTE8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksJy4vJykpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiBoCQk6Y2FsbCA8U0lEPk5ldEhpZGVFZGl0KCk8Y3I+Ci0gIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IG8JCTpleGUgZzpuZXRyd193aW5zaXplLiJ3aW5jbWQgcyI8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksZXhwYW5kKCI8Y1dPUkQ+IikpKTxjcj4KLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gcgkJOmxldCBnOm5ldHJ3X3NvcnRfZGlyZWN0aW9uPSAoZzpuZXRyd19zb3J0X2RpcmVjdGlvbiA9fiAnbicpPyAncicgOiAnbic8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksZXhwYW5kKCI8Y1dPUkQ+IikpKTxjcj4KKyAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPExlYWRlcj5ICTpjYWxsIDxTSUQ+TmV0SGlkZUVkaXQoMCk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IGkJCTpjYWxsIDxTSUQ+TmV0TG9uZ0xpc3QoMCk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IG8JCTpleGUgZzpuZXRyd193aW5zaXplLiJ3aW5jbWQgcyI8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksPFNJRD5OZXRHZXREaXIoKSkpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiByCQk6bGV0IGc6bmV0cndfc29ydF9kaXJlY3Rpb249IChnOm5ldHJ3X3NvcnRfZGlyZWN0aW9uID1+ICduJyk/ICdyJyA6ICduJzxiYXI+ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZSg8U0lEPk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSw8U0lEPk5ldEdldERpcigpKSk8Y3I+CiAgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IHMJCTpsZXQgZzpuZXRyd19zb3J0X2J5PSAoZzpuZXRyd19zb3J0X2J5ID1+ICduJyk/ICd0aW1lJyA6IChnOm5ldHJ3X3NvcnRfYnkgPX4gJ3QnKT8gJ3NpemUnIDogJ25hbWUnPGJhcj5leGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLCcuLycpKTxjcj4KLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gdgkJOmV4ZSBnOm5ldHJ3X3dpbnNpemUuIndpbmNtZCB2IjxiYXI+ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZSg8U0lEPk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSxleHBhbmQoIjxjV09SRD4iKSkpPGNyPgotICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiB4CQk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZVgoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksZXhwYW5kKCI8Y1dPUkQ+IikpKTxjcj4KLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPDItbGVmdG1vdXNlPiA6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZSg8U0lEPk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSxleHBhbmQoIjxjV09SRD4iKSkpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiB2CQk6ZXhlIGc6bmV0cndfd2luc2l6ZS4id2luY21kIHYiPGJhcj5leGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLDxTSUQ+TmV0R2V0RGlyKCkpKTxjcj4KKyAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4geAkJOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2VYKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLDxTSUQ+TmV0R2V0RGlyKCkpLDEpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8Mi1sZWZ0bW91c2U+IDpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlKDxTSUQ+TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLDxTSUQ+TmV0R2V0RGlyKCkpKTxjcj4KICAgZXhlICdubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8ZGVsPgk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPk5ldEJyb3dzZVJtKCInLnVzZXIubWFjaGluZS4nIiwiJy5wYXRoLiciKTxjcj4nCiAgIGV4ZSAndm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPGRlbD4JOmNhbGwgPFNJRD5OZXRCcm93c2VSbSgiJy51c2VyLm1hY2hpbmUuJyIsIicucGF0aC4nIik8Y3I+JwogICBleGUgJ25ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IEQJOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2VSbSgiJy51c2VyLm1hY2hpbmUuJyIsIicucGF0aC4nIik8Y3I+JwogICBleGUgJ3Zub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IEQJOmNhbGwgPFNJRD5OZXRCcm93c2VSbSgiJy51c2VyLm1hY2hpbmUuJyIsIicucGF0aC4nIik8Y3I+JwogICBleGUgJ25ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IFIJOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5OZXRCcm93c2VSZW5hbWUoIicudXNlci5tYWNoaW5lLiciLCInLnBhdGguJyIpPGNyPicKLSAgbm5vcmVtYXAgPGJ1ZmZlcj4gPwkJOmhlIG5ldHJ3LWRpcjxjcj4KKyAgZXhlICdubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8TGVhZGVyPk0gOmNhbGwgPFNJRD5OZXRNYWtlRGlyKCInLnVzZXIubWFjaGluZS4nIik8Y3I+JworICBubm9yZW1hcCA8YnVmZmVyPiA/CQkJOmhlIG5ldHJ3LWJyb3dzZS1jbWRzPGNyPgogICBzZXRsb2NhbCBtYQogCiAgICIgU2V0IHVwIHRoZSBiYW5uZXIKQEAgLTEwNjksNyArMTEwOSw3IEBACiAgIGtlZXBqdW1wcyAxZAogCiAgICIgbWFuaXB1bGF0ZSB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgKGhpZGUsIHNvcnQpCi0gIHNldCBmdD1uZXRyd2xpc3QKKyAgc2V0bG9jYWwgZnQ9bmV0cndsaXN0CiAgIGlmIGxpbmUoIiQiKSA+PSBnOm5ldHJ3X2Jhbm5lcmNudAogICAgaWYgIWV4aXN0cygiZzpuZXRyd19saXN0X3Nob3dhbGwiKQogICAgIGlmIGc6bmV0cndfbGlzdF9oaWRlICE9ICIiCkBAIC0xMDc4LDYgKzExMTgsMTMgQEAKICAgIGVsc2UKICAgICB1bmxldCBnOm5ldHJ3X2xpc3Rfc2hvd2FsbAogICAgZW5kaWYKKyAgIGlmIGc6bmV0cndfbG9uZ2xpc3QKKyAgICAiIGRvIGEgbG9uZyBsaXN0aW5nOyB0aGVzZSBzdWJzdGl0dXRpb25zIG5lZWQgdG8gYmUgZG9uZSBwcmlvciB0byBzb3J0aW5nCisgICAga2VlcGp1bXBzIHNpbGVudCAvXnRvdGFsXHMqXGRcKyQvZAorICAgIGV4ZSAna2VlcGp1bXBzIHNpbGVudCAnLmc6bmV0cndfYmFubmVyY250LicsJHMvIC0+IC4qJC8vZScKKyAgICBleGUgJ2tlZXBqdW1wcyBzaWxlbnQgJy5nOm5ldHJ3X2Jhbm5lcmNudC4nLCRzL1woXFNcK1xzXCtcU1wrXHNcK1xTXCtcc1wrXFNcK1xzXCtcU1wrXHNcK1xTXCtcc1wrXFNcK1xzXCtcU1wrXClcc1wrXChcU1wrXCkkL1wyXHRcMS9lJworICAgIGV4ZSBnOm5ldHJ3X2Jhbm5lcmNudAorICAgZW5kaWYKICAgIGlmIGc6bmV0cndfc29ydF9ieSA9fiAiXm4iCiAgICAgY2FsbCBzOlNldFNvcnQoKQogICAgIGV4ZSAna2VlcGp1bXBzIHNpbGVudCAnLmc6bmV0cndfYmFubmVyY250LicsJGNhbGwgczpOZXRTb3J0KCknCkBAIC0xMTExLDcgKzExNTgsNyBAQAogICBlbHNlaWYgbmV3ZGlyID09ICcuLycKICAgICIgcmVmcmVzaCB0aGUgZGlyZWN0b3J5IGxpc3QKICIgICBjYWxsIERlY2hvKCJyZWZyZXNoIGRpcmVjdG9yeSBsaXN0aW5nIikKLSAgIHNldCBtYQorICAgc2V0bG9jYWwgbWEKICAgICVkCiAKICAgZWxzZWlmIG5ld2RpciA9PSAnLi4vJwpAQCAtMTEzOSw2ICsxMTg2LDE4IEBACiBlbmRmdW4KIAogIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgIE5ldEdldERpcjogaXQgZ2V0cyB0aGUgZGlyZWN0b3J5IG5hbWVkIHVuZGVyIHRoZSBjdXJzb3IKK2Z1biEgPFNJRD5OZXRHZXREaXIoKQorIiAgY2FsbCBEZnVuYygiTmV0R2V0RGlyKCkiKQorICBsZXQgZGlybmFtZT0gZ2V0bGluZSgiLiIpCisgIGlmIGRpcm5hbWUgPX4gJ1x0JworICAgbGV0IGRpcm5hbWU9IHN1YnN0aXR1dGUoZGlybmFtZSwnXHQuKiQnLCcnLCdlJykKKyAgZW5kaWYKKyIgIGNhbGwgRHJldCgiTmV0R2V0RGlyIDwiLmRpcm5hbWUuIj4iKQorICByZXR1cm4gZGlybmFtZQorZW5kZnVuCisKKyIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiIE5ldEJyb3dzZVJtOiByZW1vdmUgYSByZW1vdGUgZmlsZSBvciBkaXJlY3Rvcnkge3t7MgogZnVuISA8U0lEPk5ldEJyb3dzZVJtKHVzcmhvc3QscGF0aCkgcmFuZ2UKICIgIGNhbGwgRGZ1bmMoIk5ldEJyb3dzZVJtKHVzcmhvc3Q8Ii5hOnVzcmhvc3QuIj4gcGF0aDwiLmE6cGF0aC4iPikiKQpAQCAtMTIxNSw3ICsxMjc0LDcgQEAKIAogICAiIGF0dGVtcHQgdG8gcmVuYW1lIGZpbGVzL2RpcmVjdG9yaWVzCiAgIHdoaWxlIGN0ciA8PSBhOmxhc3RsaW5lCi0gICBleGUgY3RyCisgICBleGUgImtlZXBqdW1wcyAiLmN0cgogCiAgICBub3JtISAwCiAgICBsZXQgb2xkbmFtZT0gYTpwYXRoLmV4cGFuZCgiPGNXT1JEPiIpCkBAIC0xMjM0LDIxICsxMjkzLDUyIEBACiAgICIgcmVmcmVzaCB0aGUgZGlyZWN0b3J5CiAgIGxldCBjdXJsaW5lPSBsaW5lKCIuIikKICAgY2FsbCA8U0lEPk5ldEJyb3dzZSg8U0lEPk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSwnLi8nKSkKLSAgZXhlIGN1cmxpbmUKKyAgZXhlICJrZWVwanVtcHMgIi5jdXJsaW5lCiAiICBjYWxsIERyZXQoIk5ldEJyb3dzZVJlbmFtZSIpCiBlbmRmdW4KIAogIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICIgTmV0QnJvd3NlWDogIGFsbG93cyB1c2VycyB0byB3cml0ZSBjdXN0b20gZnVuY3Rpb25zIHRvIG9wZXJhdGUgb24ge3t7MgotIiAgICAgICAgICAgICAgZmlsZXMgZ2l2ZW4gdGhlaXIgZXh0ZW5zaW9uCi1mdW4hIDxTSUQ+TmV0QnJvd3NlWChmbmFtZSkKLSIgIGNhbGwgRGZ1bmMoIk5ldEJyb3dzZVgoIi5hOmZuYW1lLiIpIikKKyIgICAgICAgICAgICAgIGZpbGVzIGdpdmVuIHRoZWlyIGV4dGVuc2lvbi4gIFBhc3NlcyAwPWxvY2FsLCAxPXJlbW90ZQorZnVuISA8U0lEPk5ldEJyb3dzZVgoZm5hbWUscmVtb3RlKQorIiAgY2FsbCBEZnVuYygiTmV0QnJvd3NlWCgiLmE6Zm5hbWUuIiByZW1vdGU9Ii5hOnJlbW90ZS4iKSIpCiAKICAgbGV0IGV4dGVuPSBzdWJzdGl0dXRlKGE6Zm5hbWUsJy4qXC5cKC5cey19XCknLCdcMScsJ2UnKQogIiAgY2FsbCBEZWNobygiZXh0ZW48Ii5leHRlbi4iPiAiLiJOZXRyd0ZpbGVIYW5kbGVyXyIuZXh0ZW4uIigpOmV4aXN0cz0iLmV4aXN0cygiKk5ldHJ3RmlsZUhhbmRsZXJfIi5leHRlbikpCiAgIGlmIGV4dGVuICE9ICIiICYmIGV4aXN0cygiKk5ldHJ3RmlsZUhhbmRsZXJfIi5leHRlbikKLSAgIGV4ZSAiY2FsbCBOZXRyd0ZpbGVIYW5kbGVyXyIuZXh0ZW4uJygiJy5hOmZuYW1lLiciKScKKworICAgbGV0IGZuYW1lPSBhOmZuYW1lCisgICBpZiBhOnJlbW90ZSA9PSAxCisgICAgIiBjcmVhdGUgYSBsb2NhbCBjb3B5CisgICAgbGV0IGZuYW1lPSB0ZW1wbmFtZSgpLiIuIi5leHRlbgorIiAgICBjYWxsIERlY2hvKCJjcmVhdGUgYSBsb2NhbCBjb3B5IG9mIDwiLmE6Zm5hbWUuIj4gYXMgPCIuZm5hbWUuIj4iKQorICAgIGV4ZSAia2VlcGp1bXBzIHNpbGVudCBib3QgMW5ldyAiLmE6Zm5hbWUKKyAgICBsZXQgZWlrZWVwPSAmZWkKKyAgICBzZXQgZWk9YWxsIGJoPWRlbGV0ZQorICAgIGV4ZSAidyEgIi5mbmFtZQorICAgIGxldCAmZWk9IGVpa2VlcAorICAgIHEKKyAgIGVuZGlmCisKKyAgIGV4ZSAibGV0IHJldD0gTmV0cndGaWxlSGFuZGxlcl8iLmV4dGVuLicoIicuZm5hbWUuJyIpJworICAgIHJlZHJhdyEKKworICAgIiBjbGVhbnVwOiByZW1vdmUgdGVtcG9yYXJ5IGZpbGUsCisgICAiICAgICAgICAgIGRlbGV0ZSBjdXJyZW50IGJ1ZmZlciBpZiBzdWNjZXNzIHdpdGggaGFuZGxlciwKKyAgICIgICAgICAgICAgcmV0dXJuIHRvIHByaW9yIGJ1ZmZlciAoZGlyZWN0b3J5IGxpc3RpbmcpCisgICBpZiBhOnJlbW90ZSA9PSAxICYmIGZuYW1lICE9IGE6Zm5hbWUKKyIgICAgY2FsbCBEZWNobygiZGVsZXRpbmcgdGVtcG9yYXJ5IGZpbGU8Ii5mbmFtZS4iPiIpCisgICAgY2FsbCBkZWxldGUoZm5hbWUpCisgICBlbmRpZgorICAgaWYgcmV0ICE9IDAKKyAgICBsZXQgZWlrZWVwPSAmZWkKKyAgICBzZXQgZWk9YWxsIGJoPWRlbGV0ZSBidD1ub2ZpbGUKKyAgICBleGUgIm5vcm0hIFw8Yy1vPiIKKyAgICBsZXQgJmVpPSBlaWtlZXAKKyAgICByZWRyYXchCisgICBlbmRpZgogICBlbmRpZgorCiAiICBjYWxsIERyZXQoIk5ldEJyb3dzZVgiKQogZW5kZnVuCiAKQEAgLTEyNzYsOCArMTM2Niw4IEBACiAKICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiIE5ldEhpZGVFZGl0OiBhbGxvd3MgdXNlciB0byBlZGl0IHRoZSBmaWxlL2RpcmVjdG9yeSBoaWRpbmcgbGlzdAotZnVuISA8U0lEPk5ldEhpZGVFZGl0KCkKLSIgIGNhbGwgRGZ1bmMoIk5ldEhpZGVFZGl0KCkiKQorZnVuISA8U0lEPk5ldEhpZGVFZGl0KG1vZGUpCisiICBjYWxsIERmdW5jKCJOZXRIaWRlRWRpdChtb2RlPSIuYTptb2RlLiIpIikKIAogICBjYWxsIGlucHV0c2F2ZSgpCiAgIGxldCBuZXdoaWRlPSBpbnB1dCgiRWRpdCBIaWRpbmcgTGlzdDogIixnOm5ldHJ3X2xpc3RfaGlkZSkKQEAgLTEyODUsMTIgKzEzNzUsNDI3IEBACiAKICAgIiByZWZyZXNoIHRoZSBsaXN0aW5nCiAgIGxldCBnOm5ldHJ3X2xpc3RfaGlkZT0gbmV3aGlkZQotICBzaWxlbnQgY2FsbCBzOk5ldEJyb3dzZShzOk5ldEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSwnLi8nKSkKKyAgaWYgYTptb2RlID09IDAKKyAgIHNpbGVudCBjYWxsIHM6TmV0QnJvd3NlKHM6TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLCcuLycpKQorICBlbHNlCisgICBzaWxlbnQgY2FsbCBzOkxvY2FsQnJvd3NlKHM6TmV0QnJvd3NlQ2hnRGlyKGV4cGFuZCgiJSIpLCcuLycpKQorICBlbmRpZgogCiAiICBjYWxsIERyZXQoIk5ldEhpZGVFZGl0IikKIGVuZGZ1bgogCi0iIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgIE5ldExvbmdMaXN0OiB7e3syCitmdW4hIDxTSUQ+TmV0TG9uZ0xpc3QobW9kZSkKKyIgIGNhbGwgRGZ1bmMoIk5ldExvbmdMaXN0KG1vZGU9Ii5hOm1vZGUuIikgbmV0cndfbG9uZ2xpc3Q9Ii5nOm5ldHJ3X2xvbmdsaXN0KQorCisgIGlmIGc6bmV0cndfbG9uZ2xpc3QgIT0gMAorICAgIiB0dXJuIGxvbmcgbGlzdGluZyBvZmYKKyAgIGxldCBnOm5ldHJ3X2xvbmdsaXN0ID0gMAorICAgbGV0IGc6bmV0cndfbGlzdF9jbWQgPSBzdWJzdGl0dXRlKGc6bmV0cndfbGlzdF9jbWQsJyAtbCcsJycsJ2dlJykKKworICBlbHNlCisgICAiIHR1cm4gbG9uZyBsaXN0aW5nIG9uCisgICBsZXQgZzpuZXRyd19sb25nbGlzdCA9IDEKKyAgIGxldCBnOm5ldHJ3X2xpc3RfY21kID0gZzpuZXRyd19saXN0X2NtZC4iIC1sIgorICBlbmRpZgorCisgICIgcmVmcmVzaCB0aGUgbGlzdGluZworICBpZiBhOm1vZGUgPT0gMAorICAgc2lsZW50IGNhbGwgPFNJRD5OZXRCcm93c2UoPFNJRD5OZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksIi4vIikpCisgIGVsc2UKKyAgIHNpbGVudCBjYWxsIDxTSUQ+TG9jYWxCcm93c2UoPFNJRD5Mb2NhbEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSwiLi8iKSkKKyAgZW5kaWYKKworIiAgY2FsbCBEcmV0KCJOZXRMb25nTGlzdCA6IGc6bmV0cndfbG9uZ2xpc3Q9Ii5nOm5ldHJ3X2xvbmdsaXN0KQorZW5kZnVuCisKKyIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIE5ldE1ha2VEaXI6IHRoaXMgZnVuY3Rpb24gbWFrZXMgYSBkaXJlY3RvcnkgKGJvdGggbG9jYWwgYW5kIHJlbW90ZSkKK2Z1biEgPFNJRD5OZXRNYWtlRGlyKHVzcmhvc3QpCisiICBjYWxsIERmdW5jKCJOZXRNYWtlRGlyKHVzcmhvc3Q8Ii5hOnVzcmhvc3QuIj4pIikKKworICAiIGdldCBuYW1lIG9mIG5ldyBkaXJlY3RvcnkgZnJvbSB1c2VyLiAgQSBiYXJlIDxDUj4gd2lsbCBza2lwLgorICAiIGlmIGl0cyBjdXJyZW50bHkgYSBkaXJlY3RvcnksIGFsc28gcmVxdWVzdCB3aWxsIGJlIHNraXBwZWQsIGJ1dCB3aXRoCisgICIgYSBtZXNzYWdlLgorICBjYWxsIGlucHV0c2F2ZSgpCisgIGxldCBuZXdkaXJuYW1lPSBpbnB1dCgiUGxlYXNlIGdpdmUgZGlyZWN0b3J5IG5hbWU6ICIpCisgIGNhbGwgaW5wdXRyZXN0b3JlKCkKKworICBpZiBuZXdkaXJuYW1lID09ICIiCisiICAgY2FsbCBEcmV0KCJOZXRNYWtlRGlyIDogdXNlciBhYm9ydGVkIHdpdGggYmFyZSA8Y3I+IikKKyAgIHJldHVybgorICBlbmRpZgorCisgIGlmIGE6dXNyaG9zdCA9PSAiIgorCisgICAiIExvY2FsIG1rZGlyOgorICAgIiBzYW5pdHkgY2hlY2tzCisgICBpZiBpc2RpcmVjdG9yeShuZXdkaXJuYW1lKQorICAgIGVjaG9lcnIgIioqKndhcm5pbmcqKiogPCIubmV3ZGlybmFtZS4iPiBpcyBhbHJlYWR5IGEgZGlyZWN0b3J5ISIKKyIgICAgY2FsbCBEcmV0KCJOZXRNYWtlRGlyIDogZGlyZWN0b3J5PCIubmV3ZGlybmFtZS4iPiBleGlzdHMgcHJldmlvdXNseSIpCisgICAgcmV0dXJuCisgICBlbmRpZgorICAgaWYgZmlsZXJlYWRhYmxlKG5ld2Rpcm5hbWUpCisgICAgZWNob2VyciAiKioqd2FybmluZyoqKiA8Ii5uZXdkaXJuYW1lLiI+IGlzIGFscmVhZHkgYSBmaWxlISIKKyIgICAgY2FsbCBEcmV0KCJOZXRNYWtlRGlyIDogZmlsZTwiLm5ld2Rpcm5hbWUuIj4gZXhpc3RzIHByZXZpb3VzbHkiKQorICAgIHJldHVybgorICAgZW5kaWYKKyAgIGV4ZSAic2lsZW50ISAhIi5nOm5ldHJ3X2xvY2FsX21rZGlyLiIgIi5uZXdkaXJuYW1lCisgICBpZiB2OnNoZWxsX2Vycm9yID09IDAKKyAgICAiIHJlZnJlc2ggbGlzdGluZworICAgIGNhbGwgczpMb2NhbEJyb3dzZSgiLiIpCisgICBlbHNlCisgICAgZWNob2VyciAiKioqd2FybmluZyoqKiB1bmFibGUgdG8gbWFrZSBkaXJlY3Rvcnk8Ii5uZXdkaXJuYW1lLiI+IgorICAgZW5kaWYKKyAgIHJlZHJhdyEKKworICBlbHNlCisgICAiIFJlbW90ZSBta2RpcjoKKyAgIGxldCBta2RpcmNtZCAgPSBzdWJzdGl0dXRlKGc6bmV0cndfbWtkaXJfY21kLCdcPEhPU1ROQU1FXD4nLGE6dXNyaG9zdCwnJykKKyAgIGxldCBuZXdkaXJuYW1lPSBzdWJzdGl0dXRlKGV4cGFuZCgiJSIpLCdeXCUoLlx7LX0vXClcezN9XCguKlwpJCcsJ1wxJywnJykubmV3ZGlybmFtZQorIiAgIGNhbGwgRGVjaG8oImV4ZSBzaWxlbnQhICEiLm1rZGlyY21kLiIgIi5uZXdkaXJuYW1lKQorICAgZXhlICJzaWxlbnQhICEiLm1rZGlyY21kLiIgIi5uZXdkaXJuYW1lCisgICBpZiB2OnNoZWxsX2Vycm9yID09IDAKKyAgICAiIHJlZnJlc2ggbGlzdGluZworICAgIGNhbGwgczpOZXRCcm93c2UoczpOZXRCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksJy4vJykpCisgICBlbHNlCisgICAgZWNob2VyciAiKioqd2FybmluZyoqKiB1bmFibGUgdG8gbWFrZSBkaXJlY3Rvcnk8Ii5uZXdkaXJuYW1lLiI+IgorICAgZW5kaWYKKyAgIHJlZHJhdyEKKyAgZW5kaWYKKyAgCisiICBjYWxsIERyZXQoIk5ldE1ha2VEaXIiKQorZW5kZnVuCisKKyIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiICBCcm93c2luZyBTdXBwb3J0IEZvciBMb2NhbCBEaXJlY3RvcmllcyBBbmQgRmlsZXM6ICAgIHt7ezEKKworIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgTG9jYWxCcm93c2U6IHN1cHBvcnRzIGxvY2FsIGZpbGUvZGlyZWN0b3J5IGJyb3dzaW5nIHt7ezIKK2Z1biEgPFNJRD5Mb2NhbEJyb3dzZShkaXJuYW1lKQorCisiICBsZXQgZGlybmFtZT0gKGE6ZGlybmFtZSA9PSAiIik/IGV4cGFuZCgiJTpwIikgOiBhOmRpcm5hbWUKKyAgaWYgIWlzZGlyZWN0b3J5KGE6ZGlybmFtZSkKKyAgICIgbm90IGEgZGlyZWN0b3J5LCBpZ25vcmUgaXQKKyAgIHJldHVybgorICBlbmRpZgorCisiICAiIHVuZm9ydHVuYXRlIGludGVyYWN0aW9uIC0tIHdoZW4gcHV0dGluZyBEZnVuYy9EcmV0IGFib3ZlCisgICIgb25lIGNhbiBubyBsb25nZXIgZW50ZXIgdGhlIERCRyBidWZmZXIuCisiICBjYWxsIERmdW5jKCJMb2NhbEJyb3dzZShkaXJuYW1lPCIuYTpkaXJuYW1lLiI+KSIpCisKKyAgZXhlICdjZCAnLmVzY2FwZShhOmRpcm5hbWUsJyAnKQorICBsZXQgZGlybmFtZT0gZ2V0Y3dkKCkuIi8iCisiICBjYWxsIERlY2hvKCJkaXJuYW1lPCIuZGlybmFtZS4iPiIpCisKKyAgIiBtYWtlIHRoaXMgYnVmZmVyIG1vZGlmaWFibGUKKyAgc2V0bG9jYWwgbWEKKworICAiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAiICBQZXJmb3JtIERpcmVjdG9yeSBMaXN0aW5nOgorIiAgY2FsbCBEZWNobygiUGVyZm9ybSBkaXJlY3RvcnkgbGlzdGluZy4uLiIpCisgICIgc2V0IHVwIG5ldyBidWZmZXIgYW5kIG1hcAorICBsZXQgZGlybmFtZW5yID0gYnVmbnIoZGlybmFtZSkKKyAgaWYgZGlybmFtZW5yICE9IC0xICYmIGJ1Zm5hbWUoZGlybmFtZW5yKSAhPSBkaXJuYW1lCisgICAiIHRyeSByZW1vdmluZyB0aGUgdHJhaWxpbmcgIi8iCisgICBsZXQgZGlybmFtZW5yPSBidWZucihzdWJzdGl0dXRlKGRpcm5hbWUsJy8kJywnJywnZScpKQorICBlbmRpZgorIiAgY2FsbCBEZWNobygiYnVmbnIoZGlybmFtZTwiLmRpcm5hbWUuIj4pPSIuZGlybmFtZW5yKQorCisgIGlmIGRpcm5hbWVuciAhPSAtMSAmJiBidWZleGlzdHMoZGlybmFtZSkKKyAgICIgYnVmZmVyIGFscmVhZHkgZXhpc3RzIChoaWRkZW4pLCBzbyBzd2l0Y2ggdG8gaXQhCisgICBleGUgImIgIi5kaXJuYW1lbnIKKyAgIGV4ZSAnY2QgJy5lc2NhcGUoZGlybmFtZSwnICcpCisiICAgY2FsbCBEZWNobygiY2hhbmdlZCBkaXJlY3RvcnkgdG88Ii5kaXJuYW1lLiI+IikKKyAgIGlmIGE6ZGlybmFtZSAhPSAiLiIgJiYgbGluZSgiJCIpID49IDUKKyIgICAgY2FsbCBEcmV0KCJMb2NhbEJyb3dzZSA6IGJ1ZmZlciBhbHJlYWR5IGV4aXN0cyB3aXRoIGluZm8iKQorICAgIHJldHVybgorICAgZW5kaWYKKyIgICBjYWxsIERlY2hvKCJidWZmZXIgYWxyZWFkeSBleGlzdHMsIGJ1dCBuZWVkcyBsaXN0aW5nIChidWYjIi5kaXJuYW1lbnIuIikiKQorICAga2VlcGp1bXBzICVkCisgIGVsc2UKKyIgICBjYWxsIERyZWRpcigibHMhIikKKyIgICBjYWxsIERlY2hvKCJnZW5lcmF0ZSBuZXcgYnVmZmVyIG5hbWVkPCIuZGlybmFtZS4iPiIpCisgICBzaWxlbnQhIGVuZXchCisgICBleGUgJ3NpbGVudCEgZmlsZSAnLmVzY2FwZShkaXJuYW1lLCcgJykKKyAgZW5kaWYKKyAgIiBzZXQgc3RhbmRhcmQgYnJvd3NlciBvcHRpb25zIG9uIGJ1ZmZlcgorICBzZXRsb2NhbCB0cz0zMiBidD1ub3dyaXRlIGJoPWhpZGUgbm9ibAorCisgICIgc2V0IHVwIGFsbCB0aGUgbWFwcworICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8Y3I+CTpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TG9jYWxCcm93c2UoPFNJRD5Mb2NhbEJyb3dzZUNoZ0RpcihleHBhbmQoIiU6cCIpLDxTSUQ+TmV0R2V0RGlyKCkpKTxjcj4KKyAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPGMtbD4JOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5Mb2NhbEJyb3dzZSg8U0lEPkxvY2FsQnJvd3NlQ2hnRGlyKGV4cGFuZCgiJTpwIiksJy4vJykpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiAtCQk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPkxvY2FsQnJvd3NlKDxTSUQ+TG9jYWxCcm93c2VDaGdEaXIoZXhwYW5kKCIlOnAiKSwnLi4vJykpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiBhCQk6bGV0IGc6bmV0cndfbGlzdF9zaG93YWxsPTE8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5Mb2NhbEJyb3dzZSg8U0lEPkxvY2FsQnJvd3NlQ2hnRGlyKGV4cGFuZCgiJTpwIiksJy4vJykpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8TGVhZGVyPkgJOmNhbGwgPFNJRD5OZXRIaWRlRWRpdCgxKTxjcj4KKyAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gPExlYWRlcj5NCTpjYWxsIDxTSUQ+TmV0TWFrZURpcigiIik8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IGkJCTpjYWxsIDxTSUQ+TmV0TG9uZ0xpc3QoMSk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IG8JCTpleGUgZzpuZXRyd193aW5zaXplLiJ3aW5jbWQgcyI8YmFyPmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5Mb2NhbEJyb3dzZSg8U0lEPkxvY2FsQnJvd3NlQ2hnRGlyKGV4cGFuZCgiJTpwIiksPFNJRD5OZXRHZXREaXIoKSkpPGNyPgorICBubm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiByCQk6bGV0IGc6bmV0cndfc29ydF9kaXJlY3Rpb249IChnOm5ldHJ3X3NvcnRfZGlyZWN0aW9uID1+ICduJyk/ICdyJyA6ICduJzxiYXI+ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPkxvY2FsQnJvd3NlKDxTSUQ+TG9jYWxCcm93c2VDaGdEaXIoZXhwYW5kKCIlOnAiKSw8U0lEPk5ldEdldERpcigpKSk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IHMJCTpsZXQgZzpuZXRyd19zb3J0X2J5PSAoZzpuZXRyd19zb3J0X2J5ID1+ICduJyk/ICd0aW1lJyA6IChnOm5ldHJ3X3NvcnRfYnkgPX4gJ3QnKT8gJ3NpemUnIDogJ25hbWUnPGJhcj5leGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TG9jYWxCcm93c2UoPFNJRD5Mb2NhbEJyb3dzZUNoZ0RpcihleHBhbmQoIiU6cCIpLCcuLycpKTxjcj4KKyAgbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gdgkJOmV4ZSBnOm5ldHJ3X3dpbnNpemUuIndpbmNtZCB2IjxiYXI+ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPkxvY2FsQnJvd3NlKDxTSUQ+TG9jYWxCcm93c2VDaGdEaXIoZXhwYW5kKCIlOnAiKSw8U0lEPk5ldEdldERpcigpKSk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IHgJCTpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TmV0QnJvd3NlWCg8U0lEPkxvY2FsQnJvd3NlQ2hnRGlyKGV4cGFuZCgiJTpwIiksPFNJRD5OZXRHZXREaXIoKSksMCk8Y3I+CisgIG5ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IDwyLWxlZnRtb3VzZT4gOmV4ZSAibm9ybSEgMCI8YmFyPmNhbGwgPFNJRD5Mb2NhbEJyb3dzZSg8U0lEPkxvY2FsQnJvd3NlQ2hnRGlyKGV4cGFuZCgiJTpwIiksPFNJRD5OZXRHZXREaXIoKSkpPGNyPgorICBleGUgJ25ub3JlbWFwIDxidWZmZXI+IDxzaWxlbnQ+IDxkZWw+CTpleGUgIm5vcm0hIDAiPGJhcj5jYWxsIDxTSUQ+TG9jYWxCcm93c2VSbSgiJy5leHBhbmQoIiU6cCIpLjxTSUQ+TmV0R2V0RGlyKCkuJyIpPGNyPicKKyAgZXhlICd2bm9yZW1hcCA8YnVmZmVyPiA8c2lsZW50PiA8ZGVsPgk6Y2FsbCA8U0lEPkxvY2FsQnJvd3NlUm0oIicuZXhwYW5kKCIlOnAiKS48U0lEPk5ldEdldERpcigpLiciKTxjcj4nCisgIGV4ZSAnbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gRAk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPkxvY2FsQnJvd3NlUm0oIicuZXhwYW5kKCIlOnAiKS48U0lEPk5ldEdldERpcigpLiciKTxjcj4nCisgIGV4ZSAndm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gRAk6Y2FsbCA8U0lEPkxvY2FsQnJvd3NlUm0oIicuZXhwYW5kKCIlOnAiKS48U0lEPk5ldEdldERpcigpLiciKTxjcj4nCisgIGV4ZSAnbm5vcmVtYXAgPGJ1ZmZlcj4gPHNpbGVudD4gUgk6ZXhlICJub3JtISAwIjxiYXI+Y2FsbCA8U0lEPkxvY2FsQnJvd3NlUmVuYW1lKCInLmV4cGFuZCgiJTpwIikuPFNJRD5OZXRHZXREaXIoKS4nIik8Y3I+JworICBubm9yZW1hcCA8YnVmZmVyPiA/CQkJOmhlIG5ldHJ3LWRpcjxjcj4KKworICAiIFNldCB1cCB0aGUgYmFubmVyCisgIGtlZXBqdW1wcyBwdXQgPSdcIiA9PT09PT09PT09PT09PT09PScKKyAga2VlcGp1bXBzIDFkCisgIGtlZXBqdW1wcyBwdXQgPSdcIiBEaXJlY3RvcnkgTGlzdGluZycKKyAga2VlcGp1bXBzIHB1dCA9J1wiICAgJy5kaXJuYW1lCisgIGxldCBnOm5ldHJ3X2Jhbm5lcmNudD0gNgorICBpZiBnOm5ldHJ3X3NvcnRfYnkgPX4gIl5uIgorICAgIiBzb3J0ZWQgYnkgbmFtZQorICAgbGV0IGc6bmV0cndfYmFubmVyY250PSBnOm5ldHJ3X2Jhbm5lcmNudCArIDEKKyAgIGtlZXBqdW1wcyBwdXQgPSdcIiAgIFNvcnRlZCBieSAgICAgICcuZzpuZXRyd19zb3J0X2J5CisgICBrZWVwanVtcHMgcHV0ID0nXCIgICBTb3J0IHNlcXVlbmNlOiAnLmc6bmV0cndfc29ydF9zZXF1ZW5jZQorICBlbHNlCisgICAiIHNvcnRlZCBieSBzaXplIG9yIGRhdGUKKyAgIGtlZXBqdW1wcyBwdXQgPSdcIiAgIFNvcnRlZCBieSAnLmc6bmV0cndfc29ydF9ieQorICBlbmRpZgorICBpZiBnOm5ldHJ3X2xpc3RfaGlkZSAhPSAiIiAmJiAhZXhpc3RzKCJnOm5ldHJ3X2xpc3Rfc2hvd2FsbCIpCisgICBrZWVwanVtcHMgcHV0ID0nXCIgICBIaWRpbmc6ICcuZzpuZXRyd19saXN0X2hpZGUKKyAgIGxldCBnOm5ldHJ3X2Jhbm5lcmNudD0gZzpuZXRyd19iYW5uZXJjbnQgKyAxCisgIGVuZGlmCisgIGtlZXBqdW1wcyBwdXQgPSdcIiA9PT09PT09PT09PT09PT09PScKKworICAiIGdlbmVyYXRlIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5IGxpc3RpbmcKKyAgY2FsbCBMb2NhbEJyb3dzZUxpc3QoZGlybmFtZSkKKworICAiIG1hbmlwdWxhdGUgdGhlIGRpcmVjdG9yeSBsaXN0aW5nIChoaWRlLCBzb3J0KQorICBzZXRsb2NhbCBmdD1uZXRyd2xpc3QKKyAgaWYgbGluZSgiJCIpID49IGc6bmV0cndfYmFubmVyY250CisgICBpZiAhZXhpc3RzKCJnOm5ldHJ3X2xpc3Rfc2hvd2FsbCIpCisgICAgaWYgZzpuZXRyd19saXN0X2hpZGUgIT0gIiIKKyAgICAgY2FsbCBzOk5ldHJ3TGlzdEhpZGUoKQorICAgIGVuZGlmCisgICBlbHNlCisgICAgdW5sZXQgZzpuZXRyd19saXN0X3Nob3dhbGwKKyAgIGVuZGlmCisgICBpZiBnOm5ldHJ3X3NvcnRfYnkgPX4gIl5uIgorICAgIGNhbGwgczpTZXRTb3J0KCkKKyAgICBleGUgJ2tlZXBqdW1wcyBzaWxlbnQgJy5nOm5ldHJ3X2Jhbm5lcmNudC4nLCRjYWxsIHM6TmV0U29ydCgpJworICAgIGV4ZSAna2VlcGp1bXBzIHNpbGVudCAnLmc6bmV0cndfYmFubmVyY250LicsJHMvXlxkXHszfVwvLy9lJworICAgZWxzZQorICAgIGV4ZSAna2VlcGp1bXBzIHNpbGVudCAnLmc6bmV0cndfYmFubmVyY250LicsJGNhbGwgczpOZXRTb3J0KCknCisgICAgZXhlICdrZWVwanVtcHMgc2lsZW50ICcuZzpuZXRyd19iYW5uZXJjbnQuJywkcy9eXGRcey19XC8vL2UnCisgICBlbmRpZgorICBlbmRpZgorICBleGUgZzpuZXRyd19iYW5uZXJjbnQKKyAgdHJ5CisgICBleGUgJ2NkICcuZXNjYXBlKHN1YnN0aXR1dGUoZGlybmFtZSwnLyQnLCcnLCdlJyksJyAnKQorIiAgIGNhbGwgRGVjaG8oImNoYW5nZWQgZGlyZWN0b3J5IHRvPCIuZGlybmFtZS4iPiIpCisgIGNhdGNoCisgICBlY2hvZXJyICJOb3QgYSBkaXJlY3Rvcnk6IDwiLmRpcm5hbWUuIj4iCisgIGVuZHRyeQorCisgIHNldGxvY2FsIG5vbWEgbm9tb2QKKworIiAgY2FsbCBEcmV0KCJMb2NhbEJyb3dzZSIpCitlbmRmdW4KKworIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgIExvY2FsQnJvd3NlTGlzdDogZG9lcyB0aGUgam9iIG9mICJscyIgZm9yIGxvY2FsIGRpcmVjdG9yaWVzIHt7ezIKK2Z1biEgTG9jYWxCcm93c2VMaXN0KGRpcm5hbWUpCisiICBjYWxsIERmdW5jKCJMb2NhbEJyb3dzZUxpc3QoZGlybmFtZTwiLmE6ZGlybmFtZS4iPikiKQorCisgIGxldCBkaXJuYW1lbGVuID0gc3RybGVuKGE6ZGlybmFtZSkKKyAgbGV0IGZpbGVsaXN0ICAgPSBnbG9iKGE6ZGlybmFtZS4iKiIpLiJcbiIuZ2xvYihhOmRpcm5hbWUuIi4qIikKKyIgIGNhbGwgRGVjaG8oImZpbGVsaXN0PCIuZmlsZWxpc3QuIj4iKQorCisgIHdoaWxlIGZpbGVsaXN0ICE9ICIiCisgICBpZiBmaWxlbGlzdCA9fiAnXG4nCisgICAgbGV0IGZpbGUgICAgID0gc3Vic3RpdHV0ZShmaWxlbGlzdCwnXG4uKiQnLCcnLCdlJykKKyAgICBsZXQgZmlsZWxpc3QgPSBzdWJzdGl0dXRlKGZpbGVsaXN0LCdeLlx7LX1cblwoLipcKSQnLCdcMScsJ2UnKQorICAgZWxzZQorICAgIGxldCBmaWxlICAgICA9IGZpbGVsaXN0CisgICAgbGV0IGZpbGVsaXN0PSAiIgorICAgZW5kaWYKKyAgIGxldCBwZmlsZT0gZmlsZQorICAgaWYgaXNkaXJlY3RvcnkoZmlsZSkKKyAgICBsZXQgcGZpbGU9IGZpbGUuIi8iCisgICBlbmRpZgorICAgbGV0IHBmaWxlPSBzdHJwYXJ0KHBmaWxlLGRpcm5hbWVsZW4pCisgICBpZiBnOm5ldHJ3X2xvbmdsaXN0CisgICAgbGV0IHBmaWxlPSBwZmlsZS4iXHQiLmdldGZzaXplKGZpbGUpLiJcdCIuc3RyZnRpbWUoZzpuZXRyd190aW1lZm10LGdldGZ0aW1lKGZpbGUpKQorICAgZW5kaWYKKyAgIGlmICAgICBnOm5ldHJ3X3NvcnRfYnkgPX4gIl50IgorICAgICIgc29ydCBieSB0aW1lIChoYW5kbGVzIHRpbWUgdXAgdG8gMSBxdWludGlsbGlvbiBzZWNvbmRzLCBVUykKKyIgICAgY2FsbCBEZWNobygiZ2V0ZnRpbWUoIi5maWxlLiIpPSIuZ2V0ZnRpbWUoZmlsZSkpCisgICAgbGV0IHQgID0gZ2V0ZnRpbWUoZmlsZSkKKyAgICBsZXQgZnQgPSBzdHJwYXJ0KCIwMDAwMDAwMDAwMDAwMDAwMDAiLDEsMTgtc3RybGVuKHQpKS50CisiICAgIGNhbGwgRGVjaG8oImV4ZSBrZWVwanVtcHMgcHV0ID0nIi5mdC4nLycuZmlsZS4iJyIpCisgICAgZXhlICJrZWVwanVtcHMgcHV0ID0nIi5mdC4nLycucGZpbGUuIiciCisgICBlbHNlaWYgZzpuZXRyd19zb3J0X2J5ID1+ICJecyIKKyAgICAiIHNvcnQgYnkgc2l6ZSAoaGFuZGxlcyBmaWxlIHNpemVzIHVwIHRvIDEgcXVpbnRpbGxpb24gYnl0ZXMsIFVTKQorIiAgICBjYWxsIERlY2hvKCJnZXRmc2l6ZSgiLmZpbGUuIik9Ii5nZXRmc2l6ZShmaWxlKSkKKyAgICBsZXQgc3ogICA9IGdldGZzaXplKGZpbGUpCisgICAgbGV0IGZzeiAgPSBzdHJwYXJ0KCIwMDAwMDAwMDAwMDAwMDAwMDAiLDEsMTgtc3RybGVuKHN6KSkuc3oKKyIgICAgY2FsbCBEZWNobygiZXhlIGtlZXBqdW1wcyBwdXQgPSciLmZzei4nLycuZmlsZS4iJyIpCisgICAgZXhlICJrZWVwanVtcHMgcHV0ID0nIi5mc3ouJy8nLnBmaWxlLiInIgorICAgZWxzZSAKKyAgICAiIHNvcnQgYnkgbmFtZQorIiAgICBjYWxsIERlY2hvKCJleGUga2VlcGp1bXBzIHB1dCA9JyIuZmlsZS4iJyIpCisgICAgZXhlICJrZWVwanVtcHMgcHV0ID0nIi5wZmlsZS4iJyIKKyAgIGVuZGlmCisgIGVuZHdoaWxlCisKKyIgIGNhbGwgRHJldCgiTG9jYWxCcm93c2VMaXN0IikKK2VuZGZ1bgorCisiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiAgTG9jYWxCcm93c2VDaGdEaXI6IGNvbnN0cnVjdHMgYSBuZXcgZGlyZWN0b3J5IGJhc2VkIG9uIHRoZSBjdXJyZW50IHt7ezIKKyIgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgYW5kIGEgbmV3IGRpcmVjdG9yeSBuYW1lCitmdW4hIDxTSUQ+TG9jYWxCcm93c2VDaGdEaXIoZGlybmFtZSxuZXdkaXIpCisiICBjYWxsIERmdW5jKCJMb2NhbEJyb3dzZUNoZ0RpcihkaXJuYW1lPCIuYTpkaXJuYW1lLiI+IG5ld2RpcjwiLmE6bmV3ZGlyLiI+KSIpCisKKyAgbGV0IGRpcm5hbWU9IGE6ZGlybmFtZQorICBsZXQgbmV3ZGlyID0gYTpuZXdkaXIKKworICBpZiBkaXJuYW1lICF+ICcvJCcKKyAgICIgYXBwYXJlbnRseSB2aW0gaXMgInJlY29nbml6aW5nIiB0aGF0IGl0IGlzIGluIHRoZSBob21lIGRpcmVjdG9yeSBhbmQKKyAgICIgaXMgcmVtb3ZpbmcgdGhlICIvIi4gIEJhZCBpZGVhLCBzbyBJIGhhdmUgdG8gcHV0IGl0IGJhY2suCisgICBsZXQgZGlybmFtZT0gZGlybmFtZS4nLycKKyIgICBjYWxsIERlY2hvKCJhZGp1c3RpbmcgZGlybmFtZTwiLmRpcm5hbWUuIj4iKQorICBlbmRpZgorCisgIGlmIG5ld2RpciAhfiAnLyQnCisgICAiIGhhbmRsaW5nIGEgZmlsZQorICAgbGV0IGRpcm5hbWU9IGRpcm5hbWUubmV3ZGlyCisiICAgY2FsbCBEZWNobygiaGFuZGxpbmcgYSBmaWxlOiBkaXJuYW1lPCIuZGlybmFtZS4iPiIpCisgICBleGUgImUgIi5kaXJuYW1lCisKKyAgZWxzZWlmIG5ld2RpciA9PSAnLi8nCisgICAiIHJlZnJlc2ggdGhlIGRpcmVjdG9yeSBsaXN0CisiICAgY2FsbCBEZWNobygicmVmcmVzaCBkaXJlY3RvcnkgbGlzdGluZyIpCisgICBzZXRsb2NhbCBtYQorICAgJWQKKworICBlbHNlaWYgbmV3ZGlyID09ICcuLi8nCisgICAiIGdvIHVwIG9uZSBkaXJlY3RvcnkKKyAgIGxldCBkaXJuYW1lPSBzdWJzdGl0dXRlKGRpcm5hbWUsJ15cKC4qL1wpXChbXi9dXCsvJFwpJywnXDEnLCdlJykKKyIgICBjYWxsIERlY2hvKCJnbyB1cCBvbmUgZGlyOiBkaXJuYW1lPCIuZGlybmFtZS4iPiIpCisKKyAgZWxzZQorICAgIiBnbyBkb3duIG9uZSBkaXJlY3RvcnkKKyAgIGxldCBkaXJuYW1lPSBkaXJuYW1lLm5ld2RpcgorIiAgIGNhbGwgRGVjaG8oImdvIGRvd24gb25lIGRpcjogZGlybmFtZTwiLmRpcm5hbWUuIj4gbmV3ZGlyPCIubmV3ZGlyLiI+IikKKyAgZW5kaWYKKworIiAgY2FsbCBEcmV0KCJMb2NhbEJyb3dzZUNoZ0RpciA8Ii5kaXJuYW1lLiI+IikKKyAgcmV0dXJuIGRpcm5hbWUKK2VuZGZ1bgorCisiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBMb2NhbEJyb3dzZVJtOgorZnVuISA8U0lEPkxvY2FsQnJvd3NlUm0ocGF0aCkgcmFuZ2UKKyIgIGNhbGwgRGZ1bmMoIkxvY2FsQnJvd3NlUm0ocGF0aDwiLmE6cGF0aC4iPikiKQorIiAgY2FsbCBEZWNobygiZmlyc3RsaW5lPSIuYTpmaXJzdGxpbmUuIiBsYXN0bGluZT0iLmE6bGFzdGxpbmUpCisKKyAgIiBwcmVwYXJhdGlvbiBmb3IgcmVtb3ZpbmcgbXVsdGlwbGUgZmlsZXMvZGlyZWN0b3JpZXMKKyAgbGV0IGN0cj0gYTpmaXJzdGxpbmUKKworICAiIHJlbW92ZSBtdWx0aXBsZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAgd2hpbGUgY3RyIDw9IGE6bGFzdGxpbmUKKyAgIGV4ZSBjdHIKKworICAgbm9ybSEgMAorICAgbGV0IHJtZmlsZT0gYTpwYXRoLmV4cGFuZCgiPGNXT1JEPiIpCisiICAgY2FsbCBEZWNobygicm1maWxlPCIucm1maWxlLiI+IikKKworICAgaWYgcm1maWxlICF+ICdeIicgJiYgKHJtZmlsZSA9fiAnQCQnIHx8IHJtZmlsZSAhfiAnLyQnKQorICAgICIgYXR0ZW1wdCB0byByZW1vdmUgZmlsZQorICAgIGNhbGwgaW5wdXRzYXZlKCkKKyAgICBsZXQgb2s9IGlucHV0KCJDb25maXJtIGRlbGV0aW9uIG9mIGZpbGU8Ii5ybWZpbGUuIj4gIiwieSIpCisgICAgY2FsbCBpbnB1dHJlc3RvcmUoKQorICAgIGlmIG9rID09ICJ5IgorICAgICBjYWxsIGRlbGV0ZShybWZpbGUpCisiICAgICBjYWxsIERlY2hvKCJlcnJjb2RlPSIudjpzaGVsbF9lcnJvcikKKyAgICBlbmRpZgorICAKKyAgIGVsc2UKKyAgICAiIGF0dGVtcHQgdG8gcmVtb3ZlIGRpcmVjdG9yeQorICAgIGNhbGwgaW5wdXRzYXZlKCkKKyAgICBsZXQgb2s9IGlucHV0KCJDb25maXJtIGRlbGV0aW9uIG9mIGRpcmVjdG9yeTwiLnJtZmlsZS4iPiAiLCJ5IikKKyAgICBjYWxsIGlucHV0cmVzdG9yZSgpCisgICAgbGV0IHJtZmlsZT0gc3Vic3RpdHV0ZShybWZpbGUsJy8kJywnJywnZScpCisKKyAgICBpZiBvayA9PSAieSIKKyAgICAgY2FsbCBzeXN0ZW0oZzpuZXRyd19sb2NhbF9ybWRpci4iICIucm1maWxlKQorIiAgICAgY2FsbCBEZWNobygidjpzaGVsbF9lcnJvcj0iLnY6c2hlbGxfZXJyb3IpCisKKyAgICAgaWYgdjpzaGVsbF9lcnJvciAhPSAwCisiICAgICAgY2FsbCBEZWNobygiMm5kIGF0dGVtcHQgdG8gcmVtb3ZlIGRpcmVjdG9yeTwiLnJtZmlsZS4iPiIpCisgICAgICBsZXQgZXJyY29kZT0gZGVsZXRlKHJtZmlsZSkKKyIgICAgICBjYWxsIERlY2hvKCJlcnJjb2RlPSIuZXJyY29kZSkKKworICAgICAgaWYgZXJyY29kZSAhPSAwCisgICAgICAgaWYgaGFzKCJ1bml4IikKKyIgICAgICAgIGNhbGwgRGVjaG8oIjNyZCBhdHRlbXB0IHRvIHJlbW92ZSBkaXJlY3Rvcnk8Ii5ybWZpbGUuIj4iKQorCWNhbGwgc3lzdGVtKCJybSAiLnJtZmlsZSkKKyAgICAgICAgaWYgdjpzaGVsbF9lcnJvciAhPSAwCisgICAgICAgICBlY2hvZXJyICJ1bmFibGUgdG8gcmVtb3ZlIGRpcmVjdG9yeTwiLnJtZmlsZS4iPiAtLSBpcyBpdCBlbXB0eT8iCisJZW5kaWYKKyAgICAgICBlbHNlCisgICAgICAgIGVjaG9lcnIgInVuYWJsZSB0byByZW1vdmUgZGlyZWN0b3J5PCIucm1maWxlLiI+IC0tIGlzIGl0IGVtcHR5PyIKKyAgICAgICBlbmRpZgorICAgICAgZW5kaWYKKyAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgZW5kaWYKKworICAgbGV0IGN0cj0gY3RyICsgMQorICBlbmR3aGlsZQorCisgICIgcmVmcmVzaCB0aGUgZGlyZWN0b3J5CisgIGxldCBjdXJsaW5lPSBsaW5lKCIuIiktMQorIiAgY2FsbCBEZWNobygicmVmcmVzaCB0aGUgZGlyZWN0b3J5IikKKyAgY2FsbCA8U0lEPkxvY2FsQnJvd3NlKDxTSUQ+TG9jYWxCcm93c2VDaGdEaXIoZXhwYW5kKCIlIiksJy4vJykpCisgIGV4ZSBjdXJsaW5lCisKKyIgIGNhbGwgRHJldCgiTG9jYWxCcm93c2VSbSIpCitlbmRmdW4KKworIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgTG9jYWxCcm93c2VSZW5hbWU6IHJlbmFtZSBhIHJlbW90ZSBmaWxlIG9yIGRpcmVjdG9yeSB7e3syCitmdW4hIDxTSUQ+TG9jYWxCcm93c2VSZW5hbWUocGF0aCkKKyIgIGNhbGwgRGZ1bmMoIkxvY2FsQnJvd3NlUmVuYW1lKHBhdGg8Ii5hOnBhdGguIj4pIikKKworICAiIHByZXBhcmF0aW9uIGZvciByZW1vdmluZyBtdWx0aXBsZSBmaWxlcy9kaXJlY3RvcmllcworICBsZXQgY3RyPSBhOmZpcnN0bGluZQorCisgICIgYXR0ZW1wdCB0byByZW5hbWUgZmlsZXMvZGlyZWN0b3JpZXMKKyAgd2hpbGUgY3RyIDw9IGE6bGFzdGxpbmUKKyAgIGV4ZSAia2VlcGp1bXBzICIuY3RyCisKKyAgIG5vcm0hIDAKKyAgIGxldCBvbGRuYW1lPSBhOnBhdGguZXhwYW5kKCI8Y1dPUkQ+IikKKyIgICBjYWxsIERlY2hvKCJvbGRuYW1lPCIub2xkbmFtZS4iPiIpCisKKyAgIGNhbGwgaW5wdXRzYXZlKCkKKyAgIGxldCBuZXduYW1lPSBpbnB1dCgiTW92aW5nICIub2xkbmFtZS4iIHRvIDogIixvbGRuYW1lKQorICAgY2FsbCBpbnB1dHJlc3RvcmUoKQorCisgICBsZXQgcmV0PSBzeXN0ZW0oZzpuZXRyd19sb2NhbF9yZW5hbWUuIiAiLm9sZG5hbWUuIiAiLm5ld25hbWUpCisiICAgY2FsbCBEZWNobygiZXhlY3V0aW5nIHN5c3RlbSgiLmc6bmV0cndfbG9jYWxfcmVuYW1lLiIgIi5vbGRuYW1lLiIgIi5uZXduYW1lKQorCisgICBsZXQgY3RyPSBjdHIgKyAxCisgIGVuZHdoaWxlCisKKyAgIiByZWZyZXNoIHRoZSBkaXJlY3RvcnkKKyAgbGV0IGN1cmxpbmU9IGxpbmUoIi4iKQorICBjYWxsIDxTSUQ+TG9jYWxCcm93c2UoPFNJRD5Mb2NhbEJyb3dzZUNoZ0RpcihleHBhbmQoIiUiKSwnLi8nKSkKKyAgZXhlICJrZWVwanVtcHMgIi5jdXJsaW5lCisiICBjYWxsIERyZXQoIkxvY2FsQnJvd3NlUmVuYW1lIikKK2VuZGZ1bgorCisiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIiBOZXRNZXRob2Q6ICBkZXRlcm1pbmUgbWV0aG9kIG9mIHRyYW5zZmVyIHt7ezEKICIgIG1ldGhvZCA9PSAxOiByY3AKICIJICAgICAyOiBmdHAgKyA8Lm5ldHJjPgpAQCAtMTUzMSwxNCArMjAzNiwxNCBAQAogICBsZXQgczpkaXJrZWVwCT0gZ2V0Y3dkKCkKICAgbGV0IHM6Z2RrZWVwCT0gJmdkCiAgIGxldCBzOnR3a2VlcAk9ICZ0dwotICBzZXQgY2lubyA9Ci0gIHNldCBjb20gID0KLSAgc2V0IGNwbyAtPWFBCi0gIHNldCBub2NpbiBub2FpCi0gIHNldCB0dyAgID0wCisgIHNldGxvY2FsIGNpbm8gPQorICBzZXRsb2NhbCBjb20gID0KKyAgc2V0bG9jYWwgY3BvIC09YUEKKyAgc2V0bG9jYWwgbm9jaW4gbm9haQorICBzZXRsb2NhbCB0dyAgID0wCiAgIGlmIGhhcygid2luMzIiKSAmJiAhaGFzKCJ3aW45NSIpCiAgICBsZXQgczpzd2ZrZWVwPSAmc3dmCi0gICBzZXQgbm9zd2YKKyAgIHNldGxvY2FsIG5vc3dmCiAiICBjYWxsIERlY2hvKCJzZXR0aW5nIHM6c3dma2VlcCB0byA8Ii4mc3dmLiI+IikKICAgZW5kaWYKIApAQCAtMTU5NSw2ICsyMTAwLDggQEAKICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiIE5ldFNvcnQ6IFBpZXQgRGVscG9ydCdzIEJJU29ydDIoKSBmdW5jdGlvbiwgbW9kaWZpZWQgdG8gdGFrZSBhIHJhbmdlIHt7ezEKIGZ1biEgPFNJRD5OZXRTb3J0KCkgcmFuZ2UKKyIgIGNhbGwgRGZ1bmMoIk5ldFNvcnQoKSIpCisKICAgbGV0IGkgPSBhOmZpcnN0bGluZSArIDEKICAgd2hpbGUgaSA8PSBhOmxhc3RsaW5lCiAgICAgIiBmaW5kIGluc2VydGlvbiBwb2ludCB2aWEgYmluYXJ5IHNlYXJjaApAQCAtMTYyOSwxMyArMjEzNiwyOSBAQAogICAgIGVuZGlmCiAgICAgbGV0IGkgPSBpICsgMQogICBlbmR3aGlsZQorCisiICBjYWxsIERyZXQoIk5ldFNvcnQiKQogZW5kZnVuCiAKICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0iIFNldFNvcnQ6IHNldHMgdXAgdGhlIHNvcnQgYmFzZWQgb24gdGhlIGc6bmV0cndfc29ydF9zZXF1ZW5jZQorIiBTZXRTb3J0OiBzZXRzIHVwIHRoZSBzb3J0IGJhc2VkIG9uIHRoZSBnOm5ldHJ3X3NvcnRfc2VxdWVuY2Uge3t7MQorIiAgICAgICAgICBXaGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBpcyB0byBjb21wdXRlIGEgcHJpb3JpdHkgZm9yIHRoZSBwYXR0ZXJucworIiAgICAgICAgICBpbiB0aGUgZzpuZXRyd19zb3J0X3NlcXVlbmNlLiAgSXQgYXBwbGllcyBhIHN1YnN0aXR1dGUgdG8gYW55CisiICAgICAgICAgICJmaWxlcyIgdGhhdCBzYXRpc2Z5IGVhY2ggcGF0dGVybiwgcHV0dGluZyB0aGUgcHJpb3JpdHkgLyBpbgorIiAgICAgICAgICBmcm9udC4gIEFuICIqIiBwYXR0ZXJuIGhhbmRsZXMgdGhlIGRlZmF1bHQgcHJpb3JpdHkuCiBmdW4hIDxTSUQ+U2V0U29ydCgpCiAiICBjYWxsIERmdW5jKCJTZXRTb3J0KCkgYmFubmVyY250PSIuZzpuZXRyd19iYW5uZXJjbnQpCi0gIGxldCBzZXFsaXN0ICA9IGc6bmV0cndfc29ydF9zZXF1ZW5jZQorICBpZiBnOm5ldHJ3X2xvbmdsaXN0CisgICBsZXQgc2VxbGlzdCAgPSBzdWJzdGl0dXRlKGc6bmV0cndfc29ydF9zZXF1ZW5jZSwnXCQnLCdcXCUoXHRcXHxcJFxcKScsJ2dlJykKKyAgZWxzZQorICAgbGV0IHNlcWxpc3QgID0gZzpuZXRyd19zb3J0X3NlcXVlbmNlCisgIGVuZGlmCisgICIgc2FuaXR5IGNoZWNrIC0tIGluc3VyZSB0aGF0ICogYXBwZWFycyBzb21ld2hlcmUKKyAgaWYgc2VxbGlzdCA9PSAiIgorICAgbGV0IHNlcWxpc3Q9ICcqJworICBlbHNlaWYgc2VxbGlzdCAhfiAnXConCisgICBsZXQgc2VxbGlzdD0gc2VxbGlzdC4nLConCisgIGVuZGlmCiAgIGxldCBwcmlvcml0eSA9IDEKICAgd2hpbGUgc2VxbGlzdCAhPSAiIgogICAgaWYgc2VxbGlzdCA9fiAnLCcK