ZGlmZiAtLWdpdCBhL0xpYi9RdWV1ZS5weSBiL0xpYi9RdWV1ZS5weQppbmRleCA1MWFkMzU0Li4wZjgwNTg0IDEwMDY0NAotLS0gYS9MaWIvUXVldWUucHkKKysrIGIvTGliL1F1ZXVlLnB5CkBAIC0xNCwxMSArMTQsMTEgQEAKICAgICBwYXNzCiAKIGNsYXNzIFF1ZXVlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgotICAgICAgICAiIiJJbml0aWFsaXplIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCisgICAgIiIiQ3JlYXRlIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCiAKLSAgICAgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KLSAgICAgICAgIiIiCisgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0wKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZwogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvU2ltcGxlSFRUUFNlcnZlci5weSBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CmluZGV4IDA4OTkzNmYuLmZhZTU1MWEgMTAwNjQ0Ci0tLSBhL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CisrKyBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CkBAIC0xOTIsNiArMTkyLDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwWycnXQogCisgICAgaWYgbm90IG1pbWV0eXBlcy5pbml0ZWQ6CisgICAgICAgIG1pbWV0eXBlcy5pbml0KCkgIyB0cnkgdG8gcmVhZCBzeXN0ZW0gbWltZS50eXBlcwogICAgIGV4dGVuc2lvbnNfbWFwID0gbWltZXR5cGVzLnR5cGVzX21hcC5jb3B5KCkKICAgICBleHRlbnNpb25zX21hcC51cGRhdGUoewogICAgICAgICAnJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICMgRGVmYXVsdApkaWZmIC0tZ2l0IGEvTGliL1VzZXJTdHJpbmcucHkgYi9MaWIvVXNlclN0cmluZy5weQppbmRleCA0NzNlZTg4Li42MGRjMzRiIDEwMDc1NQotLS0gYS9MaWIvVXNlclN0cmluZy5weQorKysgYi9MaWIvVXNlclN0cmluZy5weQpAQCAtNSwxNCArNSwxMyBAQAogTm90ZTogc3RyaW5nIG9iamVjdHMgaGF2ZSBncm93biBtZXRob2RzIGluIFB5dGhvbiAxLjYKIFRoaXMgbW9kdWxlIHJlcXVpcmVzIFB5dGhvbiAxLjYgb3IgbGF0ZXIuCiAiIiIKLWZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGVzCiBpbXBvcnQgc3lzCiAKIF9fYWxsX18gPSBbIlVzZXJTdHJpbmciLCJNdXRhYmxlU3RyaW5nIl0KIAogY2xhc3MgVXNlclN0cmluZzoKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZXEsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxLmRhdGFbOl0KQEAgLTQzLDEyICs0MiwxMiBAQAogICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIuZGF0YSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgc3RyKG90aGVyKSkKICAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKG90aGVyICsgc2VsZi5kYXRhKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHN0cihvdGhlcikgKyBzZWxmLmRhdGEpCkBAIC0xNjMsNyArMTYyLDcgQEAKICAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQogICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIuZGF0YStzZWxmLmRhdGFbZW5kOl0KLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YiwgU3RyaW5nVHlwZXMpOgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3ViLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1YitzZWxmLmRhdGFbZW5kOl0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICBzZWxmLmRhdGFbOnN0YXJ0XStzdHIoc3ViKStzZWxmLmRhdGFbZW5kOl0KQEAgLTE3NSw3ICsxNzQsNyBAQAogICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyLmRhdGEKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSArPSBzdHIob3RoZXIpCmRpZmYgLS1naXQgYS9MaWIvX01vemlsbGFDb29raWVKYXIucHkgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKaW5kZXggMTc3NmI5My4uNGZkNmRlMyAxMDA2NDQKLS0tIGEvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CisrKyBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtNjMsOCArNjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIlxuIik6IGxpbmUgPSBsaW5lWzotMV0KIAogICAgICAgICAgICAgICAgICMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgWFhYIHdoYXQgaXMgJCBmb3I/Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIjIikgb3IKLSAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoIiQiKSBvcgorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgoIiMiLCAiJCIpKSBvcgogICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkgPT0gIiIpOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogCmRpZmYgLS1naXQgYS9MaWIvYmluaGV4LnB5IGIvTGliL2JpbmhleC5weQppbmRleCA0ZjM4ODJhLi4wZjNlM2M0IDEwMDY0NAotLS0gYS9MaWIvYmluaGV4LnB5CisrKyBiL0xpYi9iaW5oZXgucHkKQEAgLTQ0LDIyICs0NCwxNCBAQAogCiAjCiAjIFdvcmthcm91bmRzIGZvciBub24tbWFjIG1hY2hpbmVzLgotaWYgb3MubmFtZSA9PSAnbWFjJzoKLSAgICBpbXBvcnQgbWFjZnMKLSAgICBpbXBvcnQgTWFjT1MKLSAgICB0cnk6Ci0gICAgICAgIG9wZW5yZiA9IE1hY09TLm9wZW5yZgotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIG9wZW5yZiA9IG9wZW4KLQotICAgIGRlZiBGSW5mbygpOgotICAgICAgICByZXR1cm4gbWFjZnMuRkluZm8oKQordHJ5OgorICAgIGZyb20gQ2FyYm9uLkZpbGUgaW1wb3J0IEZTU3BlYywgRkluZm8KKyAgICBmcm9tIE1hY09TIGltcG9ydCBvcGVucmYKIAogICAgIGRlZiBnZXRmaWxlaW5mbyhuYW1lKToKLSAgICAgICAgZmluZm8gPSBtYWNmcy5GU1NwZWMobmFtZSkuR2V0RkluZm8oKQorICAgICAgICBmaW5mbyA9IEZTU3BlYyhuYW1lKS5GU3BHZXRGSW5mbygpCiAgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQobmFtZSkKLSAgICAgICAgIyBYWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCisgICAgICAgICMgWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCiAgICAgICAgIGZwID0gb3BlbihuYW1lLCAncmInKQogICAgICAgICBmcC5zZWVrKDAsIDIpCiAgICAgICAgIGRsZW4gPSBmcC50ZWxsKCkKQEAgLTc1LDcgKzY3LDcgQEAKICAgICAgICAgICAgIG1vZGUgPSAnKicgKyBtb2RlWzBdCiAgICAgICAgIHJldHVybiBvcGVucmYobmFtZSwgbW9kZSkKIAotZWxzZToKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjCiAgICAgIyBHbHVlIGNvZGUgZm9yIG5vbi1tYWNpbnRvc2ggdXNhZ2UKICAgICAjCkBAIC0xODMsNyArMTc1LDcgQEAKICAgICAgICAgICAgIG9mbmFtZSA9IG9mcAogICAgICAgICAgICAgb2ZwID0gb3BlbihvZm5hbWUsICd3JykKICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgICAgICAgICAgZnNzID0gbWFjZnMuRlNTcGVjKG9mbmFtZSkKKyAgICAgICAgICAgICAgICBmc3MgPSBGU1NwZWMob2ZuYW1lKQogICAgICAgICAgICAgICAgIGZzcy5TZXRDcmVhdG9yVHlwZSgnQm5IcScsICdURVhUJykKICAgICAgICAgb2ZwLndyaXRlKCcoVGhpcyBmaWxlIG11c3QgYmUgY29udmVydGVkIHdpdGggQmluSGV4IDQuMClcblxuOicpCiAgICAgICAgIGhxeGVyID0gX0hxeGNvZGVyZW5naW5lKG9mcCkKQEAgLTQ4Niw3ICs0NzgsNyBAQAogICAgIGlmIG5vdCBvdXQ6CiAgICAgICAgIG91dCA9IGlmcC5GTmFtZQogICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgIG9mc3MgPSBtYWNmcy5GU1NwZWMob3V0KQorICAgICAgICBvZnNzID0gRlNTcGVjKG91dCkKICAgICAgICAgb3V0ID0gb2Zzcy5hc19wYXRobmFtZSgpCiAKICAgICBvZnAgPSBvcGVuKG91dCwgJ3diJykKQEAgLTUxOSw2ICs1MTEsNyBAQAogCiBkZWYgX3Rlc3QoKToKICAgICBpZiBvcy5uYW1lID09ICdtYWMnOgorICAgICAgICBpbXBvcnQgbWFjZnMKICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoJ0ZpbGUgdG8gY29udmVydDonKQogICAgICAgICBpZiBub3Qgb2s6CiAgICAgICAgICAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL19faW5pdF9fLnB5IGIvTGliL2JzZGRiL19faW5pdF9fLnB5CmluZGV4IDkwZWQzNjIuLmNmMzI2NjggMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9fX2luaXRfXy5weQorKysgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKQEAgLTMzLDcgKzMzLDEwIEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLSIiIlN1cHBvcnQgZm9yIEJlcmtlbGV5REIgMy4yIHRocm91Z2ggNC4yLgorIiIiU3VwcG9ydCBmb3IgQmVya2VsZXlEQiAzLjMgdGhyb3VnaCA0LjQgd2l0aCBhIHNpbXBsZSBpbnRlcmZhY2UuCisKK0ZvciB0aGUgZnVsbCBmZWF0dXJlZCBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHVzZSB0aGUgYnNkZGIuZGIgbW9kdWxlCitpbnN0ZWFkLiAgSXQgbWlycm9ycyB0aGUgU2xlZXB5Y2F0IEJlcmtlbGV5REIgQyBBUEkuCiAiIiIKIAogdHJ5OgpAQCAtNDMsOCArNDYsMTAgQEAKICAgICAgICAgIyBweXRob24gYXMgYnNkZGIuX2JzZGRiLgogICAgICAgICBpbXBvcnQgX3B5YnNkZGIKICAgICAgICAgX2JzZGRiID0gX3B5YnNkZGIKKyAgICAgICAgZnJvbSBic2RkYjMuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKICAgICBlbHNlOgogICAgICAgICBpbXBvcnQgX2JzZGRiCisgICAgICAgIGZyb20gYnNkZGIuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjIFJlbW92ZSBvdXJzZWx2ZXMgZnJvbSBzeXMubW9kdWxlcwogICAgIGltcG9ydCBzeXMKQEAgLTcwLDcgKzc1LDcgQEAKICAgICBleGVjICIiIgogY2xhc3MgX2l0ZXJfbWl4aW4oVXNlckRpY3QuRGljdE1peGluKToKICAgICBkZWYgX21ha2VfaXRlcl9jdXJzb3Ioc2VsZik6Ci0gICAgICAgIGN1ciA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgY3VyID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmN1cnNvcikKICAgICAgICAga2V5ID0gaWQoY3VyKQogICAgICAgICBzZWxmLl9jdXJzb3JfcmVmc1trZXldID0gcmVmKGN1ciwgc2VsZi5fZ2VuX2NyZWZfY2xlYW5lcihrZXkpKQogICAgICAgICByZXR1cm4gY3VyCkBAIC05MCwxOSArOTUsMTkgQEAKIAogICAgICAgICAgICAgIyBzaW5jZSB3ZSdyZSBvbmx5IHJldHVybmluZyBrZXlzLCB3ZSBjYWxsIHRoZSBjdXJzb3IKICAgICAgICAgICAgICMgbWV0aG9kcyB3aXRoIGZsYWdzPTAsIGRsZW49MCwgZG9mcz0wCi0gICAgICAgICAgICBrZXkgPSBjdXIuZmlyc3QoMCwwLDApWzBdCisgICAgICAgICAgICBrZXkgPSBfRGVhZGxvY2tXcmFwKGN1ci5maXJzdCwgMCwwLDApWzBdCiAgICAgICAgICAgICB5aWVsZCBrZXkKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV4dCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAga2V5ID0gX0RlYWRsb2NrV3JhcChuZXh0LCAwLDAsMClbMF0KICAgICAgICAgICAgICAgICAgICAgeWllbGQga2V5CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTE5LDIxICsxMjQsMjEgQEAKICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDItZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCiAKLSAgICAgICAgICAgIGt2ID0gY3VyLmZpcnN0KCkKKyAgICAgICAgICAgIGt2ID0gX0RlYWRsb2NrV3JhcChjdXIuZmlyc3QpCiAgICAgICAgICAgICBrZXkgPSBrdlswXQogICAgICAgICAgICAgeWllbGQga3YKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga3YgPSBuZXh0KCkKKyAgICAgICAgICAgICAgICAgICAga3YgPSBfRGVhZGxvY2tXcmFwKG5leHQpCiAgICAgICAgICAgICAgICAgICAgIGtleSA9IGt2WzBdCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGt2CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTc3LDkgKzE4Miw5IEBACiAKICAgICBkZWYgX2NoZWNrQ3Vyc29yKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmRiYyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5kYmMgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgICAgICBzZWxmLmRiYyA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jdXJzb3IpCiAgICAgICAgICAgICBpZiBzZWxmLnNhdmVkX2RiY19rZXkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5kYmMuc2V0KHNlbGYuc2F2ZWRfZGJjX2tleSkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnNldCwgc2VsZi5zYXZlZF9kYmNfa2V5KQogICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKIAogICAgICMgVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciBhbGwgbm9uLWN1cnNvciBEQiBjYWxscyB0byBhdm9pZApAQCAtMTkyLDE1ICsxOTcsMTUgQEAKICAgICAgICAgICAgIHNlbGYuZGJjID0gTm9uZQogICAgICAgICAgICAgaWYgc2F2ZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IGMuY3VycmVudCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gX0RlYWRsb2NrV3JhcChjLmN1cnJlbnQsIDAsMCwwKVswXQogICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoYy5jbG9zZSkKICAgICAgICAgICAgIGRlbCBjCiAgICAgICAgIGZvciBjcmVmIGluIHNlbGYuX2N1cnNvcl9yZWZzLnZhbHVlcygpOgogICAgICAgICAgICAgYyA9IGNyZWYoKQogICAgICAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGMuY2xvc2UpCiAKICAgICBkZWYgX2NoZWNrT3BlbihzZWxmKToKICAgICAgICAgaWYgc2VsZi5kYiBpcyBOb25lOgpAQCAtMjExLDczICsyMTYsNzcgQEAKIAogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGIpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogbGVuKHNlbGYuZGIpKSAgIyBsZW4oc2VsZi5kYikKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gc2VsZi5kYltrZXldCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogc2VsZi5kYltrZXldKSAgIyBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKCkKLSAgICAgICAgc2VsZi5kYltrZXldID0gdmFsdWUKKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBzZWxmLmRiW2tleV0gPSB2YWx1ZQorICAgICAgICBfRGVhZGxvY2tXcmFwKHdyYXBGKSAgIyBzZWxmLmRiW2tleV0gPSB2YWx1ZQogCiAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2Nsb3NlQ3Vyc29ycygpCi0gICAgICAgIGRlbCBzZWxmLmRiW2tleV0KKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYltrZXldCisgICAgICAgIF9EZWFkbG9ja1dyYXAod3JhcEYpICAjIGRlbCBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKHNhdmU9MCkKICAgICAgICAgaWYgc2VsZi5kYmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmRiYy5jbG9zZSgpCisgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmNsb3NlKQogICAgICAgICB2ID0gMAogICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgdiA9IHNlbGYuZGIuY2xvc2UoKQorICAgICAgICAgICAgdiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jbG9zZSkKICAgICAgICAgc2VsZi5kYmMgPSBOb25lCiAgICAgICAgIHNlbGYuZGIgPSBOb25lCiAgICAgICAgIHJldHVybiB2CiAKICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKLSAgICAgICAgcmV0dXJuIHNlbGYuZGIua2V5cygpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKHNlbGYuZGIua2V5cykKIAogICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLmhhc19rZXkoa2V5KQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmhhc19rZXksIGtleSkKIAogICAgIGRlZiBzZXRfbG9jYXRpb24oc2VsZiwga2V5KToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICByZXR1cm4gc2VsZi5kYmMuc2V0X3JhbmdlKGtleSkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuc2V0X3JhbmdlLCBrZXkpCiAKICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICBydiA9IHNlbGYuZGJjLm5leHQoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMubmV4dCkKICAgICAgICAgcmV0dXJuIHJ2CiAKICAgICBkZWYgcHJldmlvdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5wcmV2KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnByZXYpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGZpcnN0KHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQogICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCi0gICAgICAgIHJ2ID0gc2VsZi5kYmMuZmlyc3QoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuZmlyc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGxhc3Qoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5sYXN0KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmxhc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIHN5bmMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLnN5bmMoKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLnN5bmMpCiAKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NSw1ICszOTQsNCBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGRiLkRCX1RIUkVBRCA9IDAKIAotCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL2RicmVjaW8ucHkgYi9MaWIvYnNkZGIvZGJyZWNpby5weQppbmRleCAyMmUzODJhLi5kNDM5ZjMyIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvZGJyZWNpby5weQorKysgYi9MaWIvYnNkZGIvZGJyZWNpby5weQpAQCAtNzUsNyArNzUsNyBAQAogCiAgICAgICAgIGRsZW4gPSBuZXdwb3MgLSBzZWxmLnBvcwogCi0gICAgICAgIHIgPSBzZWxmLmRiLmdldChrZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQorICAgICAgICByID0gc2VsZi5kYi5nZXQoc2VsZi5rZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogICAgICAgICByZXR1cm4gcgogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWQiKQogICAgICAgICBlbGlmIHNpemUgPCBzZWxmLnBvczoKICAgICAgICAgICAgIHNlbGYucG9zID0gc2l6ZQotICAgICAgICBzZWxmLmRiLnB1dChrZXksICIiLCB0eG49c2VsZi50eG4sIGRsZW49c2VsZi5sZW4tc2l6ZSwgZG9mZj1zaXplKQorICAgICAgICBzZWxmLmRiLnB1dChzZWxmLmtleSwgIiIsIHR4bj1zZWxmLnR4biwgZGxlbj1zZWxmLmxlbi1zaXplLCBkb2ZmPXNpemUpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcMCcqKHNlbGYucG9zIC0gc2VsZi5sZW4pKQogICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcwogICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbihzKQotICAgICAgICBzZWxmLmRiLnB1dChrZXksIHMsIHR4bj1zZWxmLnR4biwgZGxlbj1sZW4ocyksIGRvZmY9c2VsZi5wb3MpCisgICAgICAgIHNlbGYuZGIucHV0KHNlbGYua2V5LCBzLCB0eG49c2VsZi50eG4sIGRsZW49bGVuKHMpLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogCiAgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ0YWJsZXMucHkgYi9MaWIvYnNkZGIvZGJ0YWJsZXMucHkKaW5kZXggMzY5ZGI0My4uNDkyZDVmZCAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL2RidGFibGVzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnRhYmxlcy5weQpAQCAtMzIsNiArMzIsMTIgQEAKICAgICAjIEZvciBQeXRob24gMi4zCiAgICAgZnJvbSBic2RkYi5kYiBpbXBvcnQgKgogCisjIFhYWChubm9yd2l0eik6IGlzIHRoaXMgY29ycmVjdD8gREJJbmNvbXBsZXRlRXJyb3IgaXMgY29uZGl0aW9uYWwgaW4gX2JzZGRiLmMKK3RyeToKKyAgICBEQkluY29tcGxldGVFcnJvcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBjbGFzcyBEQkluY29tcGxldGVFcnJvcihFeGNlcHRpb24pOgorICAgICAgICBwYXNzCiAKIGNsYXNzIFRhYmxlREJFcnJvcihTdGFuZGFyZEVycm9yKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ1dGlscy5weSBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CmluZGV4IDNmNjM4NDIuLjZkY2ZkZDUgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9kYnV0aWxzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CkBAIC0yMiwxNCArMjIsMTQgQEAKIAogIwogIyBpbXBvcnQgdGhlIHRpbWUuc2xlZXAgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2FmZSB3YXkgdG8gYWxsb3cKLSMgImZyb20gYnNkZGIuZGIgaW1wb3J0ICoiCisjICJmcm9tIGJzZGRiLmRidXRpbHMgaW1wb3J0ICoiCiAjCiBmcm9tIHRpbWUgaW1wb3J0IHNsZWVwIGFzIF9zbGVlcAogCiBpbXBvcnQgZGIKIAogIyBhbHdheXMgc2xlZXAgYXQgbGVhc3QgTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCi1fZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzY0CitfZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzEyOAogIyBuZXZlciBzbGVlcCBtb3JlIHRoYW4gTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCiBfZGVhZGxvY2tfTWF4U2xlZXBUaW1lID0gMy4xNDE1OQogCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgbWF4X3JldHJpZXMgPSBfa3dhcmdzLmdldCgnbWF4X3JldHJpZXMnLCAtMSkKICAgICBpZiBfa3dhcmdzLmhhc19rZXkoJ21heF9yZXRyaWVzJyk6CiAgICAgICAgIGRlbCBfa3dhcmdzWydtYXhfcmV0cmllcyddCi0gICAgd2hpbGUgMToKKyAgICB3aGlsZSBUcnVlOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKl9hcmdzLCAqKl9rd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBkYi5EQkxvY2tEZWFkbG9ja0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQppbmRleCBiZWM1ZGEzLi5kNmQ1MDdmIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQpAQCAtNTYyLDYgKzU2Miw5IEBACiAgICAgICAgIG51bSA9IGQudHJ1bmNhdGUoKQogICAgICAgICBhc3NlcnQgbnVtID09IDAsICJ0cnVuY2F0ZSBvbiBlbXB0eSBEQiByZXR1cm5lZCBub256ZXJvICglcikiICUgKG51bSwpCiAKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIApAQCAtNTgzLDE4ICs1ODYsNDAgQEAKICAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAogCiAKLWNsYXNzIEJhc2ljQlRyZWVXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY1dpdGhFbnZUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIHVzZUVudiA9IDEKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW52OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICMgY2FuJ3QgcmVuYW1lIG9yIHJlbW92ZSBhbiBvcGVuIERCCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICAgICAgbmV3bmFtZSA9IHNlbGYuZmlsZW5hbWUgKyAnLnJlbmFtZWQnCisgICAgICAgIHNlbGYuZW52LmRicmVuYW1lKHNlbGYuZmlsZW5hbWUsIE5vbmUsIG5ld25hbWUpCisgICAgICAgIHNlbGYuZW52LmRicmVtb3ZlKG5ld25hbWUpCisKKyAgICAjIGRicmVtb3ZlIGFuZCBkYnJlbmFtZSBhcmUgaW4gNC4xIGFuZCBsYXRlcgorICAgIGlmIGRiLnZlcnNpb24oKSA8ICg0LDEpOgorICAgICAgICBkZWwgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNCVHJlZVdpdGhFbnZUZXN0Q2FzZShCYXNpY1dpdGhFbnZUZXN0Q2FzZSk6CiAgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCi1jbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNXaXRoRW52VGVzdENhc2UpOgogICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weSBiL0xpYi9jb21waWxlci9mdXR1cmUucHkKaW5kZXggMzljM2JiOS4uZmVmMTg5ZSAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weQorKysgYi9MaWIvY29tcGlsZXIvZnV0dXJlLnB5CkBAIC0yMywxNCArMjMsNyBAQAogCiAgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgogICAgICAgICBzdG10ID0gbm9kZS5ub2RlCi0gICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IEZhbHNlCiAgICAgICAgIGZvciBzIGluIHN0bXQubm9kZXM6Ci0gICAgICAgICAgICAjIFNraXAgb3ZlciBkb2NzdHJpbmdzCi0gICAgICAgICAgICBpZiBub3QgZm91bmRfZG9jc3RyaW5nIGFuZCBpc2luc3RhbmNlKHMsIGFzdC5EaXNjYXJkKSBcCi0gICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzLmV4cHIsIGFzdC5Db25zdCkgXAotICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uocy5leHByLnZhbHVlLCBzdHIpOgotICAgICAgICAgICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IFRydWUKLSAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfc3RtdChzKToKICAgICAgICAgICAgICAgICBicmVhawogCmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5IGIvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQppbmRleCBjMDkzMTI4Li5jOGE5Nzc5IDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CisrKyBiL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKQEAgLTM4MCwxNiArMzgwLDcgQEAKICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCiAgICAgICAgIGZvciBkZWZhdWx0IGluIG5vZGUuZGVmYXVsdHM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGRlZmF1bHQpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGZyZWVzOgotICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICAgICAgc2VsZi5lbWl0KCdNQUtFX0ZVTkNUSU9OJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgbGVuKG5vZGUuZGVmYXVsdHMpKQogICAgICAgICBmb3IgaSBpbiByYW5nZShuZGVjb3JhdG9ycyk6CiAgICAgICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQogCkBAIC00MDMsMTQgKzM5NCw3IEBACiAgICAgICAgIGZvciBiYXNlIGluIG5vZGUuYmFzZXM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGJhc2UpCiAgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4obm9kZS5iYXNlcykpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgMCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIDApCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMCkKICAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9DTEFTUycpCiAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKQEAgLTY0MiwyMiArNjI2LDI1IEBACiAgICAgICAgIHNlbGYubmV3QmxvY2soKQogICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQogCisgICAgZGVmIF9tYWtlQ2xvc3VyZShzZWxmLCBnZW4sIGFyZ3MpOgorICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKKyAgICAgICAgaWYgZnJlZXM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1RVUExFJywgbGVuKGZyZWVzKSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIGFyZ3MpCisKICAgICBkZWYgdmlzaXRHZW5FeHByKHNlbGYsIG5vZGUpOgogICAgICAgICBnZW4gPSBHZW5FeHByQ29kZUdlbmVyYXRvcihub2RlLCBzZWxmLnNjb3Blcywgc2VsZi5jbGFzc19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tb2R1bGUoKSkKICAgICAgICAgd2Fsayhub2RlLmNvZGUsIGdlbikKICAgICAgICAgZ2VuLmZpbmlzaCgpCiAgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQotICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKLSAgICAgICAgaWYgZnJlZXM6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfQ0xPU1VSRScsIDApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfRlVOQ1RJT04nLCAwKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgIyBwcmVjb21wdXRhdGlvbiBvZiBvdXRtb3N0IGl0ZXJhYmxlCiAgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLnF1YWxzWzBdLml0ZXIpCiAgICAgICAgIHNlbGYuZW1pdCgnR0VUX0lURVInKQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL3N5bWJvbHMucHkgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQppbmRleCBjNjA4ZjY0Li44ZWI1ZmNlIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvc3ltYm9scy5weQorKysgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgIHNlbGYuYWRkX3BhcmFtKCdbb3V0bW9zdC1pdGVyYWJsZV0nKQogCiAgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKLSAgICAgICAga2V5cyA9IFNjb3BlLmdldF9uYW1lcygpCisgICAgICAgIGtleXMgPSBTY29wZS5nZXRfbmFtZXMoc2VsZikKICAgICAgICAgcmV0dXJuIGtleXMKIAogY2xhc3MgTGFtYmRhU2NvcGUoRnVuY3Rpb25TY29wZSk6CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkgYi9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKaW5kZXggOTZiY2NlMy4uOGQyNTZlZCAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5CisrKyBiL0xpYi9jb21waWxlci90cmFuc2Zvcm1lci5weQpAQCAtNTM2LDEyICs1MzYsNyBAQAogICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKIAogICAgIGRlZiB0cnlfc3RtdChzZWxmLCBub2RlbGlzdCk6Ci0gICAgICAgICMgJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQotICAgICAgICAjIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKLSAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gIT0gc3ltYm9sLmV4Y2VwdF9jbGF1c2U6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fdHJ5X2ZpbmFsbHkobm9kZWxpc3QpCi0KLSAgICAgICAgcmV0dXJuIHNlbGYuY29tX3RyeV9leGNlcHQobm9kZWxpc3QpCisgICAgICAgIHJldHVybiBzZWxmLmNvbV90cnlfZXhjZXB0X2ZpbmFsbHkobm9kZWxpc3QpCiAKICAgICBkZWYgd2l0aF9zdG10KHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3dpdGgobm9kZWxpc3QpCkBAIC03MjksMjIgKzcyNCwyMCBAQAogCiAgICAgZGVmIGF0b20oc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXRvbV9kaXNwYXRjaFtub2RlbGlzdFswXVswXV0obm9kZWxpc3QpCi0gICAgICAgIG4ubGluZW5vID0gbm9kZWxpc3RbMF1bMl0KLSAgICAgICAgcmV0dXJuIG4KIAogICAgIGRlZiBhdG9tX2xwYXIoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SUEFSOgotICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpKQorICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbHNxYihzZWxmLCBub2RlbGlzdCk6CiAgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJTUUI6Ci0gICAgICAgICAgICByZXR1cm4gTGlzdCgoKSkKKyAgICAgICAgICAgIHJldHVybiBMaXN0KCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9saXN0X2NvbnN0cnVjdG9yKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbGJyYWNlKHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uUkJSQUNFOgotICAgICAgICAgICAgcmV0dXJuIERpY3QoKCkpCisgICAgICAgICAgICByZXR1cm4gRGljdCgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQogICAgICAgICByZXR1cm4gc2VsZi5jb21fZGljdG1ha2VyKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fYmFja3F1b3RlKHNlbGYsIG5vZGVsaXN0KToKQEAgLTkxOSwxOCArOTEyLDIxIEBACiAgICAgICAgICAgICBiYXNlcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlW2ldKSkKICAgICAgICAgcmV0dXJuIGJhc2VzCiAKLSAgICBkZWYgY29tX3RyeV9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZmluX3N0bXQ6ICJ0cnkiICI6IiBzdWl0ZSAiZmluYWxseSIgIjoiIHN1aXRlCi0gICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgIGRlZiBjb21fdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAoJ3RyeScgJzonIHN1aXRlCisgICAgICAgICMgICgoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0gWydmaW5hbGx5JyAnOicgc3VpdGVdCisgICAgICAgICMgICB8ICdmaW5hbGx5JyAnOicgc3VpdGUpKQogCi0gICAgZGVmIGNvbV90cnlfZXhjZXB0KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZXhjZXB0OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSogWydlbHNlJyBzdWl0ZV0KKyAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICMgZmlyc3QgY2xhdXNlIGlzIGEgZmluYWxseSBjbGF1c2U6IG9ubHkgdHJ5LWZpbmFsbHkKKyAgICAgICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFs1XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKICAgICAgICAgI3RyeWV4Y2VwdDogIFtUcnlOb2RlLCBbZXhjZXB0X2NsYXVzZXNdLCBlbHNlTm9kZSldCi0gICAgICAgIHN0bXQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQogICAgICAgICBjbGF1c2VzID0gW10KICAgICAgICAgZWxzZU5vZGUgPSBOb25lCisgICAgICAgIGZpbmFsbHlOb2RlID0gTm9uZQogICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBsZW4obm9kZWxpc3QpLCAzKToKICAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSBzeW1ib2wuZXhjZXB0X2NsYXVzZToKQEAgLTk0Niw5ICs5NDIsMTYgQEAKICAgICAgICAgICAgICAgICBjbGF1c2VzLmFwcGVuZCgoZXhwcjEsIGV4cHIyLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMl0pKSkKIAogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5OQU1FOgotICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQotICAgICAgICByZXR1cm4gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgICAgICAgICAgaWYgbm9kZVsxXSA9PSAnZWxzZSc6CisgICAgICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICAgICAgICAgIGVsaWYgbm9kZVsxXSA9PSAnZmluYWxseSc6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHlOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICB0cnlfZXhjZXB0ID0gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGlmIGZpbmFsbHlOb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRyeUZpbmFsbHkodHJ5X2V4Y2VwdCwgZmluYWxseU5vZGUsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB0cnlfZXhjZXB0CiAKICAgICBkZWYgY29tX3dpdGgoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICAjIHdpdGhfc3RtdDogJ3dpdGgnIGV4cHIgW3dpdGhfdmFyXSAnOicgc3VpdGUKQEAgLTExMzgsNyArMTE0MSw3IEBACiAgICAgICAgICAgICB2YWx1ZXMgPSBbXQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGVsaXN0KSwgMik6CiAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkKLSAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcykKKyAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcywgbGluZW5vPXZhbHVlc1swXS5saW5lbm8pCiAKICAgICBpZiBoYXNhdHRyKHN5bWJvbCwgJ2dlbl9mb3InKToKICAgICAgICAgZGVmIGNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbihzZWxmLCBleHByLCBub2RlKToKQEAgLTExODUsNyArMTE4OCw3IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCksIDQpOgogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKSkpCi0gICAgICAgIHJldHVybiBEaWN0KGl0ZW1zKQorICAgICAgICByZXR1cm4gRGljdChpdGVtcywgbGluZW5vPWl0ZW1zWzBdWzBdLmxpbmVubykKIAogICAgIGRlZiBjb21fYXBwbHlfdHJhaWxlcihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgogICAgICAgICB0ID0gbm9kZWxpc3RbMV1bMF0KQEAgLTEzNzksNiArMTM4Miw3IEBACiAgICAgc3ltYm9sLnRlc3RsaXN0LAogICAgIHN5bWJvbC50ZXN0bGlzdF9zYWZlLAogICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5vcl90ZXN0LAogICAgIHN5bWJvbC5hbmRfdGVzdCwKICAgICBzeW1ib2wubm90X3Rlc3QsCiAgICAgc3ltYm9sLmNvbXBhcmlzb24sCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCBmMmRkYmFhLi5hNGUzYzM2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTEsOSArMSwxMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiY3JlYXRlIGFuZCBtYW5pcHVsYXRlIEMgZGF0YSB0eXBlcyBpbiBQeXRob24iIiIKIAogaW1wb3J0IG9zIGFzIF9vcywgc3lzIGFzIF9zeXMKLWZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiBhcyBfY2hhaW4KIAotX192ZXJzaW9uX18gPSAiMC45LjkuNiIKK19fdmVyc2lvbl9fID0gIjEuMC4wIgogCiBmcm9tIF9jdHlwZXMgaW1wb3J0IFVuaW9uLCBTdHJ1Y3R1cmUsIEFycmF5CiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9Qb2ludGVyCkBAIC0yMCw2ICsyMiwyMyBAQAogaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRm9ybWF0RXJyb3IKIAorREVGQVVMVF9NT0RFID0gUlRMRF9MT0NBTAoraWYgX29zLm5hbWUgPT0gInBvc2l4IiBhbmQgX3N5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBpbXBvcnQgZ2VzdGFsdAorCisgICAgIyBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKyAgICAjIGN1cnJlbnRseSBhY3RpdmUgc3lzdGVtIGZpbGUgYXMgQkNELgorICAgICMgT24gT1MgWCAxMC40LjYgLT4gMHgxMDQ2CisgICAgIyBPbiBPUyBYIDEwLjIuOCAtPiAweDEwMjgKKyAgICAjIFNlZSBhbHNvIGh0dHA6Ly93d3cucmdhcm9zLm5sL2dlc3RhbHQvCisgICAgIworICAgICMgT24gT1MgWCAxMC4zLCB3ZSB1c2UgUlRMRF9HTE9CQUwgYXMgZGVmYXVsdCBtb2RlCisgICAgIyBiZWNhdXNlIFJUTERfTE9DQUwgZG9lcyBub3Qgd29yayBhdCBsZWFzdCBvbiBzb21lCisgICAgIyBsaWJyYXJpZXMuCisKKyAgICBpZiBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSA8IDB4MTA0MDoKKyAgICAgICAgREVGQVVMVF9NT0RFID0gUlRMRF9HTE9CQUwKKwogZnJvbSBfY3R5cGVzIGltcG9ydCBGVU5DRkxBR19DREVDTCBhcyBfRlVOQ0ZMQUdfQ0RFQ0wsIFwKICAgICAgRlVOQ0ZMQUdfUFlUSE9OQVBJIGFzIF9GVU5DRkxBR19QWVRIT05BUEkKIApAQCAtNjcsNyArODYsNyBAQAogICAgIHJlc3R5cGU6IHRoZSByZXN1bHQgdHlwZQogICAgIGFyZ3R5cGVzOiBhIHNlcXVlbmNlIHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50IHR5cGVzCiAKLSAgICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSBjYWxsZWQgaW4gdGhyZWUgd2F5cyB0byBjcmVhdGUgYQorICAgIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgY2FuIGJlIGNhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cyB0byBjcmVhdGUgYQogICAgIGNhbGxhYmxlIG9iamVjdDoKIAogICAgIHByb3RvdHlwZShpbnRlZ2VyIGFkZHJlc3MpIC0+IGZvcmVpZ24gZnVuY3Rpb24KQEAgLTExMSw3ICsxMzAsNyBAQAogZWxpZiBfb3MubmFtZSA9PSAicG9zaXgiOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuIGFzIF9kbG9wZW4KIAotZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudAorZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudCwgcmVzaXplCiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQogCiBjbGFzcyBweV9vYmplY3QoX1NpbXBsZUNEYXRhKToKQEAgLTI4Miw3ICszMDEsNyBAQAogICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMCiAgICAgICAgIF9yZXN0eXBlXyA9IGNfaW50ICMgZGVmYXVsdCwgY2FuIGJlIG92ZXJyaWRkZW4gaW4gaW5zdGFuY2VzCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgIGlmIGhhbmRsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gX2Rsb3BlbihzZWxmLl9uYW1lLCBtb2RlKQpAQCAtMjkzLDE4ICszMTIsMTkgQEAKICAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCiAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCiAgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChfc3lzLm1heGludCoyICsgMSkpLAotICAgICAgICAgICAgICAgIGlkKHNlbGYpKQorICAgICAgICAgICAgICAgIGlkKHNlbGYpICYgKF9zeXMubWF4aW50KjIgKyAxKSkKIAogICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBuYW1lLmVuZHN3aXRoKCdfXycpOgogICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgZnVuYyA9IHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICByZXR1cm4gZnVuYwogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCk6CiAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKChuYW1lX29yX29yZGluYWwsIHNlbGYpKQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lX29yX29yZGluYWwsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lX29yX29yZGluYWwKLSAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZV9vcl9vcmRpbmFsLCBmdW5jKQogICAgICAgICByZXR1cm4gZnVuYwogCiBjbGFzcyBQeURMTChDRExMKToKQEAgLTQxOSwxMiArNDM5LDEwIEBACiAgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQotX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKIAorX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQogZGVmIGNhc3Qob2JqLCB0eXApOgotICAgIHJlc3VsdCA9IF9jYXN0KG9iaiwgdHlwKQotICAgIHJlc3VsdC5fX2tlZXByZWYgPSBvYmoKLSAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIF9jYXN0KG9iaiwgb2JqLCB0eXApCiAKIF9zdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKIGRlZiBzdHJpbmdfYXQocHRyLCBzaXplPTApOgpAQCAtNDQ2LDUyICs0NjQsMjEgQEAKICAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKIAogCi1pZiBfb3MubmFtZSA9PSAibnQiOiAjIENPTSBzdHVmZgoraWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOiAjIENPTSBzdHVmZgogICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGZvciB0aGUKLSAgICAgICAgIyBjbGFzcyBvYmplY3QuCi0KLSAgICAgICAgIyB0cmljayBweTJleGUgYnkgZG9pbmcgZHluYW1pYyBpbXBvcnRzCi0gICAgICAgIHJlc3VsdCA9IC0yMTQ3MjIxMjMxICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjdGNvbSA9IF9faW1wb3J0X18oImN0eXBlcy5jb20uc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgICAgICBjY29tID0gX19pbXBvcnRfXygiY29tdHlwZXMuc2VydmVyLmlucHJvY3NlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXR1cm4gLTIxNDcyMjEyMzEgIyBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN1bHQgPSBjdGNvbS5EbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdikKLQotICAgICAgICBpZiByZXN1bHQgPT0gLTIxNDcyMjEyMzE6ICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCiAKICAgICBkZWYgRGxsQ2FuVW5sb2FkTm93KCk6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGlmIHdlIGNhbiB1bmxvYWQgb3Igbm90LgotICAgICAgICAjIHRyaWNrIHB5MmV4ZSBieSBkb2luZyBkeW5hbWljIGltcG9ydHMKLSAgICAgICAgcmVzdWx0ID0gMCAjIFNfT0sKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgY3Rjb20gPSBfX2ltcG9ydF9fKCJjdHlwZXMuY29tLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlci5pbnByb2NzZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVzdWx0ID0gY3Rjb20uRGxsQ2FuVW5sb2FkTm93KCkKLSAgICAgICAgICAgIGlmIHJlc3VsdCAhPSAwOiAjICE9IFNfT0sKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIDAgIyBTX09LCisgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCiAKIGZyb20gY3R5cGVzLl9lbmRpYW4gaW1wb3J0IEJpZ0VuZGlhblN0cnVjdHVyZSwgTGl0dGxlRW5kaWFuU3RydWN0dXJlCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2VuZGlhbi5weSBiL0xpYi9jdHlwZXMvX2VuZGlhbi5weQppbmRleCA1ODE4YWUxLi42ZGUwZDQ3IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19lbmRpYW4ucHkKKysrIGIvTGliL2N0eXBlcy9fZW5kaWFuLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHkKaW5kZXggNTYyMWRlZi4uMzYxNDlkMiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBFbm91Z2ggTWFjaC1PIHRvIG1ha2UgeW91ciBoZWFkIHNwaW4uCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQppbmRleCBhMzM2ZmQwLi4xNGUyMTM5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGQucHkKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxkLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBkeWxkIGVtdWxhdGlvbgogIiIiCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5IGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxpYi5weQppbmRleCBhYTEwNzUwLi5lYTNkZDM4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5CisrKyBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkKQEAgLTEsMyArMSw2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAiIiIKIEdlbmVyaWMgZHlsaWIgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQppbmRleCBhZDZlZDU1Li5kZDdmYjJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpAQCAtMSwzICsxLDYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICIiIgogR2VuZXJpYyBmcmFtZXdvcmsgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMDJjYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKQEAgLTAsMCArMSw2MCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBBbm9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbm9uKHNlbGYpOgorICAgICAgICBjbGFzcyBBTk9OKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8iLCBBTk9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYi5vZmZzZXQsIDApCisKKyAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKKyAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0eXBlKFN0cnVjdHVyZSkoIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cnVjdHVyZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IFtdLCAiX2Fub255bW91c18iOiA0Mn0pKQorCisgICAgZGVmIHRlc3RfYW5vbl9ub25tZW1iZXIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlRXJyb3I6IHR5cGUgb2JqZWN0ICdOYW1lJyBoYXMgbm8gYXR0cmlidXRlICd4JworICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hbm9ueW1vdXNfIjogWyJ4Il19KSkKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQU5PTl9TKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgQU5PTl9VKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIEFOT05fUyksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfIiwgQU5PTl9VKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDgyMWNlM2YuLjA5ZTkyOGYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtMzAsMTcgKzMwLDMyIEBACiAgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzcywgUE9JTlRFUihjX2ludCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKIAorICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIGFycmF5WzBdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQogCi0gICAgZGVmIHRlc3RfcHRyMmFycmF5KHNlbGYpOgotICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKKyAgICAgICAgcCA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19jaGFyX3ApKQorICAgICAgICAjIGFycmF5IGFuZCBwIHNoYXJlIGEgY29tbW9uIF9vYmplY3RzIGF0dHJpYnV0ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIHsnMCc6ICJmb28gYmFyIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHBbMF0gPSAic3BhbSBzcGFtIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLl9vYmplY3RzLCB7JzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQorICAgICAgICBwWzFdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuX29iamVjdHMsIHsnMSc6ICdmb28gYmFyJywgJzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQogCi0gICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudAotCi0gICAgICAgIGJlZm9yZSA9IGdldHJlZmNvdW50KGFycmF5KQotICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0cmVmY291bnQoYXJyYXkpLCBiZWZvcmUgKyAxKQotICAgICAgICBkZWwgcHRyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldHJlZmNvdW50KGFycmF5KSwgYmVmb3JlKQorICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgorICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgY19pbnQoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBwWzJdID0gOTYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIGNfaW50KCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CmluZGV4IDczMThmMjkuLjgwYjZjYTIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC02MSw2ICs2MSw4IEBACiAgICAgICAgIHIudWwueCA9IDIyCiAgICAgICAgIHIudWwueSA9IDQ0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKyAgICAgICAgci5sciA9IFBPSU5UKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5fb2JqZWN0cywgeycwJzoge30sICcxJzoge319KQogCiBjbGFzcyBBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jaW50X2FycmF5KHNlbGYpOgpAQCAtODYsOSArODgsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgeycxJzoge319KQogCiBjbGFzcyBQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBYX3Rlc3RfcF9jaW50KHNlbGYpOgotICAgICAgICB4ID0gcG9pbnRlcihjX2ludCg0MikpCi0gICAgICAgIHByaW50IHguX29iamVjdHMKKyAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CisgICAgICAgIGkgPSBjX2ludCg0MikKKyAgICAgICAgeCA9IHBvaW50ZXIoaSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIFhfdGVzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDQ1NTg1YWUuLjI4YzgzZmQ0IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTksMTggKzksMTAgQEAKICAgICBsaWJjX25hbWUgPSAibXN2Y3J0IgogZWxpZiBvcy5uYW1lID09ICJjZSI6CiAgICAgbGliY19uYW1lID0gImNvcmVkbGwiCi1lbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLSAgICBsaWJjX25hbWUgPSAibGliYy5keWxpYiIKIGVsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgIGxpYmNfbmFtZSA9ICJjeWd3aW4xLmRsbCIKIGVsc2U6Ci0gICAgZm9yIGxpbmUgaW4gb3MucG9wZW4oImxkZCAlcyIgJSBzeXMuZXhlY3V0YWJsZSk6Ci0gICAgICAgIGlmICJsaWJjLnNvIiBpbiBsaW5lOgotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJvcGVuYnNkMyI6Ci0gICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzRdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxpYmNfbmFtZSA9IGxpbmUuc3BsaXQoKVsyXQotICAgICAgICAgICAgYnJlYWsKKyAgICBsaWJjX25hbWUgPSBmaW5kX2xpYnJhcnkoImMiKQogCiBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJwcmludGluZyIpOgogICAgIHByaW50ICJsaWJjX25hbWUgaXMiLCBsaWJjX25hbWUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTIxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CkBAIC0wLDAgKzEsNzAgQEAKK3InJycKK1RoaXMgdGVzdHMgdGhlICdfb2JqZWN0cycgYXR0cmlidXRlIG9mIGN0eXBlcyBpbnN0YW5jZXMuICAnX29iamVjdHMnCitob2xkcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgdGhhdCBtdXN0IGJlIGtlcHQgYWxpdmUgYXMgbG9uZyBhcyB0aGUKK2N0eXBlcyBpbnN0YW5jZSwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1lbW9yeSBidWZmZXIgaXMgdmFsaWQuCisKK1dBUk5JTkc6IFRoZSAnX29iamVjdHMnIGF0dHJpYnV0ZSBpcyBleHBvc2VkIE9OTFkgZm9yIGRlYnVnZ2luZyBjdHlwZXMgaXRzZWxmLAoraXQgTVVTVCBORVZFUiBCRSBNT0RJRklFRCEKKworJ19vYmplY3RzJyBpcyBpbml0aWFsaXplZCB0byBhIGRpY3Rpb25hcnkgb24gZmlyc3QgdXNlLCBiZWZvcmUgdGhhdCBpdAoraXMgTm9uZS4KKworSGVyZSBpcyBhbiBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnM6CisKKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGFycmF5ID0gKGNfY2hhcl9wICogNSkoKQorPj4+IHByaW50IGFycmF5Ll9vYmplY3RzCitOb25lCis+Pj4KKworVGhlIG1lbW9yeSBibG9jayBzdG9yZXMgcG9pbnRlcnMgdG8gc3RyaW5ncywgYW5kIHRoZSBzdHJpbmdzIGl0c2VsZgorYXNzaWduZWQgZnJvbSBQeXRob24gbXVzdCBiZSBrZXB0LgorCis+Pj4gYXJyYXlbNF0gPSAnZm9vIGJhcicKKz4+PiBhcnJheS5fb2JqZWN0cworeyc0JzogJ2ZvbyBiYXInfQorPj4+IGFycmF5WzRdCisnZm9vIGJhcicKKz4+PgorCitJdCBnZXRzIG1vcmUgY29tcGxpY2F0ZWQgd2hlbiB0aGUgY3R5cGVzIGluc3RhbmNlIGl0c2VsZiBpcyBjb250YWluZWQKK2luIGEgJ2Jhc2UnIG9iamVjdC4KKworPj4+IGNsYXNzIFgoU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCksICgiYXJyYXkiLCBjX2NoYXJfcCAqIDUpXQorLi4uCis+Pj4geCA9IFgoKQorPj4+IHByaW50IHguX29iamVjdHMKK05vbmUKKz4+PgorCitUaGUnYXJyYXknIGF0dHJpYnV0ZSBvZiB0aGUgJ3gnIG9iamVjdCBzaGFyZXMgcGFydCBvZiB0aGUgbWVtb3J5IGJ1ZmZlcgorb2YgJ3gnICgnX2JfYmFzZV8nIGlzIGVpdGhlciBOb25lLCBvciB0aGUgcm9vdCBvYmplY3Qgb3duaW5nIHRoZSBtZW1vcnkgYmxvY2spOgorCis+Pj4gcHJpbnQgeC5hcnJheS5fYl9iYXNlXyAjIGRvY3Rlc3Q6ICtFTExJUFNJUworPGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cy5YIG9iamVjdCBhdCAweC4uLj4KKz4+PgorCis+Pj4geC5hcnJheVswXSA9ICdzcGFtIHNwYW0gc3BhbScKKz4+PiB4Ll9vYmplY3RzCit7JzA6Mic6ICdzcGFtIHNwYW0gc3BhbSd9Cis+Pj4geC5hcnJheS5fYl9iYXNlXy5fb2JqZWN0cworeycwOjInOiAnc3BhbSBzcGFtIHNwYW0nfQorPj4+CisKKycnJworCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QsIHN5cworCitpbXBvcnQgY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6CisgICAgICAgICMgUHl0aG9uIDIuMyBoYXMgbm8gRUxMSVBTSVMgZmxhZywgc28gd2UgZG9uJ3QgdGVzdCB3aXRoIHRoaXMKKyAgICAgICAgIyB2ZXJzaW9uOgorICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgc3lzLmhleHZlcnNpb24gPiAweDAyMDQwMDAwOgorICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKaW5kZXggOTUzNzQwMC4uMWI3ZjBkYyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CkBAIC0xNDcsNiArMTQ3LDQxIEBACiAjIyAgICBkZWYgdGVzdF9wZXJmb3JtYW5jZShzZWxmKToKICMjICAgICAgICBjaGVja19wZXJmKCkKIAorICAgIGRlZiB0ZXN0X25vY3R5cGVzX2FyZ3R5cGUoc2VsZik6CisgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IENETEwsIGNfdm9pZF9wLCBBcmd1bWVudEVycm9yCisKKyAgICAgICAgZnVuYyA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgICMgVHlwZUVycm9yOiBoYXMgbm8gZnJvbV9wYXJhbSBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBmdW5jLCAiYXJndHlwZXMiLCAob2JqZWN0LCkpCisKKyAgICAgICAgY2xhc3MgQWRhcHRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKG9iamVjdCgpKSwgTm9uZSkKKworICAgICAgICBjbGFzcyBBZGFwdGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iagorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoQWRhcHRlcigpLCkKKyAgICAgICAgIyBkb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IHBhcmFtZXRlciAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIG9iamVjdCgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKGNfdm9pZF9wKDQyKSksIDQyKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG9iaikKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCisgICAgICAgICMgQXJndW1lbnRFcnJvcjogYXJndW1lbnQgMTogVmFsdWVFcnJvcjogOTkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgOTkpCisKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQppbmRleCBhN2EyODAyLi41ODY2NTVhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtMTU3LDYgKzE1NywyMyBAQAogICAgICAgICBxID0gcG9pbnRlcih5KQogICAgICAgICBwcFswXSA9IHEgICAgICAgICAjIDw9PQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA2KQorICAgIGRlZiB0ZXN0X2Nfdm9pZF9wKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTE1MTgxOTAmZ3JvdXBfaWQ9NTQ3MCZhdGlkPTEwNTQ3MAorICAgICAgICBpZiBzaXplb2YoY192b2lkX3ApID09IDQ6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKyAgICAgICAgZWxpZiBzaXplb2YoY192b2lkX3ApID09IDg6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGTCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfdm9pZF9wLCAzLjE0KSAjIG1ha2Ugc3VyZSBmbG9hdHMgYXJlIE5PVCBhY2NlcHRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfdm9pZF9wLCBvYmplY3QoKSkgIyBub3Igb3RoZXIgb2JqZWN0cwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKaW5kZXggMDhjODExZS4uNTExYzNkMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldHNsaWNlLCBhLCAwLCA1LCByYW5nZSgzMikpCiAKICAgICBkZWYgdGVzdF9jaGFyX3B0cihzZWxmKToKLSAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgorICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogCiAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKQEAgLTUwLDkgKzUwLDMxIEBACiAKICAgICAgICAgZGxsLm15X3N0cmR1cC5yZXN0eXBlID0gUE9JTlRFUihjX2J5dGUpCiAgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyktMV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyldLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCiAgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAorICAgIGRlZiB0ZXN0X2NoYXJfcHRyX3dpdGhfZnJlZShzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisKKyAgICAgICAgY2xhc3MgYWxsb2NhdGVkX2NfY2hhcl9wKGNfY2hhcl9wKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICBkZWYgZXJyY2hlY2socmVzdWx0LCBmdW5jLCBhcmdzKToKKyAgICAgICAgICAgIHJldHZhbCA9IHJlc3VsdC52YWx1ZQorICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IGFsbG9jYXRlZF9jX2NoYXJfcAorICAgICAgICBkbGwubXlfc3RyZHVwLmVycmNoZWNrID0gZXJyY2hlY2sKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sKKworCiAgICAgZGVmIHRlc3RfY2hhcl9hcnJheShzZWxmKToKICAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCA0OWYwNjRiLi44YTQ1MzFkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTEzOCw4ICsxMzgsOCBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnkuc2l6ZSwgc2l6ZW9mKGNfY2hhcikpCiAKICAgICAgICAgIyByZWFkb25seQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQogCiAgICAgICAgIGNsYXNzIFgoVW5pb24pOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLApAQCAtMTUyLDggKzE1Miw4IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgueCwgInNpemUiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCiAKICAgICAgICAgIyBYWFggU2hvdWxkIHdlIGNoZWNrIG5lc3RlZCBkYXRhIHR5cGVzIGFsc28/CiAgICAgICAgICMgb2Zmc2V0IGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY2xhc3MuLi4KQEAgLTI5OCw3ICsyOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIFR5cGVFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCiAKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgiYSIsICJiIiwgImMiKSkKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPHR5cGUgJ2V4Y2VwdGlvbnMuVmFsdWVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBWYWx1ZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBleGNlcHRpb25zLlZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKQEAgLTM3MSw1ICszNzEsMTUgQEAKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKIAorICAgIGRlZiB0ZXN0X25vbmVfdG9fcG9pbnRlcl9maWVsZHMoc2VsZik6CisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicCIsIFBPSU5URVIoY19pbnQpKV0KKworICAgICAgICBzID0gUygpCisgICAgICAgIHMueCA9IDEyMzQ1Njc4CisgICAgICAgIHMucCA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy54LCAxMjM0NTY3OCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkMjMyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5CkBAIC0wLDAgKzEsNTAgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVmFyU2l6ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3Jlc2l6ZShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJpdGVtIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhcnJheSIsIGNfaW50ICogMSldCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4Lml0ZW0gPSA0MgorICAgICAgICB4LmFycmF5WzBdID0gMTAwCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgc2l6ZW9mKGNfaW50KSAqIDIpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIDEwIGFkZGl0aW9uYWwgaXRlbXMKKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogOQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICBkZWYgdGVzdF9hcnJheV9pbnZhbGlkX2xlbmd0aChzZWxmKToKKyAgICAgICAgIyBjYW5ub3QgY3JlYXRlIGFycmF5cyB3aXRoIG5vbi1wb3NpdGl2ZSBzaXplCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTMpCisKKyAgICBkZWYgdGVzdF96ZXJvc2l6ZWRfYXJyYXkoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMCkoKQorICAgICAgICAjIGFjY2Vzc2luZyBlbGVtZW50cyBvZiB6ZXJvLXNpemVkIGFycmF5cyByYWlzZSBJbmRleEVycm9yCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIDEsIE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAtMSwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAtMSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKaW5kZXggODI0N2QzNy4uZGI1MzBkMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKQEAgLTEsNiArMSw3IEBACiAjIFdpbmRvd3Mgc3BlY2lmaWMgdGVzdHMKIAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKIGltcG9ydCB1bml0dGVzdCwgc3lzCiAKIGltcG9ydCBfY3R5cGVzX3Rlc3QKQEAgLTMwLDE1ICszMSwxMCBAQAogICAgICAgICAgICAgIyBvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCBOb25lKQogCi0gICAgICAgIGRlZiB0ZXN0X1NFSChzZWxmKToKLSAgICAgICAgICAgICMgQ2FsbCBmdW5jdGlvbnMgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cywgYW5kIG1ha2Ugc3VyZSB0aGF0IGFjY2VzcyB2aW9sYXRpb25zCi0gICAgICAgICAgICAjIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIE5vcm1hbGx5LCBpbiBhIGRlYnVnIGJ1aWxkIG9mIHRoZSBfY3R5cGVzIGV4dGVuc2lvbgotICAgICAgICAgICAgIyBtb2R1bGUsIGV4Y2VwdGlvbnMgYXJlIG5vdCB0cmFwcGVkLCBzbyB3ZSBjYW4gb25seSBydW4KLSAgICAgICAgICAgICMgdGhpcyB0ZXN0IGluIGEgcmVsZWFzZSBidWlsZC4KLSAgICAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgImdldG9iamVjdHMiKToKKyAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgiU0VIIik6CisgICAgICAgICAgICBkZWYgdGVzdF9TRUgoc2VsZik6CisgICAgICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlIHRoYXQgYWNjZXNzIHZpb2xhdGlvbnMKKyAgICAgICAgICAgICAgICAjIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbiBleGNlcHRpb24uCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSwgMzIpCiAKIGNsYXNzIFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy91dGlsLnB5IGIvTGliL2N0eXBlcy91dGlsLnB5CmluZGV4IGQ3NTZjMWMuLjJlZTI5NjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdXRpbC5weQorKysgYi9MaWIvY3R5cGVzL3V0aWwucHkKQEAgLTEsNSArMSw3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbXBvcnQgc3lzLCBvcwotaW1wb3J0IGN0eXBlcwogCiAjIGZpbmRfbGlicmFyeShuYW1lKSByZXR1cm5zIHRoZSBwYXRobmFtZSBvZiBhIGxpYnJhcnksIG9yIE5vbmUuCiBpZiBvcy5uYW1lID09ICJudCI6CkBAIC00MSwxNCArNDMsMTcgQEAKIAogZWxpZiBvcy5uYW1lID09ICJwb3NpeCI6CiAgICAgIyBBbmRyZWFzIERlZ2VydCdzIGZpbmQgZnVuY3Rpb25zLCB1c2luZyBnY2MsIC9zYmluL2xkY29uZmlnLCBvYmpkdW1wCi0gICAgaW1wb3J0IHJlLCB0ZW1wZmlsZQorICAgIGltcG9ydCByZSwgdGVtcGZpbGUsIGVycm5vCiAKICAgICBkZWYgX2ZpbmRMaWJfZ2NjKG5hbWUpOgogICAgICAgICBleHByID0gJ1teXChcKVxzXSpsaWIlc1wuW15cKFwpXHNdKicgJSBuYW1lCisgICAgICAgIGZkb3V0LCBjY291dCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZG91dCkKICAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjICY+L2Rldi9udWxsOyB0aGVuIENDPWdjYzsgZWxzZSBDQz1jYzsgZmk7JyBcCi0gICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vIC9kZXYvbnVsbCAyPiYxIC1sJyArIG5hbWUKKyAgICAgICAgICAgICAgJyRDQyAtV2wsLXQgLW8gJyArIGNjb3V0ICsgJyAyPiYxIC1sJyArIG5hbWUKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZmRvdXQsIG91dGZpbGUgPSAgdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBvcy5jbG9zZShmZG91dCkKICAgICAgICAgICAgIGZkID0gb3MucG9wZW4oY21kKQogICAgICAgICAgICAgdHJhY2UgPSBmZC5yZWFkKCkKICAgICAgICAgICAgIGVyciA9IGZkLmNsb3NlKCkKQEAgLTU4LDYgKzYzLDExIEBACiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoY2NvdXQpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQogICAgICAgICBpZiBub3QgcmVzOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvd2ludHlwZXMucHkgYi9MaWIvY3R5cGVzL3dpbnR5cGVzLnB5CmluZGV4IDkyYjc5ZDIuLjk3NjgyMzMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvd2ludHlwZXMucHkKKysrIGIvTGliL2N0eXBlcy93aW50eXBlcy5weQpAQCAtMSw2MCArMSwxMTcgQEAKLSMgWFhYIFRoaXMgbW9kdWxlIG5lZWRzIGNsZWFudXAuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKKyMgVGhlIG1vc3QgdXNlZnVsIHdpbmRvd3MgZGF0YXR5cGVzCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1EV09SRCA9IGNfdWxvbmcKLVdPUkQgPSBjX3VzaG9ydAogQllURSA9IGNfYnl0ZQorV09SRCA9IGNfdXNob3J0CitEV09SRCA9IGNfdWxvbmcKKworV0NIQVIgPSBjX3djaGFyCitVSU5UID0gY191aW50CisKK0RPVUJMRSA9IGNfZG91YmxlCisKK0JPT0xFQU4gPSBCWVRFCitCT09MID0gY19sb25nCisKK2Zyb20gY3R5cGVzIGltcG9ydCBfU2ltcGxlQ0RhdGEKK2NsYXNzIFZBUklBTlRfQk9PTChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJ2IgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnZhbHVlKQogCiBVTE9ORyA9IGNfdWxvbmcKIExPTkcgPSBjX2xvbmcKIAotTEFSR0VfSU5URUdFUiA9IGNfbG9uZ2xvbmcKLVVMQVJHRV9JTlRFR0VSID0gY191bG9uZ2xvbmcKKyMgaW4gdGhlIHdpbmRvd3MgaGVhZGVyIGZpbGVzLCB0aGVzZSBhcmUgc3RydWN0dXJlcy4KK19MQVJHRV9JTlRFR0VSID0gTEFSR0VfSU5URUdFUiA9IGNfbG9uZ2xvbmcKK19VTEFSR0VfSU5URUdFUiA9IFVMQVJHRV9JTlRFR0VSID0gY191bG9uZ2xvbmcKIAotCi1IQU5ETEUgPSBjX3Vsb25nICMgaW4gdGhlIGhlYWRlciBmaWxlczogdm9pZCAqCi0KLUhXTkQgPSBIQU5ETEUKLUhEQyA9IEhBTkRMRQotSE1PRFVMRSA9IEhBTkRMRQotSElOU1RBTkNFID0gSEFORExFCi1IUkdOID0gSEFORExFCi1IVEFTSyA9IEhBTkRMRQotSEtFWSA9IEhBTkRMRQotSFBFTiA9IEhBTkRMRQotSEdESU9CSiA9IEhBTkRMRQotSE1FTlUgPSBIQU5ETEUKLQotTENJRCA9IERXT1JECitMUENPTEVTVFIgPSBMUE9MRVNUUiA9IE9MRVNUUiA9IGNfd2NoYXJfcAorTFBDV1NUUiA9IExQV1NUUiA9IGNfd2NoYXJfcAorTFBDU1RSID0gTFBTVFIgPSBjX2NoYXJfcAogCiBXUEFSQU0gPSBjX3VpbnQKIExQQVJBTSA9IGNfbG9uZwogCi1CT09MID0gY19sb25nCi1WQVJJQU5UX0JPT0wgPSBjX3Nob3J0CitBVE9NID0gV09SRAorTEFOR0lEID0gV09SRAogCi1MUENPTEVTVFIgPSBMUE9MRVNUUiA9IE9MRVNUUiA9IGNfd2NoYXJfcAotTFBDV1NUUiA9IExQV1NUUiA9IGNfd2NoYXJfcAorQ09MT1JSRUYgPSBEV09SRAorTEdSUElEID0gRFdPUkQKK0xDVFlQRSA9IERXT1JECiAKLUxQQ1NUUiA9IExQU1RSID0gY19jaGFyX3AKK0xDSUQgPSBEV09SRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEhBTkRMRSB0eXBlcworSEFORExFID0gY191bG9uZyAjIGluIHRoZSBoZWFkZXIgZmlsZXM6IHZvaWQgKgorCitIQUNDRUwgPSBIQU5ETEUKK0hCSVRNQVAgPSBIQU5ETEUKK0hCUlVTSCA9IEhBTkRMRQorSENPTE9SU1BBQ0UgPSBIQU5ETEUKK0hEQyA9IEhBTkRMRQorSERFU0sgPSBIQU5ETEUKK0hEV1AgPSBIQU5ETEUKK0hFTkhNRVRBRklMRSA9IEhBTkRMRQorSEZPTlQgPSBIQU5ETEUKK0hHRElPQkogPSBIQU5ETEUKK0hHTE9CQUwgPSBIQU5ETEUKK0hIT09LID0gSEFORExFCitISUNPTiA9IEhBTkRMRQorSElOU1RBTkNFID0gSEFORExFCitIS0VZID0gSEFORExFCitIS0wgPSBIQU5ETEUKK0hMT0NBTCA9IEhBTkRMRQorSE1FTlUgPSBIQU5ETEUKK0hNRVRBRklMRSA9IEhBTkRMRQorSE1PRFVMRSA9IEhBTkRMRQorSE1PTklUT1IgPSBIQU5ETEUKK0hQQUxFVFRFID0gSEFORExFCitIUEVOID0gSEFORExFCitIUkdOID0gSEFORExFCitIUlNSQyA9IEhBTkRMRQorSFNUUiA9IEhBTkRMRQorSFRBU0sgPSBIQU5ETEUKK0hXSU5TVEEgPSBIQU5ETEUKK0hXTkQgPSBIQU5ETEUKK1NDX0hBTkRMRSA9IEhBTkRMRQorU0VSVklDRV9TVEFUVVNfSEFORExFID0gSEFORExFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU29tZSBpbXBvcnRhbnQgc3RydWN0dXJlIGRlZmluaXRpb25zCiAKIGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKICAgICBfZmllbGRzXyA9IFsoImxlZnQiLCBjX2xvbmcpLAogICAgICAgICAgICAgICAgICgidG9wIiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoInJpZ2h0IiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoImJvdHRvbSIsIGNfbG9uZyldCi1SRUNUTCA9IFJFQ1QKK3RhZ1JFQ1QgPSBfUkVDVEwgPSBSRUNUTCA9IFJFQ1QKKworY2xhc3MgX1NNQUxMX1JFQ1QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoJ0xlZnQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ1RvcCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnUmlnaHQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ0JvdHRvbScsIGNfc2hvcnQpXQorU01BTExfUkVDVCA9IF9TTUFMTF9SRUNUCisKK2NsYXNzIF9DT09SRChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygnWCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnWScsIGNfc2hvcnQpXQogCiBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksCiAgICAgICAgICAgICAgICAgKCJ5IiwgY19sb25nKV0KLVBPSU5UTCA9IFBPSU5UCit0YWdQT0lOVCA9IF9QT0lOVEwgPSBQT0lOVEwgPSBQT0lOVAogCiBjbGFzcyBTSVpFKFN0cnVjdHVyZSk6CiAgICAgX2ZpZWxkc18gPSBbKCJjeCIsIGNfbG9uZyksCiAgICAgICAgICAgICAgICAgKCJjeSIsIGNfbG9uZyldCi1TSVpFTCA9IFNJWkUKK3RhZ1NJWkUgPSBTSVpFTCA9IFNJWkUKIAogZGVmIFJHQihyZWQsIGdyZWVuLCBibHVlKToKICAgICByZXR1cm4gcmVkICsgKGdyZWVuIDw8IDgpICsgKGJsdWUgPDwgMTYpCkBAIC02Miw2ICsxMTksNyBAQAogY2xhc3MgRklMRVRJTUUoU3RydWN0dXJlKToKICAgICBfZmllbGRzXyA9IFsoImR3TG93RGF0ZVRpbWUiLCBEV09SRCksCiAgICAgICAgICAgICAgICAgKCJkd0hpZ2hEYXRlVGltZSIsIERXT1JEKV0KK19GSUxFVElNRSA9IEZJTEVUSU1FCiAKIGNsYXNzIE1TRyhTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygiaFduZCIsIEhXTkQpLApAQCAtNzAsNiArMTI4LDcgQEAKICAgICAgICAgICAgICAgICAoImxQYXJhbSIsIExQQVJBTSksCiAgICAgICAgICAgICAgICAgKCJ0aW1lIiwgRFdPUkQpLAogICAgICAgICAgICAgICAgICgicHQiLCBQT0lOVCldCit0YWdNU0cgPSBNU0cKIE1BWF9QQVRIID0gMjYwCiAKIGNsYXNzIFdJTjMyX0ZJTkRfREFUQUEoU3RydWN0dXJlKToKQEAgLTk1LDMgKzE1NCwxOSBAQAogICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDEiLCBEV09SRCksCiAgICAgICAgICAgICAgICAgKCJjRmlsZU5hbWUiLCBjX3djaGFyICogTUFYX1BBVEgpLAogICAgICAgICAgICAgICAgICgiY0FsdGVybmFtZUZpbGVOYW1lIiwgY193Y2hhciAqIDE0KV0KKworX19hbGxfXyA9IFsnQVRPTScsICdCT09MJywgJ0JPT0xFQU4nLCAnQllURScsICdDT0xPUlJFRicsICdET1VCTEUnLAorICAgICAgICAgICAnRFdPUkQnLCAnRklMRVRJTUUnLCAnSEFDQ0VMJywgJ0hBTkRMRScsICdIQklUTUFQJywgJ0hCUlVTSCcsCisgICAgICAgICAgICdIQ09MT1JTUEFDRScsICdIREMnLCAnSERFU0snLCAnSERXUCcsICdIRU5ITUVUQUZJTEUnLCAnSEZPTlQnLAorICAgICAgICAgICAnSEdESU9CSicsICdIR0xPQkFMJywgJ0hIT09LJywgJ0hJQ09OJywgJ0hJTlNUQU5DRScsICdIS0VZJywKKyAgICAgICAgICAgJ0hLTCcsICdITE9DQUwnLCAnSE1FTlUnLCAnSE1FVEFGSUxFJywgJ0hNT0RVTEUnLCAnSE1PTklUT1InLAorICAgICAgICAgICAnSFBBTEVUVEUnLCAnSFBFTicsICdIUkdOJywgJ0hSU1JDJywgJ0hTVFInLCAnSFRBU0snLCAnSFdJTlNUQScsCisgICAgICAgICAgICdIV05EJywgJ0xBTkdJRCcsICdMQVJHRV9JTlRFR0VSJywgJ0xDSUQnLCAnTENUWVBFJywgJ0xHUlBJRCcsCisgICAgICAgICAgICdMT05HJywgJ0xQQVJBTScsICdMUENPTEVTVFInLCAnTFBDU1RSJywgJ0xQQ1dTVFInLCAnTFBPTEVTVFInLAorICAgICAgICAgICAnTFBTVFInLCAnTFBXU1RSJywgJ01BWF9QQVRIJywgJ01TRycsICdPTEVTVFInLCAnUE9JTlQnLAorICAgICAgICAgICAnUE9JTlRMJywgJ1JFQ1QnLCAnUkVDVEwnLCAnUkdCJywgJ1NDX0hBTkRMRScsCisgICAgICAgICAgICdTRVJWSUNFX1NUQVRVU19IQU5ETEUnLCAnU0laRScsICdTSVpFTCcsICdTTUFMTF9SRUNUJywgJ1VJTlQnLAorICAgICAgICAgICAnVUxBUkdFX0lOVEVHRVInLCAnVUxPTkcnLCAnVkFSSUFOVF9CT09MJywgJ1dDSEFSJywKKyAgICAgICAgICAgJ1dJTjMyX0ZJTkRfREFUQUEnLCAnV0lOMzJfRklORF9EQVRBVycsICdXT1JEJywgJ1dQQVJBTScsICdfQ09PUkQnLAorICAgICAgICAgICAnX0ZJTEVUSU1FJywgJ19MQVJHRV9JTlRFR0VSJywgJ19QT0lOVEwnLCAnX1JFQ1RMJywgJ19TTUFMTF9SRUNUJywKKyAgICAgICAgICAgJ19VTEFSR0VfSU5URUdFUicsICd0YWdNU0cnLCAndGFnUE9JTlQnLCAndGFnUkVDVCcsICd0YWdTSVpFJ10KZGlmZiAtLWdpdCBhL0xpYi9kaWZmbGliLnB5IGIvTGliL2RpZmZsaWIucHkKaW5kZXggNTVmNjliYS4uM2UyOGIxOCAxMDA2NDQKLS0tIGEvTGliL2RpZmZsaWIucHkKKysrIGIvTGliL2RpZmZsaWIucHkKQEAgLTg2LDggKzg2LDcgQEAKICAgICA+Pj4gZm9yIGJsb2NrIGluIHMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpOgogICAgIC4uLiAgICAgcHJpbnQgImFbJWRdIGFuZCBiWyVkXSBtYXRjaCBmb3IgJWQgZWxlbWVudHMiICUgYmxvY2sKICAgICBhWzBdIGFuZCBiWzBdIG1hdGNoIGZvciA4IGVsZW1lbnRzCi0gICAgYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDYgZWxlbWVudHMKLSAgICBhWzE0XSBhbmQgYlsyM10gbWF0Y2ggZm9yIDE1IGVsZW1lbnRzCisgICAgYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDIxIGVsZW1lbnRzCiAgICAgYVsyOV0gYW5kIGJbMzhdIG1hdGNoIGZvciAwIGVsZW1lbnRzCiAKICAgICBOb3RlIHRoYXQgdGhlIGxhc3QgdHVwbGUgcmV0dXJuZWQgYnkgLmdldF9tYXRjaGluZ19ibG9ja3MoKSBpcyBhbHdheXMgYQpAQCAtMTAxLDggKzEwMCw3IEBACiAgICAgLi4uICAgICBwcmludCAiJTZzIGFbJWQ6JWRdIGJbJWQ6JWRdIiAlIG9wY29kZQogICAgICBlcXVhbCBhWzA6OF0gYlswOjhdCiAgICAgaW5zZXJ0IGFbODo4XSBiWzg6MTddCi0gICAgIGVxdWFsIGFbODoxNF0gYlsxNzoyM10KLSAgICAgZXF1YWwgYVsxNDoyOV0gYlsyMzozOF0KKyAgICAgZXF1YWwgYVs4OjI5XSBiWzE3OjM4XQogCiAgICAgU2VlIHRoZSBEaWZmZXIgY2xhc3MgZm9yIGEgZmFuY3kgaHVtYW4tZnJpZW5kbHkgZmlsZSBkaWZmZXJlbmNlciwgd2hpY2gKICAgICB1c2VzIFNlcXVlbmNlTWF0Y2hlciBib3RoIHRvIGNvbXBhcmUgc2VxdWVuY2VzIG9mIGxpbmVzLCBhbmQgdG8gY29tcGFyZQpAQCAtNDYxLDcgKzQ1OSwxMSBAQAogCiAgICAgICAgIEVhY2ggdHJpcGxlIGlzIG9mIHRoZSBmb3JtIChpLCBqLCBuKSwgYW5kIG1lYW5zIHRoYXQKICAgICAgICAgYVtpOmkrbl0gPT0gYltqOmorbl0uICBUaGUgdHJpcGxlcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGluCi0gICAgICAgIGkgYW5kIGluIGouCisgICAgICAgIGkgYW5kIGluIGouICBOZXcgaW4gUHl0aG9uIDIuNSwgaXQncyBhbHNvIGd1YXJhbnRlZWQgdGhhdCBpZgorICAgICAgICAoaSwgaiwgbikgYW5kIChpJywgaicsIG4nKSBhcmUgYWRqYWNlbnQgdHJpcGxlcyBpbiB0aGUgbGlzdCwgYW5kCisgICAgICAgIHRoZSBzZWNvbmQgaXMgbm90IHRoZSBsYXN0IHRyaXBsZSBpbiB0aGUgbGlzdCwgdGhlbiBpK24gIT0gaScgb3IKKyAgICAgICAgaituICE9IGonLiAgSU9XLCBhZGphY2VudCB0cmlwbGVzIG5ldmVyIGRlc2NyaWJlIGFkamFjZW50IGVxdWFsCisgICAgICAgIGJsb2Nrcy4KIAogICAgICAgICBUaGUgbGFzdCB0cmlwbGUgaXMgYSBkdW1teSwgKGxlbihhKSwgbGVuKGIpLCAwKSwgYW5kIGlzIHRoZSBvbmx5CiAgICAgICAgIHRyaXBsZSB3aXRoIG49PTAuCkBAIC00NzUsMjggKzQ3Nyw1MiBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hpbmdfYmxvY2tzCiAgICAgICAgIGxhLCBsYiA9IGxlbihzZWxmLmEpLCBsZW4oc2VsZi5iKQogCi0gICAgICAgIGluZGV4ZWRfYmxvY2tzID0gW10KKyAgICAgICAgIyBUaGlzIGlzIG1vc3QgbmF0dXJhbGx5IGV4cHJlc3NlZCBhcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0sIGJ1dAorICAgICAgICAjIGF0IGxlYXN0IG9uZSB1c2VyIGJ1bXBlZCBpbnRvIGV4dHJlbWUgdXNlIGNhc2VzIHRoYXQgZXhjZWVkZWQKKyAgICAgICAgIyB0aGUgcmVjdXJzaW9uIGxpbWl0IG9uIHRoZWlyIGJveC4gIFNvLCBub3cgd2UgbWFpbnRhaW4gYSBsaXN0CisgICAgICAgICMgKCdxdWV1ZWApIG9mIGJsb2NrcyB3ZSBzdGlsbCBuZWVkIHRvIGxvb2sgYXQsIGFuZCBhcHBlbmQgcGFydGlhbAorICAgICAgICAjIHJlc3VsdHMgdG8gYG1hdGNoaW5nX2Jsb2Nrc2AgaW4gYSBsb29wOyB0aGUgbWF0Y2hlcyBhcmUgc29ydGVkCisgICAgICAgICMgYXQgdGhlIGVuZC4KICAgICAgICAgcXVldWUgPSBbKDAsIGxhLCAwLCBsYildCisgICAgICAgIG1hdGNoaW5nX2Jsb2NrcyA9IFtdCiAgICAgICAgIHdoaWxlIHF1ZXVlOgotICAgICAgICAgICAgIyBidWlsZHMgbGlzdCBvZiBtYXRjaGluZyBibG9ja3MgY292ZXJpbmcgYVthbG86YWhpXSBhbmQKLSAgICAgICAgICAgICMgYltibG86YmhpXSwgYXBwZW5kaW5nIHRoZW0gaW4gaW5jcmVhc2luZyBvcmRlciB0byBhbnN3ZXIKICAgICAgICAgICAgIGFsbywgYWhpLCBibG8sIGJoaSA9IHF1ZXVlLnBvcCgpCi0KKyAgICAgICAgICAgIGksIGosIGsgPSB4ID0gc2VsZi5maW5kX2xvbmdlc3RfbWF0Y2goYWxvLCBhaGksIGJsbywgYmhpKQogICAgICAgICAgICAgIyBhW2FsbzppXSB2cyBiW2JsbzpqXSB1bmtub3duCiAgICAgICAgICAgICAjIGFbaTppK2tdIHNhbWUgYXMgYltqOmora10KICAgICAgICAgICAgICMgYVtpK2s6YWhpXSB2cyBiW2orazpiaGldIHVua25vd24KLSAgICAgICAgICAgIGksIGosIGsgPSB4ID0gc2VsZi5maW5kX2xvbmdlc3RfbWF0Y2goYWxvLCBhaGksIGJsbywgYmhpKQotCi0gICAgICAgICAgICBpZiBrOgorICAgICAgICAgICAgaWYgazogICAjIGlmIGsgaXMgMCwgdGhlcmUgd2FzIG5vIG1hdGNoaW5nIGJsb2NrCisgICAgICAgICAgICAgICAgbWF0Y2hpbmdfYmxvY2tzLmFwcGVuZCh4KQogICAgICAgICAgICAgICAgIGlmIGFsbyA8IGkgYW5kIGJsbyA8IGo6CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoYWxvLCBpLCBibG8sIGopKQotICAgICAgICAgICAgICAgIGluZGV4ZWRfYmxvY2tzLmFwcGVuZCgoaSwgeCkpCiAgICAgICAgICAgICAgICAgaWYgaStrIDwgYWhpIGFuZCBqK2sgPCBiaGk6CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoaStrLCBhaGksIGoraywgYmhpKSkKLSAgICAgICAgaW5kZXhlZF9ibG9ja3Muc29ydCgpCisgICAgICAgIG1hdGNoaW5nX2Jsb2Nrcy5zb3J0KCkKIAotICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IFtlbGVtWzFdIGZvciBlbGVtIGluIGluZGV4ZWRfYmxvY2tzXQotICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2Nrcy5hcHBlbmQoIChsYSwgbGIsIDApICkKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhZGphY2VudCBlcXVhbCBibG9ja3MgaW4gdGhlCisgICAgICAgICMgbWF0Y2hpbmdfYmxvY2tzIGxpc3Qgbm93LiAgU3RhcnRpbmcgd2l0aCAyLjUsIHRoaXMgY29kZSB3YXMgYWRkZWQKKyAgICAgICAgIyB0byBjb2xsYXBzZSB0aGVtLgorICAgICAgICBpMSA9IGoxID0gazEgPSAwCisgICAgICAgIG5vbl9hZGphY2VudCA9IFtdCisgICAgICAgIGZvciBpMiwgajIsIGsyIGluIG1hdGNoaW5nX2Jsb2NrczoKKyAgICAgICAgICAgICMgSXMgdGhpcyBibG9jayBhZGphY2VudCB0byBpMSwgajEsIGsxPworICAgICAgICAgICAgaWYgaTEgKyBrMSA9PSBpMiBhbmQgajEgKyBrMSA9PSBqMjoKKyAgICAgICAgICAgICAgICAjIFllcywgc28gY29sbGFwc2UgdGhlbSAtLSB0aGlzIGp1c3QgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICAgICAgICAjIHRoZSBmaXJzdCBibG9jayBieSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQsIGFuZCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAjIGJsb2NrIHNvIGxlbmd0aGVuZWQgcmVtYWlucyB0aGUgYmxvY2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICAgICAgICAgIGsxICs9IGsyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm90IGFkamFjZW50LiAgUmVtZW1iZXIgdGhlIGZpcnN0IGJsb2NrIChrMT09MCBtZWFucyBpdCdzCisgICAgICAgICAgICAgICAgIyB0aGUgZHVtbXkgd2Ugc3RhcnRlZCB3aXRoKSwgYW5kIG1ha2UgdGhlIHNlY29uZCBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAjIG5ldyBibG9jayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAgICAgICAgaWYgazE6CisgICAgICAgICAgICAgICAgICAgIG5vbl9hZGphY2VudC5hcHBlbmQoKGkxLCBqMSwgazEpKQorICAgICAgICAgICAgICAgIGkxLCBqMSwgazEgPSBpMiwgajIsIGsyCisgICAgICAgIGlmIGsxOgorICAgICAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCgoaTEsIGoxLCBrMSkpCisKKyAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCggKGxhLCBsYiwgMCkgKQorICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IG5vbl9hZGphY2VudAogICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGluZ19ibG9ja3MKIAogICAgIGRlZiBnZXRfb3Bjb2RlcyhzZWxmKToKQEAgLTE0MjIsOCArMTQ0OCw3IEBACiAgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nIC09IDEKICAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9saW5lKGxpbmVzLCctJywwKSwgTm9uZSwgVHJ1ZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLS0/KycpIG9yIHMuc3RhcnRzd2l0aCgnLS0rJykgb3IgXAotICAgICAgICAgICAgICAgICBzLnN0YXJ0c3dpdGgoJy0gJyk6CisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgoJy0tPysnLCAnLS0rJywgJy0gJykpOgogICAgICAgICAgICAgICAgICMgaW4gZGVsZXRlIGJsb2NrIGFuZCBzZWUgYSBpbnRyYWxpbmUgY2hhbmdlIG9yIHVuY2hhbmdlZCBsaW5lCiAgICAgICAgICAgICAgICAgIyBjb21pbmc6IHlpZWxkIHRoZSBkZWxldGUgbGluZSBhbmQgdGhlbiBibGFua3MKICAgICAgICAgICAgICAgICBmcm9tX2xpbmUsdG9fbGluZSA9IF9tYWtlX2xpbmUobGluZXMsJy0nLDApLCBOb25lCkBAIC0xNDQ3LDcgKzE0NzIsNyBAQAogICAgICAgICAgICAgICAgIG51bV9ibGFua3NfcGVuZGluZyArPSAxCiAgICAgICAgICAgICAgICAgeWllbGQgTm9uZSwgX21ha2VfbGluZShsaW5lcywnKycsMSksIFRydWUKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJysgJykgb3Igcy5zdGFydHN3aXRoKCcrLScpOgorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoKCcrICcsICcrLScpKToKICAgICAgICAgICAgICAgICAjIHdpbGwgYmUgbGVhdmluZyBhbiBhZGQgYmxvY2s6IHlpZWxkIGJsYW5rcyB0aGVuIGFkZCBsaW5lCiAgICAgICAgICAgICAgICAgZnJvbV9saW5lLCB0b19saW5lID0gTm9uZSwgX21ha2VfbGluZShsaW5lcywnKycsMSkKICAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3RvX3lpZWxkLG51bV9ibGFua3NfcGVuZGluZyA9IG51bV9ibGFua3NfcGVuZGluZysxLDAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkgYi9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5CmluZGV4IGExZGJiNGIuLjljNjBlNTQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weQpAQCAtMTIsNCArMTIsNiBAQAogCiBfX3JldmlzaW9uX18gPSAiJElkJCIKIAotX192ZXJzaW9uX18gPSAiMi40LjAiCitpbXBvcnQgc3lzCitfX3ZlcnNpb25fXyA9ICIlZC4lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzozXQorZGVsIHN5cwpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKaW5kZXggNzM4ZTNmNy4uNWIwOTk2NSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5CkBAIC00NjcsNyArNDY3LDggQEAKIAogICAgICAgICAjIHJwbSBzY3JpcHRzCiAgICAgICAgICMgZmlndXJlIG91dCBkZWZhdWx0IGJ1aWxkIHNjcmlwdAotICAgICAgICBkZWZfYnVpbGQgPSAiJXMgc2V0dXAucHkgYnVpbGQiICUgc2VsZi5weXRob24KKyAgICAgICAgZGVmX3NldHVwX2NhbGwgPSAiJXMgJXMiICUgKHNlbGYucHl0aG9uLG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pKQorICAgICAgICBkZWZfYnVpbGQgPSAiJXMgYnVpbGQiICUgZGVmX3NldHVwX2NhbGwKICAgICAgICAgaWYgc2VsZi51c2VfcnBtX29wdF9mbGFnczoKICAgICAgICAgICAgIGRlZl9idWlsZCA9ICdlbnYgQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgJyArIGRlZl9idWlsZAogCkBAIC00ODEsOSArNDgyLDkgQEAKICAgICAgICAgICAgICgncHJlcCcsICdwcmVwX3NjcmlwdCcsICIlc2V0dXAiKSwKICAgICAgICAgICAgICgnYnVpbGQnLCAnYnVpbGRfc2NyaXB0JywgZGVmX2J1aWxkKSwKICAgICAgICAgICAgICgnaW5zdGFsbCcsICdpbnN0YWxsX3NjcmlwdCcsCi0gICAgICAgICAgICAgKCIlcyBzZXR1cC5weSBpbnN0YWxsICIKKyAgICAgICAgICAgICAoIiVzIGluc3RhbGwgIgogICAgICAgICAgICAgICAiLS1yb290PSRSUE1fQlVJTERfUk9PVCAiCi0gICAgICAgICAgICAgICItLXJlY29yZD1JTlNUQUxMRURfRklMRVMiKSAlIHNlbGYucHl0aG9uKSwKKyAgICAgICAgICAgICAgIi0tcmVjb3JkPUlOU1RBTExFRF9GSUxFUyIpICUgZGVmX3NldHVwX2NhbGwpLAogICAgICAgICAgICAgKCdjbGVhbicsICdjbGVhbl9zY3JpcHQnLCAicm0gLXJmICRSUE1fQlVJTERfUk9PVCIpLAogICAgICAgICAgICAgKCd2ZXJpZnlzY3JpcHQnLCAndmVyaWZ5X3NjcmlwdCcsIE5vbmUpLAogICAgICAgICAgICAgKCdwcmUnLCAncHJlX2luc3RhbGwnLCBOb25lKSwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CmluZGV4IDRhOWVkMzkuLjY3YmEwODAgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICAgICAgICBodHRwLmVuZGhlYWRlcnMoKQogICAgICAgICAgICAgaHR0cC5zZW5kKGJvZHkpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmFubm91bmNlKGUubXNnLCBsb2cuRVJST1IpCisgICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgciA9IGh0dHAuZ2V0cmVzcG9uc2UoKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQppbmRleCBkMjRkMGFjLi4wZDcyODM3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQpAQCAtMTMxLDggKzEzMSwxMCBAQAogICAgICAgICAgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtTREtEaXIiLCBuZXQsICJzZGtpbnN0YWxscm9vdCIpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXhjOiAjCiAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCi0gICAgICAgICAgICAgICAgICAoIlRoZSAuTkVUIEZyYW1ld29yayBTREsgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSAiCi0gICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIGV4dGVuc2lvbnMgZm9yIFB5dGhvbi4iKQorICAgICAgICAgICAgICAgICAgKCIiIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDM7CitleHRlbnNpb25zIG11c3QgYmUgYnVpbHQgd2l0aCBhIGNvbXBpbGVyIHRoYW4gY2FuIGdlbmVyYXRlIGNvbXBhdGlibGUgYmluYXJpZXMuCitWaXN1YWwgU3R1ZGlvIDIwMDMgd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHN5c3RlbS4gSWYgeW91IGhhdmUgQ3lnd2luIGluc3RhbGxlZCwKK3lvdSBjYW4gdHJ5IGNvbXBpbGluZyB3aXRoIE1pbmdXMzIsIGJ5IHBhc3NpbmcgIi1jIG1pbmd3MzIiIHRvIHNldHVwLnB5LiIiIikKIAogICAgICAgICBwID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcTkVUIEZyYW1ld29yayBTZXR1cFxQcm9kdWN0IgogICAgICAgICBmb3IgYmFzZSBpbiBIS0VZUzoKQEAgLTIzNyw3ICsyMzksNyBAQAogCiAgICAgZGVmIGluaXRpYWxpemUoc2VsZik6CiAgICAgICAgIHNlbGYuX19wYXRocyA9IFtdCi0gICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiTVNTZGsiKSBhbmQgc2VsZi5maW5kX2V4ZSgiY2wuZXhlIik6CisgICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiRElTVFVUSUxTX1VTRV9TREsiKSBhbmQgb3MuZW52aXJvbi5oYXNfa2V5KCJNU1NkayIpIGFuZCBzZWxmLmZpbmRfZXhlKCJjbC5leGUiKToKICAgICAgICAgICAgICMgQXNzdW1lIHRoYXQgdGhlIFNESyBzZXQgdXAgZXZlcnl0aGluZyBhbHJpZ2h0OyBkb24ndCB0cnkgdG8gYmUKICAgICAgICAgICAgICMgc21hcnRlcgogICAgICAgICAgICAgc2VsZi5jYyA9ICJjbC5leGUiCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IGUxMzk3YTEuLjc2ZmUyNTYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC01MTIsNyArNTEyLDcgQEAKICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJyk6CiAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2tleV0KICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWlzeXNyb290IFteIFx0XSogJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzW2tleV0gPSBmbGFncwogCiAgICAgaWYgYXJnczoKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQppbmRleCAzMjQ4MTlkLi42Y2QxNGY3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CkBAIC03OCw3ICs3OCw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGluZGV4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1pc3lzcm9vdCcpCiAgICAgICAgICAgICAjIFN0cmlwIHRoaXMgYXJndW1lbnQgYW5kIHRoZSBuZXh0IG9uZToKLSAgICAgICAgICAgIGRlbCBjb21waWxlcl9zb1tpbmRleDppbmRleCsxXQorICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzJdCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDQ3YjNhYWUuLmZlNzM0YjMgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC05NSw3ICs5NSw3IEBACiAKIGltcG9ydCBfX2Z1dHVyZV9fCiAKLWltcG9ydCBzeXMsIHRyYWNlYmFjaywgaW5zcGVjdCwgbGluZWNhY2hlLCBvcywgcmUsIHR5cGVzCitpbXBvcnQgc3lzLCB0cmFjZWJhY2ssIGluc3BlY3QsIGxpbmVjYWNoZSwgb3MsIHJlCiBpbXBvcnQgdW5pdHRlc3QsIGRpZmZsaWIsIHBkYiwgdGVtcGZpbGUKIGltcG9ydCB3YXJuaW5ncwogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KQEAgLTgyMSw2ICs4MjEsMTEgQEAKICAgICAgICAgIyBSZWN1cnNpdmVseSBleHBvcmUgYG9iamAsIGV4dHJhY3RpbmcgRG9jVGVzdHMuCiAgICAgICAgIHRlc3RzID0gW10KICAgICAgICAgc2VsZi5fZmluZCh0ZXN0cywgb2JqLCBuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywgZ2xvYnMsIHt9KQorICAgICAgICAjIFNvcnQgdGhlIHRlc3RzIGJ5IGFscGhhIG9yZGVyIG9mIG5hbWVzLCBmb3IgY29uc2lzdGVuY3kgaW4KKyAgICAgICAgIyB2ZXJib3NlLW1vZGUgb3V0cHV0LiAgVGhpcyB3YXMgYSBmZWF0dXJlIG9mIGRvY3Rlc3QgaW4gUHl0aG9ucworICAgICAgICAjIDw9IDIuMyB0aGF0IGdvdCBsb3N0IGJ5IGFjY2lkZW50IGluIDIuNC4gIEl0IHdhcyByZXBhaXJlZCBpbgorICAgICAgICAjIDIuNC40IGFuZCAyLjUuCisgICAgICAgIHRlc3RzLnNvcnQoKQogICAgICAgICByZXR1cm4gdGVzdHMKIAogICAgIGRlZiBfZnJvbV9tb2R1bGUoc2VsZiwgbW9kdWxlLCBvYmplY3QpOgpkaWZmIC0tZ2l0IGEvTGliL2R1bW15X3RocmVhZC5weSBiL0xpYi9kdW1teV90aHJlYWQucHkKaW5kZXggMjFmZDAzZi4uYTcyYzkyNyAxMDA2NDQKLS0tIGEvTGliL2R1bW15X3RocmVhZC5weQorKysgYi9MaWIvZHVtbXlfdGhyZWFkLnB5CkBAIC0yMCw2ICsyMCw3IEBACiAgICAgICAgICAgICdpbnRlcnJ1cHRfbWFpbicsICdMb2NrVHlwZSddCiAKIGltcG9ydCB0cmFjZWJhY2sgYXMgX3RyYWNlYmFjaworaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIGVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLmVycm9yLiIiIgpAQCAtNzUsNiArNzYsMTIgQEAKICAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuYWxsb2NhdGVfbG9jaygpLiIiIgogICAgIHJldHVybiBMb2NrVHlwZSgpCiAKK2RlZiBzdGFja19zaXplKHNpemU9Tm9uZSk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLnN0YWNrX3NpemUoKS4iIiIKKyAgICBpZiBzaXplIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBlcnJvcigic2V0dGluZyB0aHJlYWQgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIikKKyAgICByZXR1cm4gMAorCiBjbGFzcyBMb2NrVHlwZShvYmplY3QpOgogICAgICIiIkNsYXNzIGltcGxlbWVudGluZyBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuTG9ja1R5cGUuCiAKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQppbmRleCBmMDEyNjBmLi44ZDIzMGZkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX19pbml0X18ucHkKKysrIGIvTGliL2VtYWlsL19faW5pdF9fLnB5CkBAIC00LDcgKzQsNyBAQAogCiAiIiJBIHBhY2thZ2UgZm9yIHBhcnNpbmcsIGhhbmRsaW5nLCBhbmQgZ2VuZXJhdGluZyBlbWFpbCBtZXNzYWdlcy4iIiIKIAotX192ZXJzaW9uX18gPSAnNC4wYTInCitfX3ZlcnNpb25fXyA9ICc0LjAuMScKIAogX19hbGxfXyA9IFsKICAgICAjIE9sZCBuYW1lcwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21lc3NhZ2UucHkgYi9MaWIvZW1haWwvbWVzc2FnZS5weQppbmRleCA1MGQ5MGI0Li43OWM1YzRjIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvbWVzc2FnZS5weQorKysgYi9MaWIvZW1haWwvbWVzc2FnZS5weQpAQCAtNzQ3LDcgKzc0NywxOCBAQAogICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIHR1cGxlKToKICAgICAgICAgICAgICMgUkZDIDIyMzEgZW5jb2RlZCwgc28gZGVjb2RlIGl0LCBhbmQgaXQgYmV0dGVyIGVuZCB1cCBhcyBhc2NpaS4KICAgICAgICAgICAgIHBjaGFyc2V0ID0gY2hhcnNldFswXSBvciAndXMtYXNjaWknCi0gICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0WzJdLCBwY2hhcnNldCkuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBMb29rdXBFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2hhcnNldCBpc24ndCBrbm93biB0bworICAgICAgICAgICAgICAgICMgUHl0aG9uLiAgVW5pY29kZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBlbmNvZGVkIHRleHQKKyAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgY2hhcmFjdGVyIG5vdCBpbiB0aGUgY2hhcnNldC4KKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0WzJdLCBwY2hhcnNldCkuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgICAgICBleGNlcHQgKExvb2t1cEVycm9yLCBVbmljb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0WzJdCisgICAgICAgICMgY2hhcnNldCBjaGFyYWN0ZXIgbXVzdCBiZSBpbiB1cy1hc2NpaSByYW5nZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0LCAndXMtYXNjaWknKS5lbmNvZGUoJ3VzLWFzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCiAgICAgICAgICMgUkZDIDIwNDYsICQ0LjEuMiBzYXlzIGNoYXJzZXRzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUKICAgICAgICAgcmV0dXJuIGNoYXJzZXQubG93ZXIoKQogCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQppbmRleCBhMTk3YTM2Li4xMzgwMWRjIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKQEAgLTMwMDUsMjYgKzMwMDUsNjcgQEAKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdOQU1FJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUsICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJhbSwKKyAgICAgICAgICAgICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWUoc2VsZik6CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWVfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjA9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CiBcdGZpbGVuYW1lKjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKIFx0ZmlsZW5hbWUqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzIGl0IG5vdC5wZGYnKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2JvdW5kYXJ5KHNlbGYpOgogICAgICAgICBtID0gJycnXAogQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Ci1cdGJvdW5kYXJ5KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKLVx0Ym91bmRhcnkqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCkBAIC0zMDM2LDggKzMwNzcsOCBAQAogICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Ci1cdGNoYXJzZXQqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOwotXHRjaGFyc2V0KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgogCiAnJycKQEAgLTMwNDUsMTUgKzMwODYsMTQ1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJib2d1cyd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9Ym9ndXMnJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFzY2lpJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImFzY2lpJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjIqPSJpcyBpdCBub3QucGRmJUUyIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKwogICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKICAgICAgICAgbSA9ICIiIlwKIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKLUNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqMD1YLVVOS05PV04nJ215ZmlsZS50eHQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAogCiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19leHRlbmRlZF92YWx1ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZT1cIkZyYW5rJ3MgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCduYW1lJyksICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZW5jb2RlZF90aGVuX3VuZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3VuZW5jb2RlZF90aGVuX2VuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxKj1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCiAKIAwKIGRlZiBfdGVzdGNsYXNzZXMoKToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQppbmRleCA5NWQwNmNiLi4zMGYzOWI5IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0zMDExLDI2ICszMDExLDY3IEBACiAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnTkFNRScpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBOb25lLCAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCdOQU1FJykKKyAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyYW0sCisgICAgICAgICAgICAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBtID0gJycnXAogQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lX2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOwogXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CiBcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCiAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpcyBpdCBub3QucGRmJykKIAogICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9ib3VuZGFyeShzZWxmKToKICAgICAgICAgbSA9ICcnJ1wKIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOwotXHRib3VuZGFyeSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7Ci1cdGJvdW5kYXJ5KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGJvdW5kYXJ5KjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Ym91bmRhcnkqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGJvdW5kYXJ5KjI9ImlzIGl0IG5vdC5wZGYiCiAKICcnJwpAQCAtMzA0Miw4ICszMDgzLDggQEAKICAgICAgICAgIyBUaGlzIGlzIGEgbm9uc2Vuc2ljYWwgY2hhcnNldCB2YWx1ZSwgYnV0IHRlc3RzIHRoZSBjb2RlIGFueXdheQogICAgICAgICBtID0gJycnXAogQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOwotXHRjaGFyc2V0KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKLVx0Y2hhcnNldCoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRjaGFyc2V0KjAqPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGNoYXJzZXQqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGNoYXJzZXQqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCkBAIC0zMDUxLDE1ICszMDkyLDE0NSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKIAorICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYm9ndXMneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWJvZ3VzJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hc2NpaScndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJhc2NpaSd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyKj0iaXMgaXQgbm90LnBkZiVFMiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZlx1ZmZmZCcpCisKICAgICBkZWYgdGVzdF9yZmMyMjMxX3Vua25vd25fZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIG0gPSAiIiJcCiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0Ci1Db250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKjA9WC1VTktOT1dOJydteWZpbGUudHh0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKj1YLVVOS05PV04nJ215ZmlsZS50eHQKIAogIiIiCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKIAorICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cIkZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsIE5vbmUpCisgICAgICAgIGVxKGxhbmd1YWdlLCBOb25lKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3NpbmdsZV90aWNrX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZSowPVwiRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2tfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287IG5hbWU9XCJGcmFuaydzIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnbmFtZScpLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2VuY29kZWRfdGhlbl91bmVuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMT1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV91bmVuY29kZWRfdGhlbl9lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMSo9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKwogCiAMCiBkZWYgX3Rlc3RjbGFzc2VzKCk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdXRpbHMucHkgYi9MaWIvZW1haWwvdXRpbHMucHkKaW5kZXggMjUwZWIxOS4uMjZlYmIwZSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3V0aWxzLnB5CisrKyBiL0xpYi9lbWFpbC91dGlscy5weQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGJhc2U2NAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHNvY2tldAoraW1wb3J0IHVybGxpYgogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIApAQCAtNDUsNiArNDYsNyBAQAogRU1QVFlTVFJJTkcgPSAnJwogVUVNUFRZU1RSSU5HID0gdScnCiBDUkxGID0gJ1xyXG4nCitUSUNLID0gIiciCiAKIHNwZWNpYWxzcmUgPSByZS5jb21waWxlKHInW11bXFwoKTw+QCw6OyIuXScpCiBlc2NhcGVzcmUgPSByZS5jb21waWxlKHInW11bXFwoKSJdJykKQEAgLTIzMCwxMiArMjMyLDE0IEBACiAjIFJGQzIyMzEtcmVsYXRlZCBmdW5jdGlvbnMgLSBwYXJhbWV0ZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nCiBkZWYgZGVjb2RlX3JmYzIyMzEocyk6CiAgICAgIiIiRGVjb2RlIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDIDIyMzEiIiIKLSAgICBpbXBvcnQgdXJsbGliCi0gICAgcGFydHMgPSBzLnNwbGl0KCInIiwgMikKLSAgICBpZiBsZW4ocGFydHMpID09IDE6Ci0gICAgICAgIHJldHVybiBOb25lLCBOb25lLCB1cmxsaWIudW5xdW90ZShzKQotICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gcGFydHMKLSAgICByZXR1cm4gY2hhcnNldCwgbGFuZ3VhZ2UsIHVybGxpYi51bnF1b3RlKHMpCisgICAgcGFydHMgPSBzLnNwbGl0KFRJQ0ssIDIpCisgICAgaWYgbGVuKHBhcnRzKSA8PSAyOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgcworICAgIGlmIGxlbihwYXJ0cykgPiAzOgorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSA9IHBhcnRzWzoyXQorICAgICAgICBzID0gVElDSy5qb2luKHBhcnRzWzI6XSkKKyAgICAgICAgcmV0dXJuIGNoYXJzZXQsIGxhbmd1YWdlLCBzCisgICAgcmV0dXJuIHBhcnRzCiAKIAogZGVmIGVuY29kZV9yZmMyMjMxKHMsIGNoYXJzZXQ9Tm9uZSwgbGFuZ3VhZ2U9Tm9uZSk6CkBAIC0yNTksMzcgKzI2Myw1NCBAQAogZGVmIGRlY29kZV9wYXJhbXMocGFyYW1zKToKICAgICAiIiJEZWNvZGUgcGFyYW1ldGVycyBsaXN0IGFjY29yZGluZyB0byBSRkMgMjIzMS4KIAotICAgIHBhcmFtcyBpcyBhIHNlcXVlbmNlIG9mIDItdHVwbGVzIGNvbnRhaW5pbmcgKGNvbnRlbnQgdHlwZSwgc3RyaW5nIHZhbHVlKS4KKyAgICBwYXJhbXMgaXMgYSBzZXF1ZW5jZSBvZiAyLXR1cGxlcyBjb250YWluaW5nIChwYXJhbSBuYW1lLCBzdHJpbmcgdmFsdWUpLgogICAgICIiIgorICAgICMgQ29weSBwYXJhbXMgc28gd2UgZG9uJ3QgbWVzcyB3aXRoIHRoZSBvcmlnaW5hbAorICAgIHBhcmFtcyA9IHBhcmFtc1s6XQogICAgIG5ld19wYXJhbXMgPSBbXQotICAgICMgbWFwcyBwYXJhbWV0ZXIncyBuYW1lIHRvIGEgbGlzdCBvZiBjb250aW51YXRpb25zCisgICAgIyBNYXAgcGFyYW1ldGVyJ3MgbmFtZSB0byBhIGxpc3Qgb2YgY29udGludWF0aW9ucy4gIFRoZSB2YWx1ZXMgYXJlIGEKKyAgICAjIDMtdHVwbGUgb2YgdGhlIGNvbnRpbnVhdGlvbiBudW1iZXIsIHRoZSBzdHJpbmcgdmFsdWUsIGFuZCBhIGZsYWcKKyAgICAjIHNwZWNpZnlpbmcgd2hldGhlciBhIHBhcnRpY3VsYXIgc2VnbWVudCBpcyAlLWVuY29kZWQuCiAgICAgcmZjMjIzMV9wYXJhbXMgPSB7fQotICAgICMgcGFyYW1zIGlzIGEgc2VxdWVuY2Ugb2YgMi10dXBsZXMgY29udGFpbmluZyAoY29udGVudF90eXBlLCBzdHJpbmcgdmFsdWUpCi0gICAgbmFtZSwgdmFsdWUgPSBwYXJhbXNbMF0KKyAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtcy5wb3AoMCkKICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsdWUpKQotICAgICMgQ3ljbGUgdGhyb3VnaCBlYWNoIG9mIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLgotICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBwYXJhbXNbMTpdOgorICAgIHdoaWxlIHBhcmFtczoKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBwYXJhbXMucG9wKDApCisgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJyonKToKKyAgICAgICAgICAgIGVuY29kZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVkID0gRmFsc2UKICAgICAgICAgdmFsdWUgPSB1bnF1b3RlKHZhbHVlKQogICAgICAgICBtbyA9IHJmYzIyMzFfY29udGludWF0aW9uLm1hdGNoKG5hbWUpCiAgICAgICAgIGlmIG1vOgogICAgICAgICAgICAgbmFtZSwgbnVtID0gbW8uZ3JvdXAoJ25hbWUnLCAnbnVtJykKICAgICAgICAgICAgIGlmIG51bSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBudW0gPSBpbnQobnVtKQotICAgICAgICAgICAgcmZjMjIzMV9wYXJhbTEgPSByZmMyMjMxX3BhcmFtcy5zZXRkZWZhdWx0KG5hbWUsIFtdKQotICAgICAgICAgICAgcmZjMjIzMV9wYXJhbTEuYXBwZW5kKChudW0sIHZhbHVlKSkKKyAgICAgICAgICAgIHJmYzIyMzFfcGFyYW1zLnNldGRlZmF1bHQobmFtZSwgW10pLmFwcGVuZCgobnVtLCB2YWx1ZSwgZW5jb2RlZCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgcXVvdGUodmFsdWUpKSkKICAgICBpZiByZmMyMjMxX3BhcmFtczoKICAgICAgICAgZm9yIG5hbWUsIGNvbnRpbnVhdGlvbnMgaW4gcmZjMjIzMV9wYXJhbXMuaXRlbXMoKToKICAgICAgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgICAgIGV4dGVuZGVkID0gRmFsc2UKICAgICAgICAgICAgICMgU29ydCBieSBudW1iZXIKICAgICAgICAgICAgIGNvbnRpbnVhdGlvbnMuc29ydCgpCi0gICAgICAgICAgICAjIEFuZCBub3cgYXBwZW5kIGFsbCB2YWx1ZXMgaW4gbnVtIG9yZGVyCi0gICAgICAgICAgICBmb3IgbnVtLCBjb250aW51YXRpb24gaW4gY29udGludWF0aW9uczoKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY29udGludWF0aW9uKQotICAgICAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHZhbHVlID0gZGVjb2RlX3JmYzIyMzEoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCi0gICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSBxdW90ZSh2YWx1ZSkpKSkKKyAgICAgICAgICAgICMgQW5kIG5vdyBhcHBlbmQgYWxsIHZhbHVlcyBpbiBudW1lcmljYWwgb3JkZXIsIGNvbnZlcnRpbmcKKyAgICAgICAgICAgICMgJS1lbmNvZGluZ3MgZm9yIHRoZSBlbmNvZGVkIHNlZ21lbnRzLiAgSWYgYW55IG9mIHRoZQorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbmFtZXMgZW5kcyBpbiBhICosIHRoZW4gdGhlIGVudGlyZSBzdHJpbmcsIGFmdGVyCisgICAgICAgICAgICAjIGRlY29kaW5nIHNlZ21lbnRzIGFuZCBjb25jYXRlbmF0aW5nLCBtdXN0IGhhdmUgdGhlIGNoYXJzZXQgYW5kCisgICAgICAgICAgICAjIGxhbmd1YWdlIHNwZWNpZmllcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgZm9yIG51bSwgcywgZW5jb2RlZCBpbiBjb250aW51YXRpb25zOgorICAgICAgICAgICAgICAgIGlmIGVuY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSB1cmxsaWIudW5xdW90ZShzKQorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQocykKKyAgICAgICAgICAgIHZhbHVlID0gcXVvdGUoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCisgICAgICAgICAgICBpZiBleHRlbmRlZDoKKyAgICAgICAgICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUgPSBkZWNvZGVfcmZjMjIzMSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSB2YWx1ZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgdmFsdWUpKQogICAgIHJldHVybiBuZXdfcGFyYW1zCiAKIGRlZiBjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKHZhbHVlLCBlcnJvcnM9J3JlcGxhY2UnLApkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9tYmNzLnB5IGIvTGliL2VuY29kaW5ncy9tYmNzLnB5CmluZGV4IGZmNzdmZGUuLmJhZjQ2Y2IgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvbWJjcy5weQorKysgYi9MaWIvZW5jb2RpbmdzL21iY3MucHkKQEAgLTcsNDIgKzcsMzkgQEAKIChjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCiAKICIiIgorIyBJbXBvcnQgdGhlbSBleHBsaWNpdGx5IHRvIGNhdXNlIGFuIEltcG9ydEVycm9yCisjIG9uIG5vbi1XaW5kb3dzIHN5c3RlbXMKK2Zyb20gY29kZWNzIGltcG9ydCBtYmNzX2VuY29kZSwgbWJjc19kZWNvZGUKKyMgZm9yIEluY3JlbWVudGFsRGVjb2RlciwgSW5jcmVtZW50YWxFbmNvZGVyLCAuLi4KIGltcG9ydCBjb2RlY3MKIAogIyMjIENvZGVjIEFQSXMKIAotY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKK2VuY29kZSA9IG1iY3NfZW5jb2RlCiAKLSAgICAjIE5vdGU6IEJpbmRpbmcgdGhlc2UgYXMgQyBmdW5jdGlvbnMgd2lsbCByZXN1bHQgaW4gdGhlIGNsYXNzIG5vdAotICAgICMgY29udmVydGluZyB0aGVtIHRvIG1ldGhvZHMuIFRoaXMgaXMgaW50ZW5kZWQuCi0gICAgZW5jb2RlID0gY29kZWNzLm1iY3NfZW5jb2RlCi0gICAgZGVjb2RlID0gY29kZWNzLm1iY3NfZGVjb2RlCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBtYmNzX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQogCiBjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLm1iY3NfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQorICAgICAgICByZXR1cm4gbWJjc19lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLm1iY3NfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIHBhc3MKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gbWJjc19kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIHBhc3MKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBtYmNzX2VuY29kZQogCi1jbGFzcyBTdHJlYW1Db252ZXJ0ZXIoU3RyZWFtV3JpdGVyLFN0cmVhbVJlYWRlcik6Ci0KLSAgICBlbmNvZGUgPSBjb2RlY3MubWJjc19kZWNvZGUKLSAgICBkZWNvZGUgPSBjb2RlY3MubWJjc19lbmNvZGUKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBtYmNzX2RlY29kZQogCiAjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKIAogZGVmIGdldHJlZ2VudHJ5KCk6CiAgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCiAgICAgICAgIG5hbWU9J21iY3MnLAotICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAotICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAogICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAogICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLApkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9wdW55Y29kZS5weSBiL0xpYi9lbmNvZGluZ3MvcHVueWNvZGUucHkKaW5kZXggMmNkZThiOS4uZDk3MjAwZiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9wdW55Y29kZS5weQorKysgYi9MaWIvZW5jb2RpbmdzL3B1bnljb2RlLnB5CkBAIC0yMTQsOSArMjE0LDkgQEAKIAogY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgogICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKLSAgICAgICAgaWYgZXJyb3JzIG5vdCBpbiAoJ3N0cmljdCcsICdyZXBsYWNlJywgJ2lnbm9yZScpOgotICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMKLSAgICAgICAgcmV0dXJuIHB1bnljb2RlX2RlY29kZShpbnB1dCwgZXJyb3JzKQorICAgICAgICBpZiBzZWxmLmVycm9ycyBub3QgaW4gKCdzdHJpY3QnLCAncmVwbGFjZScsICdpZ25vcmUnKToKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrc2VsZi5lcnJvcnMKKyAgICAgICAgcmV0dXJuIHB1bnljb2RlX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpCiAKIGNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3V0Zl84X3NpZy5weSBiL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CmluZGV4IGNkMTRhYjAuLmYwNWY2YjggMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CkBAIC0zMCw5ICszMCw5IEBACiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgICBpZiBzZWxmLmZpcnN0OgogICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCi0gICAgICAgICAgICByZXR1cm4gY29kZWNzLkJPTV9VVEY4ICsgY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgZXJyb3JzKVswXQorICAgICAgICAgICAgcmV0dXJuIGNvZGVjcy5CT01fVVRGOCArIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0KKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KIAogICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5yZXNldChzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvdXVfY29kZWMucHkKaW5kZXggMDg3N2ZlMS4uNDNmYjkzYyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weQorKysgYi9MaWIvZW5jb2RpbmdzL3V1X2NvZGVjLnB5CkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogCiBjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gdXVfZW5jb2RlKGlucHV0LCBlcnJvcnMpWzBdCisgICAgICAgIHJldHVybiB1dV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CiAgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gdXVfZGVjb2RlKGlucHV0LCBlcnJvcnMpWzBdCisgICAgICAgIHJldHVybiB1dV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCiBjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2d6aXAucHkgYi9MaWIvZ3ppcC5weQppbmRleCA4NjBhY2NjLi4wYmYyOWU4IDEwMDY0NAotLS0gYS9MaWIvZ3ppcC5weQorKysgYi9MaWIvZ3ppcC5weQpAQCAtMzE1LDcgKzMxNSwxMyBAQAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgaWYgc2VsZi5tb2RlID09IFdSSVRFOgogICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuY29tcHJlc3MuZmx1c2goKSkKLSAgICAgICAgICAgIHdyaXRlMzIoc2VsZi5maWxlb2JqLCBzZWxmLmNyYykKKyAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CisgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQworICAgICAgICAgICAgIyBsb25nLiAgU28sIG9uIGEgMzItYml0IGJveCBzZWxmLmNyYyBtYXkgImxvb2sgbmVnYXRpdmUiLAorICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCisgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQorICAgICAgICAgICAgIyBpdCB0byBsb29rIHBvc2l0aXZlIG9uIGFsbCBib3hlcy4KKyAgICAgICAgICAgIHdyaXRlMzJ1KHNlbGYuZmlsZW9iaiwgTE9XVTMyKHNlbGYuY3JjKSkKICAgICAgICAgICAgICMgc2VsZi5zaXplIG1heSBleGNlZWQgMkdCLCBvciBldmVuIDRHQgogICAgICAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBMT1dVMzIoc2VsZi5zaXplKSkKICAgICAgICAgICAgIHNlbGYuZmlsZW9iaiA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9odHRwbGliLnB5IGIvTGliL2h0dHBsaWIucHkKaW5kZXggMzYzODFkZS4uNWFlNWVmYyAxMDA2NDQKLS0tIGEvTGliL2h0dHBsaWIucHkKKysrIGIvTGliL2h0dHBsaWIucHkKQEAgLTMsNyArMyw3IEBACiA8aW50cm8gc3R1ZmYgZ29lcyBoZXJlPgogPG90aGVyIHN0dWZmLCB0b28+CiAKLUhUVFBDb25uZWN0aW9uIGdvIHRocm91Z2ggYSBudW1iZXIgb2YgInN0YXRlcyIsIHdoaWNoIGRlZmluZXMgd2hlbiBhIGNsaWVudAorSFRUUENvbm5lY3Rpb24gZ29lcyB0aHJvdWdoIGEgbnVtYmVyIG9mICJzdGF0ZXMiLCB3aGljaCBkZWZpbmUgd2hlbiBhIGNsaWVudAogbWF5IGxlZ2FsbHkgbWFrZSBhbm90aGVyIHJlcXVlc3Qgb3IgZmV0Y2ggdGhlIHJlc3BvbnNlIGZvciBhIHBhcnRpY3VsYXIKIHJlcXVlc3QuIFRoaXMgZGlhZ3JhbSBkZXRhaWxzIHRoZXNlIHN0YXRlIHRyYW5zaXRpb25zOgogCkBAIC05MjYsMTUgKzkyNiwxNSBAQAogICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfSURMRQogCiAgICAgICAgIGlmIHJlc3BvbnNlLndpbGxfY2xvc2U6Ci0gICAgICAgICAgICAjIHRoaXMgZWZmZWN0aXZlbHkgcGFzc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZXNwb25zZQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAjIFBhc3MgdGhlIHNvY2tldCB0byB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhpcywgc28gd2UgY2FuIHRlbGwgd2hlbiBpdCBpcyBjb21wbGV0ZQogICAgICAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gcmVzcG9uc2UKIAogICAgICAgICByZXR1cm4gcmVzcG9uc2UKIAotIyBUaGUgbmV4dCBzZXZlcmFsIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIEZha2VTb2NrZXQsYSBzb2NrZXQtbGlrZQorIyBUaGUgbmV4dCBzZXZlcmFsIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIEZha2VTb2NrZXQsIGEgc29ja2V0LWxpa2UKICMgaW50ZXJmYWNlIHRvIGFuIFNTTCBjb25uZWN0aW9uLgogCiAjIFRoZSBwcmltYXJ5IGNvbXBsZXhpdHkgY29tZXMgZnJvbSBmYWtpbmcgYSBtYWtlZmlsZSgpIG1ldGhvZC4gIFRoZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQppbmRleCBiNWU5MGIwLi5kMjRiZTNmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQorKysgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQpAQCAtODAsNiArODAsMzIgQEAKICAgIF0pLAogXQogCitpbXBvcnQgc3lzCitpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICcuYXBwJyBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICAjIFJ1bm5pbmcgYXMgYSBwcm9wZXIgTWFjT1MgYXBwbGljYXRpb24gYnVuZGxlLiBUaGlzIGJsb2NrIHJlc3RydWN0dXJlcworICAgICMgdGhlIG1lbnVzIGEgbGl0dGxlIHRvIG1ha2UgdGhlbSBjb25mb3JtIGJldHRlciB0byB0aGUgSElHLgorCisgICAgcXVpdEl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMV0KKyAgICBjbG9zZUl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMl0KKworICAgICMgUmVtb3ZlIHRoZSBsYXN0IDMgaXRlbXMgb2YgdGhlIGZpbGUgbWVudTogYSBzZXBhcmF0b3IsIGNsb3NlIHdpbmRvdyBhbmQKKyAgICAjIHF1aXQuIENsb3NlIHdpbmRvdyB3aWxsIGJlIHJlaW5zZXJ0ZWQganVzdCBhYm92ZSB0aGUgc2F2ZSBpdGVtLCB3aGVyZQorICAgICMgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgSElHLiBRdWl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgorICAgIGRlbCBtZW51ZGVmc1swXVsxXVstMzpdCisgICAgbWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKKworICAgICMgUmVtb3ZlIHRoZSAnQWJvdXQnIGVudHJ5IGZyb20gdGhlIGhlbHAgbWVudSwgaXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgIyBtZW51CisgICAgZGVsIG1lbnVkZWZzWy0xXVsxXVswOjJdCisKKyAgICBtZW51ZGVmcy5pbnNlcnQoMCwKKyAgICAgICAgICAgICgnYXBwbGljYXRpb24nLCBbCisgICAgICAgICAgICAgICAgKCdBYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAoJ19QcmVmZXJlbmNlcy4uLi4nLCAnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicpLAorICAgICAgICAgICAgXSkpCisKKwogZGVmYXVsdF9rZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCiAKIGRlbCBzeXMKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NSRURJVFMudHh0IGIvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKaW5kZXggNmY0ZTk1ZC4uZTgzOGMwMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKKysrIGIvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKQEAgLTE5LDE3ICsxOSwxOCBAQAogc3VicHJvY2VzcywgYW5kIG1hZGUgYSBudW1iZXIgb2YgdXNhYmlsaXR5IGVuaGFuY2VtZW50cy4KIAogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgUmF5bW9uZCBIZXR0aW5nZXIsIFRvbnkgTG93bmRzIChNYWMgaW50ZWdyYXRpb24pLAotTmVhbCBOb3J3aXR6IChjb2RlIGNoZWNrIGFuZCBjbGVhbi11cCksIGFuZCBDaHVpIFRleSAoUlBDIGludGVncmF0aW9uLCBkZWJ1Z2dlcgotaW50ZWdyYXRpb24gYW5kIHBlcnNpc3RlbnQgYnJlYWtwb2ludHMpLgorTmVhbCBOb3J3aXR6IChjb2RlIGNoZWNrIGFuZCBjbGVhbi11cCksIFJvbmFsZCBPdXNzb3JlbiAoTWFjIGludGVncmF0aW9uKSwKK05vYW0gUmFwaGFlbCAoQ29kZSBDb250ZXh0LCBDYWxsIFRpcHMsIG1hbnkgb3RoZXIgcGF0Y2hlcyksIGFuZCBDaHVpIFRleSAoUlBDCitpbnRlZ3JhdGlvbiwgZGVidWdnZXIgaW50ZWdyYXRpb24gYW5kIHBlcnNpc3RlbnQgYnJlYWtwb2ludHMpLgogCi1TY290dCBEYXZpZCBEYW5pZWxzLCBIZXJuYW4gRm9mZmFuaSwgQ2hyaXN0b3MgR2Vvcmdpb3UsIE1hcnRpbiB2LiBM9ndpcywgCi1KYXNvbiBPcmVuZG9yZmYsIE5vYW0gUmFwaGFlbCwgSm9zaCBSb2JiLCBOaWdlbCBSb3dlLCBCcnVjZSBTaGVyd29vZCwgYW5kCi1KZWZmIFNodXRlIGhhdmUgc3VibWl0dGVkIHVzZWZ1bCBwYXRjaGVzLiAgVGhhbmtzLCBndXlzIQorU2NvdHQgRGF2aWQgRGFuaWVscywgVGFsIEVpbmF0LCBIZXJuYW4gRm9mZmFuaSwgQ2hyaXN0b3MgR2Vvcmdpb3UsCitNYXJ0aW4gdi4gTPZ3aXMsIEphc29uIE9yZW5kb3JmZiwgSm9zaCBSb2JiLCBOaWdlbCBSb3dlLCBCcnVjZSBTaGVyd29vZCwKK2FuZCBKZWZmIFNodXRlIGhhdmUgc3VibWl0dGVkIHVzZWZ1bCBwYXRjaGVzLiAgVGhhbmtzLCBndXlzIQogCiBGb3IgYWRkaXRpb25hbCBkZXRhaWxzIHJlZmVyIHRvIE5FV1MudHh0IGFuZCBDaGFuZ2Vsb2cuCiAKLVBsZWFzZSBjb250YWN0IHRoZSBJRExFIG1haW50YWluZXIgdG8gaGF2ZSB5b3Vyc2VsZiBpbmNsdWRlZCBoZXJlIGlmIHlvdQotYXJlIG9uZSBvZiB0aG9zZSB3ZSBtaXNzZWQhIAorUGxlYXNlIGNvbnRhY3QgdGhlIElETEUgbWFpbnRhaW5lciAoa2JrQHNob3JlLm5ldCkgdG8gaGF2ZSB5b3Vyc2VsZiBpbmNsdWRlZAoraGVyZSBpZiB5b3UgYXJlIG9uZSBvZiB0aG9zZSB3ZSBtaXNzZWQhCiAKIAogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5IGIvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQppbmRleCBhZmQ0NDM5Li4yMjIzODg1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKQEAgLTQ5LDcgKzQ5LDExIEBACiAgICAgICAgICIiIgogICAgICAgICAjIHRydW5jYXRlIG92ZXJseSBsb25nIGNhbGx0aXAKICAgICAgICAgaWYgbGVuKHRleHQpID49IDc5OgotICAgICAgICAgICAgdGV4dCA9IHRleHRbOjc1XSArICcgLi4uJworICAgICAgICAgICAgdGV4dGxpbmVzID0gdGV4dC5zcGxpdGxpbmVzKCkKKyAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZSh0ZXh0bGluZXMpOgorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDc5OgorICAgICAgICAgICAgICAgICAgICB0ZXh0bGluZXNbaV0gPSBsaW5lWzo3NV0gKyAnIC4uLicKKyAgICAgICAgICAgIHRleHQgPSAnXG4nLmpvaW4odGV4dGxpbmVzKQogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CiAgICAgICAgIGlmIHNlbGYudGlwd2luZG93IG9yIG5vdCBzZWxmLnRleHQ6CiAgICAgICAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NhbGxUaXBzLnB5IGIvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKaW5kZXggNDdhMWQ1NS4uOTk3ZWIxMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIGFyZ1RleHQgPSAiIgogICAgIGlmIG9iIGlzIG5vdCBOb25lOgogICAgICAgICBhcmdPZmZzZXQgPSAwCi0gICAgICAgIGlmIHR5cGUob2IpPT10eXBlcy5DbGFzc1R5cGU6CisgICAgICAgIGlmIHR5cGUob2IpIGluICh0eXBlcy5DbGFzc1R5cGUsIHR5cGVzLlR5cGVUeXBlKToKICAgICAgICAgICAgICMgTG9vayBmb3IgdGhlIGhpZ2hlc3QgX19pbml0X18gaW4gdGhlIGNsYXNzIGNoYWluLgogICAgICAgICAgICAgZm9iID0gX2ZpbmRfY29uc3RydWN0b3Iob2IpCiAgICAgICAgICAgICBpZiBmb2IgaXMgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKaW5kZXggNWQ1NWY3Ny4uNjNjYzgyYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKKysrIGIvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKQEAgLTExLDExICsxMSwxMCBAQAogIiIiCiBpbXBvcnQgVGtpbnRlcgogZnJvbSBjb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBzZXRzIGltcG9ydCBTZXQKIGltcG9ydCByZQogZnJvbSBzeXMgaW1wb3J0IG1heGludCBhcyBJTkZJTklUWQogCi1CTE9DS09QRU5FUlMgPSBTZXQoWyJjbGFzcyIsICJkZWYiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJmaW5hbGx5IiwgImZvciIsCitCTE9DS09QRU5FUlMgPSBzZXQoWyJjbGFzcyIsICJkZWYiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJmaW5hbGx5IiwgImZvciIsCiAgICAgICAgICAgICAgICAgICAgICJpZiIsICJ0cnkiLCAid2hpbGUiXSkKIFVQREFURUlOVEVSVkFMID0gMTAwICMgbWlsbGlzZWMKIEZPTlRVUERBVEVJTlRFUlZBTCA9IDEwMDAgIyBtaWxsaXNlYwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQppbmRleCBmMjU4YjM0Li5lNTVmOWU2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQpAQCAtOCwyOCArOCwyOSBAQAogCiBERUJVRyA9IEZhbHNlCiAKLWRlZiBhbnkobmFtZSwgbGlzdCk6Ci0gICAgcmV0dXJuICIoP1A8JXM+IiAlIG5hbWUgKyAifCIuam9pbihsaXN0KSArICIpIgorZGVmIGFueShuYW1lLCBhbHRlcm5hdGVzKToKKyAgICAiUmV0dXJuIGEgbmFtZWQgZ3JvdXAgcGF0dGVybiBtYXRjaGluZyBsaXN0IG9mIGFsdGVybmF0ZXMuIgorICAgIHJldHVybiAiKD9QPCVzPiIgJSBuYW1lICsgInwiLmpvaW4oYWx0ZXJuYXRlcykgKyAiKSIKIAogZGVmIG1ha2VfcGF0KCk6CiAgICAga3cgPSByIlxiIiArIGFueSgiS0VZV09SRCIsIGtleXdvcmQua3dsaXN0KSArIHIiXGIiCiAgICAgYnVpbHRpbmxpc3QgPSBbc3RyKG5hbWUpIGZvciBuYW1lIGluIGRpcihfX2J1aWx0aW5fXykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyldCiAgICAgIyBzZWxmLmZpbGUgPSBmaWxlKCJmaWxlIikgOgotICAgICMgMXN0ICdmaWxlJyBjb2xvcml6ZWQgbm9ybWFsLCAybmQgYXMgYnVpbHRpbiwgM3JkIGFzIGNvbW1lbnQKLSAgICBidWlsdGluID0gciIoW14uJ1wiXFxdXGJ8XikiICsgYW55KCJCVUlMVElOIiwgYnVpbHRpbmxpc3QpICsgciJcYiIKKyAgICAjIDFzdCAnZmlsZScgY29sb3JpemVkIG5vcm1hbCwgMm5kIGFzIGJ1aWx0aW4sIDNyZCBhcyBzdHJpbmcKKyAgICBidWlsdGluID0gciIoW14uJ1wiXFwjXVxifF4pIiArIGFueSgiQlVJTFRJTiIsIGJ1aWx0aW5saXN0KSArIHIiXGIiCiAgICAgY29tbWVudCA9IGFueSgiQ09NTUVOVCIsIFtyIiNbXlxuXSoiXSkKLSAgICBzcXN0cmluZyA9IHIiKFxiW3JSXSk/J1teJ1xcXG5dKihcXC5bXidcXFxuXSopKic/IgotICAgIGRxc3RyaW5nID0gcicoXGJbclJdKT8iW14iXFxcbl0qKFxcLlteIlxcXG5dKikqIj8nCi0gICAgc3Ezc3RyaW5nID0gciIoXGJbclJdKT8nJydbXidcXF0qKChcXC58Jyg/IScnKSlbXidcXF0qKSooJycnKT8iCi0gICAgZHEzc3RyaW5nID0gcicoXGJbclJdKT8iIiJbXiJcXF0qKChcXC58Iig/ISIiKSlbXiJcXF0qKSooIiIiKT8nCisgICAgc3FzdHJpbmcgPSByIihcYltyUnVVXSk/J1teJ1xcXG5dKihcXC5bXidcXFxuXSopKic/IgorICAgIGRxc3RyaW5nID0gcicoXGJbclJ1VV0pPyJbXiJcXFxuXSooXFwuW14iXFxcbl0qKSoiPycKKyAgICBzcTNzdHJpbmcgPSByIihcYltyUnVVXSk/JycnW14nXFxdKigoXFwufCcoPyEnJykpW14nXFxdKikqKCcnJyk/IgorICAgIGRxM3N0cmluZyA9IHInKFxiW3JSdVVdKT8iIiJbXiJcXF0qKChcXC58Iig/ISIiKSlbXiJcXF0qKSooIiIiKT8nCiAgICAgc3RyaW5nID0gYW55KCJTVFJJTkciLCBbc3Ezc3RyaW5nLCBkcTNzdHJpbmcsIHNxc3RyaW5nLCBkcXN0cmluZ10pCiAgICAgcmV0dXJuIGt3ICsgInwiICsgYnVpbHRpbiArICJ8IiArIGNvbW1lbnQgKyAifCIgKyBzdHJpbmcgK1wKICAgICAgICAgICAgInwiICsgYW55KCJTWU5DIiwgW3IiXG4iXSkKIAogcHJvZyA9IHJlLmNvbXBpbGUobWFrZV9wYXQoKSwgcmUuUykKIGlkcHJvZyA9IHJlLmNvbXBpbGUociJccysoXHcrKSIsIHJlLlMpCi1hc3Byb2cgPSByZS5jb21waWxlKHIiLio/XGIoYXMpXGIiLCByZS5TKQorYXNwcm9nID0gcmUuY29tcGlsZShyIi4qP1xiKGFzKVxiIikKIAogY2xhc3MgQ29sb3JEZWxlZ2F0b3IoRGVsZWdhdG9yKToKIApAQCAtMjA4LDEwICsyMDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlID09ICJpbXBvcnQiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGFsbCB0aGUgImFzIiB3b3JkcyBvbiBzYW1lIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlYXAgYXBwcm94aW1hdGlvbiB0byB0aGUgdHJ1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBhbGwgdGhlICJhcyIgd29yZHMgb24gc2FtZSBsaW5lLCBleGNlcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBpbiBhIGNvbW1lbnQ7IGNoZWFwIGFwcHJveGltYXRpb24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIGNoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gY2hhcnMuaW5kZXgoJyMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbGVuKGNoYXJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEgPSBzZWxmLmFzcHJvZy5tYXRjaChjaGFycywgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0xID0gc2VsZi5hc3Byb2cubWF0Y2goY2hhcnMsIGIsIGVuZHBvcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgYiA9IG0xLnNwYW4oMSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0RlYnVnZ2VyLnB5IGIvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKaW5kZXggN2E5ZDAyZi4uZjU2NDYwYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKQEAgLTQsNiArNCw3IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGZyb20gV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKIGZyb20gU2Nyb2xsZWRMaXN0IGltcG9ydCBTY3JvbGxlZExpc3QKK2ltcG9ydCBtYWNvc3hTdXBwb3J0CiAKIAogY2xhc3MgSWRiKGJkYi5CZGIpOgpAQCAtMzIyLDcgKzMyMywxMyBAQAogY2xhc3MgU3RhY2tWaWV3ZXIoU2Nyb2xsZWRMaXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGZsaXN0LCBndWkpOgotICAgICAgICBTY3JvbGxlZExpc3QuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWR0aD04MCkKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgQXQgbGVhc3Qgb24gd2l0aCB0aGUgc3RvY2sgQXF1YVRrIHZlcnNpb24gb24gT1NYIDEwLjQgeW91J2xsCisgICAgICAgICAgICAjIGdldCBhbiBzaGFraW5nIEdVSSB0aGF0IGV2ZW50dWFsbHkga2lsbHMgSURMRSBpZiB0aGUgd2lkdGgKKyAgICAgICAgICAgICMgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgU2Nyb2xsZWRMaXN0Ll9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcm9sbGVkTGlzdC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZHRoPTgwKQogICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKICAgICAgICAgc2VsZi5ndWkgPSBndWkKICAgICAgICAgc2VsZi5zdGFjayA9IFtdCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKaW5kZXggNTk0NDBmMC4uNmI4YWI2MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IFB5UGFyc2UKIGZyb20gY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKIGltcG9ydCBhYm91dERpYWxvZywgdGV4dFZpZXcsIGNvbmZpZ0RpYWxvZworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogIyBUaGUgZGVmYXVsdCB0YWIgc2V0dGluZyBmb3IgYSBUZXh0IHdpZGdldCwgaW4gYXZlcmFnZS13aWR0aCBjaGFyYWN0ZXJzLgogVEtfVEFCV0lEVEhfREVGQVVMVCA9IDgKQEAgLTY2LDI2ICs2Nyw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiVkJWQuY2htJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNobWZpbGUpOgogICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gY2htZmlsZQorCisgICAgICAgICAgICBlbGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAgICAgIyBkb2N1bWVudGF0aW9uIGlzIHN0b3JlZCBpbnNpZGUgdGhlIHB5dGhvbiBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbi9pbmRleC5odG1sJykKKwogICAgICAgICAgICAgZG9jaG9tZSA9IG9zLnBhdGgubm9ybXBhdGgoZG9jaG9tZSkKICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRvY2hvbWUpOgogICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9IGRvY2hvbWUKKyAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgICAgICMgU2FmYXJpIHJlcXVpcmVzIHJlYWwgZmlsZTotVVJMcworICAgICAgICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSAnZmlsZTovLycgKyBFZGl0b3JXaW5kb3cuaGVscF91cmwKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgRWRpdG9yV2luZG93LmhlbHBfdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvY3VycmVudCIKICAgICAgICAgY3VycmVudFRoZW1lPWlkbGVDb25mLkN1cnJlbnRUaGVtZSgpCiAgICAgICAgIHNlbGYuZmxpc3QgPSBmbGlzdAogICAgICAgICByb290ID0gcm9vdCBvciBmbGlzdC5yb290CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnBzMQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzeXMucHMxID0gJz4+PiAnCiAgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnUocm9vdCkKICAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBXaW5kb3dMaXN0Lkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQogICAgICAgICBpZiBmbGlzdDoKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0gZmxpc3QudmFycwogICAgICAgICAgICAgI3NlbGYudG9wLmluc3RhbmNlX2RpY3QgbWFrZXMgZmxpc3QuaW52ZXJzZWRpY3QgYXZhbGFibGUgdG8KICAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhY2VzCi0gICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0PWZsaXN0LmludmVyc2VkaWN0CisgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXM6IFRraW50ZXIgdmFyaWFibGUgaW5zdGFuY2VzCi0gICAgICAgIHNlbGYucmVjZW50X2ZpbGVzX3BhdGg9b3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKKyAgICAgICAgICAgIHNlbGYudG9wLmluc3RhbmNlX2RpY3QgPSB7fQorICAgICAgICBzZWxmLnJlY2VudF9maWxlc19wYXRoID0gb3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKICAgICAgICAgICAgICAgICAncmVjZW50LWZpbGVzLmxzdCcpCiAgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIodG9wLCBuYW1lPSd2YmFyJykKICAgICAgICAgc2VsZi50ZXh0X2ZyYW1lID0gdGV4dF9mcmFtZSA9IEZyYW1lKHRvcCkKQEAgLTExMSw2ICsxMjYsOSBAQAogCiAgICAgICAgIHNlbGYudG9wLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jbG9zZSkKICAgICAgICAgc2VsZi50b3AuYmluZCgiPDxjbG9zZS13aW5kb3c+PiIsIHNlbGYuY2xvc2VfZXZlbnQpCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIENvbW1hbmQtVyBvbiBlZGl0b3J3aW5kb3dzIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoaXMuCisgICAgICAgICAgICB0ZXh0LmJpbmQoJzw8Y2xvc2Utd2luZG93Pj4nLCBzZWxmLmNsb3NlX2V2ZW50KQogICAgICAgICB0ZXh0LmJpbmQoIjw8Y3V0Pj4iLCBzZWxmLmN1dCkKICAgICAgICAgdGV4dC5iaW5kKCI8PGNvcHk+PiIsIHNlbGYuY29weSkKICAgICAgICAgdGV4dC5iaW5kKCI8PHBhc3RlPj4iLCBzZWxmLnBhc3RlKQpAQCAtMjc4LDYgKzI5NiwxMCBAQAogCiAgICAgZGVmIHNldF9zdGF0dXNfYmFyKHNlbGYpOgogICAgICAgICBzZWxmLnN0YXR1c19iYXIgPSBzZWxmLk11bHRpU3RhdHVzQmFyKHNlbGYudG9wKQorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBJbnNlcnQgc29tZSBwYWRkaW5nIHRvIGF2b2lkIG9ic2N1cmluZyBzb21lIG9mIHRoZSBzdGF0dXNiYXIKKyAgICAgICAgICAgICMgYnkgdGhlIHJlc2l6ZSB3aWRnZXQuCisgICAgICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdfcGFkZGluZzEnLCAnICAgICcsIHNpZGU9UklHSFQpCiAgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ2NvbHVtbicsICdDb2w6ID8nLCBzaWRlPVJJR0hUKQogICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdsaW5lJywgJ0xuOiA/Jywgc2lkZT1SSUdIVCkKICAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKQEAgLTMwMSw2ICszMjMsMTEgQEAKICAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCiAgICAgXQogCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgICAgIG1lbnVfc3BlY3NbLTJdID0gKCJ3aW5kb3dzIiwgIl9XaW5kb3ciKQorCisKICAgICBkZWYgY3JlYXRlbWVudWJhcihzZWxmKToKICAgICAgICAgbWJhciA9IHNlbGYubWVudWJhcgogICAgICAgICBzZWxmLm1lbnVkaWN0ID0gbWVudWRpY3QgPSB7fQpAQCAtMzA4LDYgKzMzNSwxMiBAQAogICAgICAgICAgICAgdW5kZXJsaW5lLCBsYWJlbCA9IHByZXBzdHIobGFiZWwpCiAgICAgICAgICAgICBtZW51ZGljdFtuYW1lXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9bmFtZSkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICcuZnJhbWV3b3JrJyBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBhcHBsaWNhdGlvbiBtZW51CisgICAgICAgICAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9J2FwcGxlJykKKyAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCisKICAgICAgICAgc2VsZi5maWxsX21lbnVzKCkKICAgICAgICAgc2VsZi5iYXNlX2hlbHBtZW51X2xlbmd0aCA9IHNlbGYubWVudWRpY3RbJ2hlbHAnXS5pbmRleChFTkQpCiAgICAgICAgIHNlbGYucmVzZXRfaGVscF9tZW51X2VudHJpZXMoKQpAQCAtNjQ5LDcgKzY4Miw3IEBACiAgICAgZGVmIF9fZXh0cmFfaGVscF9jYWxsYmFjayhzZWxmLCBoZWxwZmlsZSk6CiAgICAgICAgICJDcmVhdGUgYSBjYWxsYmFjayB3aXRoIHRoZSBoZWxwZmlsZSB2YWx1ZSBmcm96ZW4gYXQgZGVmaW5pdGlvbiB0aW1lIgogICAgICAgICBkZWYgZGlzcGxheV9leHRyYV9oZWxwKGhlbHBmaWxlPWhlbHBmaWxlKToKLSAgICAgICAgICAgIGlmIG5vdCAoaGVscGZpbGUuc3RhcnRzd2l0aCgnd3d3Jykgb3IgaGVscGZpbGUuc3RhcnRzd2l0aCgnaHR0cCcpKToKKyAgICAgICAgICAgIGlmIG5vdCBoZWxwZmlsZS5zdGFydHN3aXRoKCgnd3d3JywgJ2h0dHAnKSk6CiAgICAgICAgICAgICAgICAgdXJsID0gb3MucGF0aC5ub3JtcGF0aChoZWxwZmlsZSkKICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CiAgICAgICAgICAgICAgICAgb3Muc3RhcnRmaWxlKGhlbHBmaWxlKQpAQCAtMTI0NCwxMyArMTI3NywxMyBAQAogICAgICAgICAgICAgICAiVG9nZ2xlIHRhYnMiLAogICAgICAgICAgICAgICAiVHVybiB0YWJzICIgKyAoIm9uIiwgIm9mZiIpW3NlbGYudXNldGFic10gKwogICAgICAgICAgICAgICAiP1xuSW5kZW50IHdpZHRoICIgKwotICAgICAgICAgICAgICAoIndpbGwgYmUiLCAicmVtYWlucyBhdCIpW3NlbGYudXNldGFic10gKyAiIDguIiwKKyAgICAgICAgICAgICAgKCJ3aWxsIGJlIiwgInJlbWFpbnMgYXQiKVtzZWxmLnVzZXRhYnNdICsgIiA4LiIgKworICAgICAgICAgICAgICAiXG4gTm90ZTogYSB0YWIgaXMgYWx3YXlzIDggY29sdW1ucyIsCiAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpOgogICAgICAgICAgICAgc2VsZi51c2V0YWJzID0gbm90IHNlbGYudXNldGFicwotICAgICAgICAjIFRyeSB0byBwcmV2ZW50IG1peGVkIHRhYnMvc3BhY2VzLgotICAgICAgICAjIFVzZXIgbXVzdCByZXNldCBpbmRlbnQgd2lkdGggbWFudWFsbHkgYWZ0ZXIgdXNpbmcgdGFicwotICAgICAgICAjICAgICAgaWYgaGUgaW5zaXN0cyBvbiBnZXR0aW5nIGludG8gdHJvdWJsZS4KLSAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKKyAgICAgICAgICAgICMgVHJ5IHRvIHByZXZlbnQgaW5jb25zaXN0ZW50IGluZGVudGF0aW9uLgorICAgICAgICAgICAgIyBVc2VyIG11c3QgY2hhbmdlIGluZGVudCB3aWR0aCBtYW51YWxseSBhZnRlciB1c2luZyB0YWJzLgorICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgICMgWFhYIHRoaXMgaXNuJ3QgYm91bmQgdG8gYW55dGhpbmcgLS0gc2VlIHRhYndpZHRoIGNvbW1lbnRzCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ORVdTLnR4dCBiL0xpYi9pZGxlbGliL05FV1MudHh0CmluZGV4IDI1ZTVkNDAuLjIzNTk2M2UgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL05FV1MudHh0CisrKyBiL0xpYi9pZGxlbGliL05FV1MudHh0CkBAIC0xLDMgKzEsNDYgQEAKK1doYXQncyBOZXcgaW4gSURMRSAxLjJjMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogWFgtQVVHLTIwMDYqCisKKy0gQ2hhbmdpbmcgdG9rZW5pemUgKDM5MDQ2KSB0byBkZXRlY3QgZGVkZW50IGJyb2tlIHRhYm5hbm55IGNoZWNrIChzaW5jZSAxLjJhMSkKKworLSBUb2dnbGVUYWIgZGlhbG9nIHdhcyBzZXR0aW5nIGluZGVudCB0byA4IGV2ZW4gaWYgY2FuY2VsbGVkIChzaW5jZSAxLjJhMSkuCisKKy0gV2hlbiB1c2VkIHcvbyBzdWJwcm9jZXNzLCBhbGwgZXhjZXB0aW9ucyB3ZXJlIHByZWNlZGVkIGJ5IGFuIGVycm9yCisgIG1lc3NhZ2UgY2xhaW1pbmcgdGhleSB3ZXJlIElETEUgaW50ZXJuYWwgZXJyb3JzIChzaW5jZSAxLjJhMSkuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjJiMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDMtQVVHLTIwMDYqCisKKy0gRWRpdG9yV2luZG93LnRlc3QoKSB3YXMgZmFpbGluZy4gIEJ1ZyAxNDE3NTk4CisKKy0gRWRpdG9yV2luZG93IGZhaWxlZCB3aGVuIHVzZWQgc3RhbmQtYWxvbmUgaWYgc3lzLnBzMSBub3Qgc2V0LgorICBCdWcgMTAxMDM3MCBEYXZlIEZsb3JlaworCistIFRvb2x0aXBzIGZhaWxlZCBvbiBuZXctc3lsZSBjbGFzcyBfX2luaXRfXyBhcmdzLiAgQnVnIDEwMjc1NjYgTG9yZW4gR3V0aHJpZQorCistIEF2b2lkIG9jY2FzaW9uYWwgZmFpbHVyZSB0byBkZXRlY3QgY2xvc2luZyBwYXJlbiBwcm9wZXJseS4KKyAgUGF0Y2ggMTQwNzI4MCBUYWwgRWluYXQKKworLSBSZWJpbmRpbmcgVGFiIGtleSB3YXMgaW5zZXJ0aW5nICd0YWInIGluc3RlYWQgb2YgJ1RhYicuICBCdWcgMTE3OTE2OC4KKworLSBDb2xvcml6ZXIgbm93IGhhbmRsZXMgIzxidWlsdGluPiBjb3JyZWN0bHksIGFsc28gdW5pY29kZSBzdHJpbmdzIGFuZAorICAnYXMnIGtleXdvcmQgaW4gY29tbWVudCBkaXJlY3RseSBmb2xsb3dpbmcgaW1wb3J0IGNvbW1hbmQuIENsb3NlcyAxMzI1MDcxLgorICBQYXRjaCAxNDc5MjE5IFRhbCBFaW5hdAorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDExLUpVTC0yMDA2KgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwLUpVTi0yMDA2KgorCiBXaGF0J3MgTmV3IGluIElETEUgMS4yYTI/CiA9PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkgYi9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CmluZGV4IDY3M2FlZTIuLjI1MGFlOGIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKKysrIGIvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQpAQCAtOCw3ICs4LDcgQEAKIGZyb20gSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiBmcm9tIGNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCiAKLWtleXN5bV9vcGVuZXIgPSB7InBhcmVucmlnaHQiOicoJywgImJyYWNrZXRyaWdodCI6J1snLCAiYnJhY2VyaWdodCI6J3snfQorX29wZW5lcnMgPSB7JyknOicoJywnXSc6J1snLCd9Jzoneyd9CiBDSEVDS19ERUxBWSA9IDEwMCAjIG1pbGlzZWNvbmRzCiAKIGNsYXNzIFBhcmVuTWF0Y2g6CkBAIC0xMDAsMTIgKzEwMCwxMyBAQAogCiAgICAgZGVmIHBhcmVuX2Nsb3NlZF9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgICMgSWYgaXQgd2FzIGEgc2hvcnRjdXQgYW5kIG5vdCByZWFsbHkgYSBjbG9zaW5nIHBhcmVuLCBxdWl0LgotICAgICAgICBpZiBzZWxmLnRleHQuZ2V0KCJpbnNlcnQtMWMiKSBub3QgaW4gKCcpJywnXScsJ30nKToKKyAgICAgICAgY2xvc2VyID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0LTFjIikKKyAgICAgICAgaWYgY2xvc2VyIG5vdCBpbiBfb3BlbmVyczoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBocCA9IEh5cGVyUGFyc2VyKHNlbGYuZWRpdHdpbiwgImluc2VydC0xYyIpCiAgICAgICAgIGlmIG5vdCBocC5pc19pbl9jb2RlKCk6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaW5kaWNlcyA9IGhwLmdldF9zdXJyb3VuZGluZ19icmFja2V0cyhrZXlzeW1fb3BlbmVyW2V2ZW50LmtleXN5bV0sIFRydWUpCisgICAgICAgIGluZGljZXMgPSBocC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoX29wZW5lcnNbY2xvc2VyXSwgVHJ1ZSkKICAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQogICAgICAgICAgICAgcmV0dXJuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5IGIvTGliL2lkbGVsaWIvUHlTaGVsbC5weQppbmRleCBiNmFiZTQwLi4yNWViNDQ2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKQEAgLTExLDYgKzExLDcgQEAKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB0eXBlcworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogaW1wb3J0IGxpbmVjYWNoZQogZnJvbSBjb2RlIGltcG9ydCBJbnRlcmFjdGl2ZUludGVycHJldGVyCkBAIC03MjEsOCArNzIyLDEyIEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgIklETEUgaW50ZXJuYWwgZXJyb3IgaW4gcnVuY29kZSgpIgorICAgICAgICAgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnRrY29uc29sZS5zdGRlcnIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklETEUgaW50ZXJuYWwgZXJyb3IgaW4gcnVuY29kZSgpIgogICAgICAgICAgICAgICAgIHNlbGYuc2hvd3RyYWNlYmFjaygpCisgICAgICAgICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmVuZGV4ZWN1dGluZygpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CiAgICAgICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUuZW5kZXhlY3V0aW5nKCkKQEAgLTc3Nyw2ICs3ODIsMTEgQEAKICAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCiAgICAgXQogCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgICAgIG1lbnVfc3BlY3NbLTJdID0gKCJ3aW5kb3dzIiwgIl9XaW5kb3ciKQorCisKICAgICAjIE5ldyBjbGFzc2VzCiAgICAgZnJvbSBJZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQogCkBAIC0xMzAwLDEwICsxMzEwLDYgQEAKICAgICBzY3JpcHQgPSBOb25lCiAgICAgc3RhcnR1cCA9IEZhbHNlCiAgICAgdHJ5OgotICAgICAgICBzeXMucHMxCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBzeXMucHMxID0gJz4+PiAnCi0gICAgdHJ5OgogICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJjOmRlaWhucjpzdDoiKQogICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXJyb3I6ICVzXG4iICUgc3RyKG1zZykpCkBAIC0xMzcxLDkgKzEzNzcsMTIgQEAKICAgICBlbmFibGVfc2hlbGwgPSBlbmFibGVfc2hlbGwgb3Igbm90IGVkaXRfc3RhcnQKICAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKICAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKKwogICAgIGZpeHdvcmRicmVha3Mocm9vdCkKICAgICByb290LndpdGhkcmF3KCkKICAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQorICAgIG1hY29zeFN1cHBvcnQuc2V0dXBBcHAocm9vdCwgZmxpc3QpCisKICAgICBpZiBlbmFibGVfZWRpdDoKICAgICAgICAgaWYgbm90IChjbWQgb3Igc2NyaXB0KToKICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgpAQCAtMTM4MSw4ICsxMzkwLDE3IEBACiAgICAgICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgICAgICBmbGlzdC5uZXcoKQogICAgIGlmIGVuYWJsZV9zaGVsbDoKLSAgICAgICAgaWYgbm90IGZsaXN0Lm9wZW5fc2hlbGwoKToKKyAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKKyAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgICAgICAjIE9uIE9TWDogd2hlbiB0aGUgdXNlciBoYXMgZG91YmxlLWNsaWNrZWQgb24gYSBmaWxlIHRoYXQgY2F1c2VzCisgICAgICAgICAgICAjIElETEUgdG8gYmUgbGF1bmNoZWQgdGhlIHNoZWxsIHdpbmRvdyB3aWxsIG9wZW4ganVzdCBpbiBmcm9udCBvZgorICAgICAgICAgICAgIyB0aGUgZmlsZSBzaGUgd2FudHMgdG8gc2VlLiBMb3dlciB0aGUgaW50ZXJwcmV0ZXIgd2luZG93IHdoZW4KKyAgICAgICAgICAgICMgdGhlcmUgYXJlIG9wZW4gZmlsZXMuCisgICAgICAgICAgICBzaGVsbC50b3AubG93ZXIoKQorCiAgICAgc2hlbGwgPSBmbGlzdC5weXNoZWxsCiAgICAgIyBoYW5kbGUgcmVtYWluaW5nIG9wdGlvbnM6CiAgICAgaWYgZGVidWc6CkBAIC0xNDAzLDYgKzE0MjEsNyBAQAogICAgICAgICBlbGlmIHNjcmlwdDoKICAgICAgICAgICAgIHNoZWxsLmludGVycC5wcmVwZW5kX3N5c3BhdGgoc2NyaXB0KQogICAgICAgICAgICAgc2hlbGwuaW50ZXJwLmV4ZWNmaWxlKHNjcmlwdCkKKwogICAgIHJvb3QubWFpbmxvb3AoKQogICAgIHJvb3QuZGVzdHJveSgpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CmluZGV4IDA4NGM2MDcuLmYzMjVhZDEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgRGVidWdnZXIKICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgYmUgZG9uZSBkaWZmZXJlbnRseQogICAgICAgICBzZWxmLmZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0Ci0gICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZmxpc3Qucm9vdAorICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLmVkaXR3aW4ucm9vdAogCiAgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpCkBAIC03Niw2ICs3Niw5IEBACiAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uZ290b2xpbmUobmFnLmdldF9saW5lbm8oKSkKICAgICAgICAgICAgIHNlbGYuZXJyb3Jib3goIlRhYi9zcGFjZSBlcnJvciIsIGluZGVudF9tZXNzYWdlKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbmRlbnRhdGlvbkVycm9yOgorICAgICAgICAgICAgIyBGcm9tIHRva2VuaXplKCksIGxldCBjb21waWxlKCkgaW4gY2hlY2tzeW50YXggZmluZCBpdCBhZ2Fpbi4KKyAgICAgICAgICAgIHBhc3MKICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiBjaGVja3N5bnRheChzZWxmLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5IGIvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQppbmRleCAyYWI0NjU2Li44M2NhM2E2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CisrKyBiL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKQEAgLTIsNiArMiw3IEBACiAKIGltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogY2xhc3MgWm9vbUhlaWdodDoKIApAQCAtMjksNiArMzAsMTQgQEAKICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKICAgICAgICAgbmV3eSA9IDAKICAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gNzIKKworICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgIyBUaGUgJzg4JyBiZWxvdyBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IGF2b2lkcyBwbGFjaW5nIHRoZSBib3R0b20KKyAgICAgICAgIyBvZiB0aGUgd2luZG93IGJlbG93IHRoZSBwYW5lbCBvbiBteSBtYWNoaW5lLiBJIGRvbid0IGtub3cgaG93CisgICAgICAgICMgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIHdpdGggdGtpbnRlci4KKyAgICAgICAgbmV3eSA9IDIyCisgICAgICAgIG5ld2hlaWdodCA9IG5ld2hlaWdodCAtIG5ld3kgLSA4OAorCiAgICAgZWxzZToKICAgICAgICAgI25ld3kgPSAyNAogICAgICAgICBuZXd5ID0gMApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYnVpbGRhcHAucHkgYi9MaWIvaWRsZWxpYi9idWlsZGFwcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyZWIxZS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9idWlsZGFwcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQWZ0ZXIgcnVubmluZyBweXRob24gc2V0dXAucHkgaW5zdGFsbCwgcnVuIHRoaXMgcHJvZ3JhbSBmcm9tIHRoZSBjb21tYW5kCi0jIGxpbmUgbGlrZSBzbzoKLSMKLSMgJSBweXRob24yLjMgYnVpbGRhcHAucHkgYnVpbGQKLSMKLSMgQSBkb3VibGUtY2xpY2thYmxlIElETEUgYXBwbGljYXRpb24gd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBidWlsZC8gZGlyZWN0b3J5LgotIwotCi1mcm9tIGJ1bmRsZWJ1aWxkZXIgaW1wb3J0IGJ1aWxkYXBwCi0KLWJ1aWxkYXBwKAotICAgICAgICBuYW1lPSJJRExFIiwKLSAgICAgICAgbWFpbnByb2dyYW09ImlkbGUucHkiLAotICAgICAgICBhcmd2X2VtdWxhdGlvbj0xLAotICAgICAgICBpY29uZmlsZT0iSWNvbnMvaWRsZS5pY25zIiwKLSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZiBiL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgppbmRleCAwNjUzNzQ2Li5mYjBhYWY0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCkBAIC0xNTksMyArMTU5LDU2IEBACiBjaGFuZ2UtaW5kZW50d2lkdGg9PENvbnRyb2wtS2V5LXU+CiBkZWwtd29yZC1sZWZ0PTxDb250cm9sLUtleS1CYWNrU3BhY2U+CiBkZWwtd29yZC1yaWdodD08Q29udHJvbC1LZXktRGVsZXRlPgorCitbSURMRSBDbGFzc2ljIE9TWF0KK3RvZ2dsZS10YWJzID0gPENvbnRyb2wtS2V5LXQ+CitpbnRlcnJ1cHQtZXhlY3V0aW9uID0gPENvbnRyb2wtS2V5LWM+Cit1bnRhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNj4KK3JlbW92ZS1zZWxlY3Rpb24gPSA8S2V5LUVzY2FwZT4KK3ByaW50LXdpbmRvdyA9IDxDb21tYW5kLUtleS1wPgorcmVwbGFjZSA9IDxDb21tYW5kLUtleS1yPgorZ290by1saW5lID0gPENvbW1hbmQtS2V5LWo+CitwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQgPSA8Q29udHJvbC1LZXktaj4KK2hpc3RvcnktcHJldmlvdXMgPSA8Q29udHJvbC1LZXktcD4KK2JlZ2lubmluZy1vZi1saW5lID0gPENvbnRyb2wtS2V5LUxlZnQ+CitlbmQtb2YtbGluZSA9IDxDb250cm9sLUtleS1SaWdodD4KK2NvbW1lbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LTM+CityZWRvID0gPFNoaWZ0LUNvbW1hbmQtS2V5LVo+CitjbG9zZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktdz4KK3Jlc3RhcnQtc2hlbGwgPSA8Q29udHJvbC1LZXktRjY+CitzYXZlLXdpbmRvdy1hcy1maWxlID0gPENvbW1hbmQtS2V5LVM+CitjbG9zZS1hbGwtd2luZG93cyA9IDxDb21tYW5kLUtleS1xPgordmlldy1yZXN0YXJ0ID0gPEtleS1GNj4KK3RhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNT4KK2ZpbmQtYWdhaW4gPSA8Q29tbWFuZC1LZXktZz4gPEtleS1GMz4KK2ZpbmQgPSA8Q29tbWFuZC1LZXktZj4KK3RvZ2dsZS1hdXRvLWNvbG9yaW5nID0gPENvbnRyb2wtS2V5LXNsYXNoPgorc2VsZWN0LWFsbCA9IDxDb21tYW5kLUtleS1hPgorc21hcnQtYmFja3NwYWNlID0gPEtleS1CYWNrU3BhY2U+CitjaGFuZ2UtaW5kZW50d2lkdGggPSA8Q29udHJvbC1LZXktdT4KK2RvLW5vdGhpbmcgPSA8Q29udHJvbC1LZXktRjEyPgorc21hcnQtaW5kZW50ID0gPEtleS1UYWI+CitjZW50ZXItaW5zZXJ0ID0gPENvbnRyb2wtS2V5LWw+CitoaXN0b3J5LW5leHQgPSA8Q29udHJvbC1LZXktbj4KK2RlbC13b3JkLXJpZ2h0ID0gPE9wdGlvbi1LZXktRGVsZXRlPgordW5kbyA9IDxDb21tYW5kLUtleS16Pgorc2F2ZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktcz4KK3VuY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktND4KK2N1dCA9IDxDb21tYW5kLUtleS14PgorZmluZC1pbi1maWxlcyA9IDxDb21tYW5kLUtleS1GMz4KK2RlZGVudC1yZWdpb24gPSA8Q29tbWFuZC1LZXktYnJhY2tldGxlZnQ+Citjb3B5ID0gPENvbW1hbmQtS2V5LWM+CitwYXN0ZSA9IDxDb21tYW5kLUtleS12PgoraW5kZW50LXJlZ2lvbiA9IDxDb21tYW5kLUtleS1icmFja2V0cmlnaHQ+CitkZWwtd29yZC1sZWZ0ID0gPE9wdGlvbi1LZXktQmFja1NwYWNlPiA8T3B0aW9uLUNvbW1hbmQtS2V5LUJhY2tTcGFjZT4KK25ld2xpbmUtYW5kLWluZGVudCA9IDxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgorZW5kLW9mLWZpbGUgPSA8Q29udHJvbC1LZXktZD4KK29wZW4tY2xhc3MtYnJvd3NlciA9IDxDb21tYW5kLUtleS1iPgorb3Blbi1uZXctd2luZG93ID0gPENvbW1hbmQtS2V5LW4+CitvcGVuLW1vZHVsZSA9IDxDb21tYW5kLUtleS1tPgorZmluZC1zZWxlY3Rpb24gPSA8U2hpZnQtQ29tbWFuZC1LZXktRjM+CitweXRob24tY29udGV4dC1oZWxwID0gPFNoaWZ0LUtleS1GMT4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZSA9IDxTaGlmdC1Db21tYW5kLUtleS1zPgorb3Blbi13aW5kb3ctZnJvbS1maWxlID0gPENvbW1hbmQtS2V5LW8+CitweXRob24tZG9jcyA9IDxLZXktRjE+CisKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CmluZGV4IDE5MWE4N2MuLjgyNmZiNWQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCitpbXBvcnQgbWFjb3N4U3VwcG9ydAogZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlciwgTm9PcHRpb25FcnJvciwgTm9TZWN0aW9uRXJyb3IKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtNDA2LDcgKzQwNyw3IEBACiAgICAgICAgIG5hbWVzPWV4dG5OYW1lTGlzdAogICAgICAgICBrYk5hbWVJbmRpY2llcz1bXQogICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ19iaW5kaW5ncycpIG9yIG5hbWUuZW5kc3dpdGgoJ19jZmdCaW5kaW5ncycpOgorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgoJ19iaW5kaW5ncycsICdfY2ZnQmluZGluZ3MnKSk6CiAgICAgICAgICAgICAgICAga2JOYW1lSW5kaWNpZXMuYXBwZW5kKG5hbWVzLmluZGV4KG5hbWUpKQogICAgICAgICBrYk5hbWVJbmRpY2llcy5zb3J0KCkKICAgICAgICAga2JOYW1lSW5kaWNpZXMucmV2ZXJzZSgpCkBAIC00OTUsNyArNDk2LDE4IEBACiAgICAgICAgIHJldHVybiBiaW5kaW5nCiAKICAgICBkZWYgR2V0Q3VycmVudEtleVNldChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuR2V0S2V5U2V0KHNlbGYuQ3VycmVudEtleXMoKSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5HZXRLZXlTZXQoc2VsZi5DdXJyZW50S2V5cygpKQorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIFdlJ3JlIHVzaW5nIEFxdWFUaywgcmVwbGFjZSBhbGwga2V5YmluZ2luZ3MgdGhhdCB1c2UgdGhlCisgICAgICAgICAgICAjIEFsdCBrZXkgYnkgb25lcyB0aGF0IHVzZSB0aGUgT3B0aW9uIGtleSBiZWNhdXNlIHRoZSBmb3JtZXIKKyAgICAgICAgICAgICMgZG9uJ3Qgd29yayByZWxpYWJseS4KKyAgICAgICAgICAgIGZvciBrLCB2IGluIHJlc3VsdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHYyID0gWyB4LnJlcGxhY2UoJzxBbHQtJywgJzxPcHRpb24tJykgZm9yIHggaW4gdiBdCisgICAgICAgICAgICAgICAgaWYgdiAhPSB2MjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tdID0gdjIKKworICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBkZWYgR2V0S2V5U2V0KHNlbGYsa2V5U2V0TmFtZSk6CiAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQppbmRleCA4OTI0Zjc5Li42NjExNjIxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQorKysgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQogICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKICAgICAgICAgICAgIHBhdGhPayA9IEZhbHNlCi0gICAgICAgIGVsaWYgcGF0aC5zdGFydHN3aXRoKCd3d3cuJykgb3IgcGF0aC5zdGFydHN3aXRoKCdodHRwJyk6CisgICAgICAgIGVsaWYgcGF0aC5zdGFydHN3aXRoKCgnd3d3LicsICdodHRwJykpOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgaWYgcGF0aFs6NV0gPT0gJ2ZpbGU6JzoKQEAgLTE0Niw4ICsxNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoLmdldCgpLnN0cmlwKCkpCiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucmVzdWx0WzFdCi0gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzd2l0aCgnd3d3Jykgb3IgcGF0aC5zdGFydHN3aXRoKCdmaWxlOicpCi0gICAgICAgICAgICAgICAgICAgIG9yIHBhdGguc3RhcnRzd2l0aCgnaHR0cDonKSk6CisgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCgnd3d3JywgJ2ZpbGU6JywgJ2h0dHA6JykpOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgIyBNYWMgU2FmYXJpIGluc2lzdHMgb24gdXNpbmcgdGhlIFVSSSBmb3JtIGZvciBsb2NhbCBmaWxlcwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZXZlci5weSBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKaW5kZXggYjdkZWIzZi4uMDdkM2Q4MiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZXZlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CkBAIC0xICsxIEBACi1JRExFX1ZFUlNJT04gPSAiMS4yYTIiCitJRExFX1ZFUlNJT04gPSAiMS4yYjMiCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQppbmRleCBlYTU3OTU4Li5hZmY5Y2FjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICBjb25maWcta2V5cy5kZWYgbXVzdCB1c2UgdGhlIHNhbWUgb3JkZXJpbmcuCiAgICAgICAgICIiIgogICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgc3lzLmV4ZWN1dGFibGUuY291bnQoJy5hcHAnKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBzeXMuYXJndlswXS5jb3VudCgnLmFwcCcpOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ1NoaWZ0JywgJ0NvbnRyb2wnLCAnT3B0aW9uJywgJ0NvbW1hbmQnXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ0NvbnRyb2wnLCAnQWx0JywgJ1NoaWZ0J10KQEAgLTIwMiw3ICsyMDIsNyBAQAogICAgICAgICAgICAgICAgICc6JzonY29sb24nLCcsJzonY29tbWEnLCcuJzoncGVyaW9kJywnPCc6J2xlc3MnLCc+JzonZ3JlYXRlcicsCiAgICAgICAgICAgICAgICAgJy8nOidzbGFzaCcsJz8nOidxdWVzdGlvbicsJ1BhZ2UgVXAnOidQcmlvcicsJ1BhZ2UgRG93bic6J05leHQnLAogICAgICAgICAgICAgICAgICdMZWZ0IEFycm93JzonTGVmdCcsJ1JpZ2h0IEFycm93JzonUmlnaHQnLCdVcCBBcnJvdyc6J1VwJywKLSAgICAgICAgICAgICAgICAnRG93biBBcnJvdyc6ICdEb3duJywgJ1RhYic6J3RhYid9CisgICAgICAgICAgICAgICAgJ0Rvd24gQXJyb3cnOiAnRG93bicsICdUYWInOidUYWInfQogICAgICAgICBpZiBrZXkgaW4gdHJhbnNsYXRlRGljdC5rZXlzKCk6CiAgICAgICAgICAgICBrZXkgPSB0cmFuc2xhdGVEaWN0W2tleV0KICAgICAgICAgaWYgJ1NoaWZ0JyBpbiBtb2RpZmllcnMgYW5kIGtleSBpbiBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weSBiL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2MWZmZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKQEAgLTAsMCArMSwxMTIgQEAKKyIiIgorQSBudW1iZXIgb2YgZnVuY3Rpb24gdGhhdCBlbmhhbmNlIElETEUgb24gTWFjT1NYIHdoZW4gaXQgdXNlZCBhcyBhIG5vcm1hbAorR1VJIGFwcGxpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGFuIFgxMSBhcHBsaWNhdGlvbikuCisiIiIKK2ltcG9ydCBzeXMKKworZGVmIHJ1bm5pbmdBc09TWEFwcCgpOgorICAgICIiIiBSZXR1cm5zIFRydWUgaWZmIHJ1bm5pbmcgZnJvbSB0aGUgSURMRS5hcHAgYnVuZGxlIG9uIE9TWCAiIiIKKyAgICByZXR1cm4gKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJ0lETEUuYXBwJyBpbiBzeXMuYXJndlswXSkKKworZGVmIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlc3BvbnQgdG8gb3BlbiBBcHBsZUV2ZW50cywgd2hpY2gKKyAgICBtYWtlcyBpcyBmZWFzZWFibGUgdG8gdXNlIElETEUgYXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gZm9yIHB5dGhvbiBmaWxlcy4KKyAgICAiIiIKKyAgICBkZWYgZG9PcGVuRmlsZSgqYXJncyk6CisgICAgICAgIGZvciBmbiBpbiBhcmdzOgorICAgICAgICAgICAgZmxpc3Qub3BlbihmbikKKworICAgICMgVGhlIGNvbW1hbmQgYmVsb3cgaXMgYSBob29rIGluIGFxdWF0ayB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYXBwCisgICAgIyByZWNlaXZlcyBhIGZpbGUgb3BlbiBldmVudC4gVGhlIGNhbGxiYWNrIGNhbiBoYXZlIG11bHRpcGxlIGFyZ3VtZW50cywKKyAgICAjIG9uZSBmb3IgZXZlcnkgZmlsZSB0aGF0IHNob3VsZCBiZSBvcGVuZWQuCisgICAgcm9vdC5jcmVhdGVjb21tYW5kKCI6OnRrOjptYWM6Ok9wZW5Eb2N1bWVudCIsIGRvT3BlbkZpbGUpCisKK2RlZiBoaWRlVGtDb25zb2xlKHJvb3QpOgorICAgIHJvb3QudGsuY2FsbCgnY29uc29sZScsICdoaWRlJykKKworZGVmIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFJlcGxhY2UgdGhlIFRrIHJvb3QgbWVudSBieSBzb21ldGhpbmcgdGhhdCdzIG1vcmUgYXBwcm9wcmlhdGUgZm9yCisgICAgSURMRS4KKyAgICAiIiIKKyAgICAjIFRoZSBtZW51IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIFRrIHJvb3QgKCIuIikgaXMgYWxzbyB1c2VkIGJ5IEFxdWFUayBmb3IKKyAgICAjIGFsbCB3aW5kb3dzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhIG1lbnUgb2YgdGhlaXIgb3duLiBUaGUgZGVmYXVsdCBtZW51YmFyCisgICAgIyBjb250YWlucyBhIG51bWJlciBvZiBtZW51cywgbm9uZSBvZiB3aGljaCBhcmUgYXBwcm9wcmlhdGUgZm9yIElETEUuIFRoZQorICAgICMgTW9zdCBhbm5veWluZyBvZiB0aG9zZSBpcyBhbiAnQWJvdXQgVGNrL1RrLi4uJyBtZW51IGluIHRoZSBhcHBsaWNhdGlvbgorICAgICMgbWVudS4KKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBkZWZhdWx0IG1lbnViYXIgYnkgYSBtb3N0bHkgZW1wdHkgb25lLCBpdAorICAgICMgc2hvdWxkIG9ubHkgY29udGFpbiB0aGUgY29ycmVjdCBhcHBsaWNhdGlvbiBtZW51IGFuZCB0aGUgd2luZG93IG1lbnUuCisgICAgIworICAgICMgRHVlIHRvIGEgKG1pcy0pZmVhdHVyZSBvZiBUa0FxdWEgdGhlIHVzZXIgd2lsbCBhbHNvIHNlZSBhbiBlbXB0eSBIZWxwCisgICAgIyBtZW51LgorICAgIGZyb20gVGtpbnRlciBpbXBvcnQgTWVudSwgVGV4dCwgVGV4dAorICAgIGZyb20gRWRpdG9yV2luZG93IGltcG9ydCBwcmVwc3RyLCBnZXRfYWNjZWxlcmF0b3IKKyAgICBpbXBvcnQgQmluZGluZ3MKKyAgICBpbXBvcnQgV2luZG93TGlzdAorICAgIGZyb20gTXVsdGlDYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCisKKyAgICBtZW51YmFyID0gTWVudShyb290KQorICAgIHJvb3QuY29uZmlndXJlKG1lbnU9bWVudWJhcikKKyAgICBtZW51ZGljdCA9IHt9CisKKyAgICBtZW51ZGljdFsnd2luZG93cyddID0gbWVudSA9IE1lbnUobWVudWJhciwgbmFtZT0nd2luZG93cycpCisgICAgbWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0nV2luZG93JywgbWVudT1tZW51LCB1bmRlcmxpbmU9MCkKKworICAgIGRlZiBwb3N0d2luZG93c21lbnUobWVudT1tZW51KToKKyAgICAgICAgZW5kID0gbWVudS5pbmRleCgnZW5kJykKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICBlbmQgPSAtMQorCisgICAgICAgIGlmIGVuZCA+IDA6CisgICAgICAgICAgICBtZW51LmRlbGV0ZSgwLCBlbmQpCisgICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgIFdpbmRvd0xpc3QucmVnaXN0ZXJfY2FsbGJhY2socG9zdHdpbmRvd3NtZW51KQorCisgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSdhcHBsZScpCisgICAgbWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0nSURMRScsIG1lbnU9bWVudSkKKworICAgIGRlZiBhYm91dF9kaWFsb2coZXZlbnQ9Tm9uZSk6CisgICAgICAgIGltcG9ydCBhYm91dERpYWxvZworICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCisKKyAgICBkZWYgY29uZmlnX2RpYWxvZyhldmVudD1Ob25lKToKKyAgICAgICAgaW1wb3J0IGNvbmZpZ0RpYWxvZworICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHJvb3QsICdTZXR0aW5ncycpCisKKyAgICByb290LmJpbmQoJzw8YWJvdXQtaWRsZT4+JywgYWJvdXRfZGlhbG9nKQorICAgIHJvb3QuYmluZCgnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicsIGNvbmZpZ19kaWFsb2cpCisgICAgaWYgZmxpc3Q6CisgICAgICAgIHJvb3QuYmluZCgnPDxjbG9zZS1hbGwtd2luZG93cz4+JywgZmxpc3QuY2xvc2VfYWxsX2NhbGxiYWNrKQorCisgICAgZm9yIG1uYW1lLCBlbnRyeWxpc3QgaW4gQmluZGluZ3MubWVudWRlZnM6CisgICAgICAgIG1lbnUgPSBtZW51ZGljdC5nZXQobW5hbWUpCisgICAgICAgIGlmIG5vdCBtZW51OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJ5bGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBlbnRyeToKKyAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsYWJlbCwgZXZlbnRuYW1lID0gZW50cnkKKyAgICAgICAgICAgICAgICB1bmRlcmxpbmUsIGxhYmVsID0gcHJlcHN0cihsYWJlbCkKKyAgICAgICAgICAgICAgICBhY2NlbGVyYXRvciA9IGdldF9hY2NlbGVyYXRvcihCaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudG5hbWUpCisgICAgICAgICAgICAgICAgZGVmIGNvbW1hbmQodGV4dD1yb290LCBldmVudG5hbWU9ZXZlbnRuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5ldmVudF9nZW5lcmF0ZShldmVudG5hbWUpCisgICAgICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD1sYWJlbCwgdW5kZXJsaW5lPXVuZGVybGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9Y29tbWFuZCwgYWNjZWxlcmF0b3I9YWNjZWxlcmF0b3IpCisKKworCisKKworZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKKyAgICAiIiIKKyAgICBQZXJmb3JtIHNldHVwIGZvciB0aGUgT1NYIGFwcGxpY2F0aW9uIGJ1bmRsZS4KKyAgICAiIiIKKyAgICBpZiBub3QgcnVubmluZ0FzT1NYQXBwKCk6IHJldHVybgorCisgICAgaGlkZVRrQ29uc29sZShyb290KQorICAgIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpCisgICAgYWRkT3BlbkV2ZW50U3VwcG9ydChyb290LCBmbGlzdCkKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggYmY3ZjAwNi4uMGI0OThiNSAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTg5LDYgKzg5LDQwIEBACiAgICAgaXMgbm90IGd1YXJhbnRlZWQuIiIiCiAgICAgcmV0dXJuIChoYXNhdHRyKG9iamVjdCwgIl9fc2V0X18iKSBhbmQgaGFzYXR0cihvYmplY3QsICJfX2dldF9fIikpCiAKK2lmIGhhc2F0dHIodHlwZXMsICdNZW1iZXJEZXNjcmlwdG9yVHlwZScpOgorICAgICMgQ1B5dGhvbiBhbmQgZXF1aXZhbGVudAorICAgIGRlZiBpc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1lbWJlciBkZXNjcmlwdG9yLgorCisgICAgICAgIE1lbWJlciBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5NZW1iZXJEZXNjcmlwdG9yVHlwZSkKK2Vsc2U6CisgICAgIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMKKyAgICBkZWYgaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICAgICAgICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCitpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAjIENQeXRob24gYW5kIGVxdWl2YWxlbnQKKyAgICBkZWYgaXNnZXRzZXRkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZXRzZXQgZGVzY3JpcHRvci4KKworICAgICAgICBnZXRzZXQgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuR2V0U2V0RGVzY3JpcHRvclR5cGUpCitlbHNlOgorICAgICMgT3RoZXIgaW1wbGVtZW50YXRpb25zCisgICAgZGVmIGlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCisKKyAgICAgICAgZ2V0c2V0IGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKwogZGVmIGlzZnVuY3Rpb24ob2JqZWN0KToKICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgogCkBAIC0zNTUsNDAgKzM4OSwzOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgIHJldHVybiBmaWxlbmFtZQotICAgICMgVWdseSBidXQgbmVjZXNzYXJ5IC0gJzxzdGRpbj4nIGFuZCAnPHN0cmluZz4nIG1lYW4gdGhhdCBnZXRtb2R1bGUoKQotICAgICMgd291bGQgaW5maW5pdGVseSByZWN1cnNlLCBiZWNhdXNlIHRoZXkncmUgbm90IHJlYWwgZmlsZXMgbm9yIGxvYWRhYmxlCi0gICAgIyBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHdyaXRpbmcgYSBQRVAgMzAyIGxvYWRlciB0aGF0IHVzZXMgJzwnCi0gICAgIyBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlbmFtZSBpcyBub3cgbm90IGEgZ29vZCBpZGVhLiAgOigKLSAgICBpZiBmaWxlbmFtZVs6MV0hPSc8JyBhbmQgaGFzYXR0cihnZXRtb2R1bGUob2JqZWN0KSwgJ19fbG9hZGVyX18nKToKKyAgICAjIG9ubHkgcmV0dXJuIGEgbm9uLWV4aXN0ZW50IGZpbGVuYW1lIGlmIHRoZSBtb2R1bGUgaGFzIGEgUEVQIDMwMiBsb2FkZXIKKyAgICBpZiBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QsIGZpbGVuYW1lKSwgJ19fbG9hZGVyX18nKToKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAKLWRlZiBnZXRhYnNmaWxlKG9iamVjdCk6CitkZWYgZ2V0YWJzZmlsZShvYmplY3QsIF9maWxlbmFtZT1Ob25lKToKICAgICAiIiJSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIG9yIGNvbXBpbGVkIGZpbGUgZm9yIGFuIG9iamVjdC4KIAogICAgIFRoZSBpZGVhIGlzIGZvciBlYWNoIG9iamVjdCB0byBoYXZlIGEgdW5pcXVlIG9yaWdpbiwgc28gdGhpcyByb3V0aW5lCiAgICAgbm9ybWFsaXplcyB0aGUgcmVzdWx0IGFzIG11Y2ggYXMgcG9zc2libGUuIiIiCi0gICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2UoCi0gICAgICAgIG9zLnBhdGguYWJzcGF0aChnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpKSkKKyAgICBpZiBfZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgX2ZpbGVuYW1lID0gZ2V0c291cmNlZmlsZShvYmplY3QpIG9yIGdldGZpbGUob2JqZWN0KQorICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChfZmlsZW5hbWUpKQogCiBtb2R1bGVzYnlmaWxlID0ge30KIAotZGVmIGdldG1vZHVsZShvYmplY3QpOgorZGVmIGdldG1vZHVsZShvYmplY3QsIF9maWxlbmFtZT1Ob25lKToKICAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBhbiBvYmplY3Qgd2FzIGRlZmluZWQgaW4sIG9yIE5vbmUgaWYgbm90IGZvdW5kLiIiIgogICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CiAgICAgICAgIHJldHVybiBvYmplY3QKICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fbW9kdWxlX18nKToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChvYmplY3QuX19tb2R1bGVfXykKICAgICB0cnk6Ci0gICAgICAgIGZpbGUgPSBnZXRhYnNmaWxlKG9iamVjdCkKKyAgICAgICAgZmlsZSA9IGdldGFic2ZpbGUob2JqZWN0LCBfZmlsZW5hbWUpCiAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgcmV0dXJuIE5vbmUKICAgICBpZiBmaWxlIGluIG1vZHVsZXNieWZpbGU6CiAgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtmaWxlXSkKICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgogICAgICAgICBpZiBpc21vZHVsZShtb2R1bGUpIGFuZCBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgICAgICBtb2R1bGVzYnlmaWxlWwotICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRhYnNmaWxlKG1vZHVsZSkpXSA9IG1vZHVsZS5fX25hbWVfXworICAgICAgICAgICAgZiA9IGdldGFic2ZpbGUobW9kdWxlKQorICAgICAgICAgICAgbW9kdWxlc2J5ZmlsZVtmXSA9IG1vZHVsZXNieWZpbGVbCisgICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aChmKV0gPSBtb2R1bGUuX19uYW1lX18KICAgICBpZiBmaWxlIGluIG1vZHVsZXNieWZpbGU6CiAgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtmaWxlXSkKICAgICBtYWluID0gc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10KZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGtpbnRlci5weSBiL0xpYi9saWItdGsvVGtpbnRlci5weQppbmRleCAwYmE5NTRlLi5iMjQ4MDMxIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL1RraW50ZXIucHkKKysrIGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CkBAIC0xNjgsMTggKzE2OCwzMCBAQAogICAgIFN1YmNsYXNzZXMgU3RyaW5nVmFyLCBJbnRWYXIsIERvdWJsZVZhciwgQm9vbGVhblZhciBhcmUgc3BlY2lhbGl6YXRpb25zCiAgICAgdGhhdCBjb25zdHJhaW4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZ2V0KCkuIiIiCiAgICAgX2RlZmF1bHQgPSAiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIHZhcmlhYmxlIHdpdGggYW4gb3B0aW9uYWwgTUFTVEVSIGFzIG1hc3RlciB3aWRnZXQuCi0gICAgICAgIFRoZSB2YXJpYWJsZSBpcyBuYW1lZCBQWV9WQVJfbnVtYmVyIGluIFRjbC4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHZhcmlhYmxlCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gIiIpCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgogICAgICAgICAiIiIKICAgICAgICAgZ2xvYmFsIF92YXJudW0KICAgICAgICAgaWYgbm90IG1hc3RlcjoKICAgICAgICAgICAgIG1hc3RlciA9IF9kZWZhdWx0X3Jvb3QKICAgICAgICAgc2VsZi5fbWFzdGVyID0gbWFzdGVyCiAgICAgICAgIHNlbGYuX3RrID0gbWFzdGVyLnRrCi0gICAgICAgIHNlbGYuX25hbWUgPSAnUFlfVkFSJyArIHJlcHIoX3Zhcm51bSkKLSAgICAgICAgX3Zhcm51bSA9IF92YXJudW0gKyAxCi0gICAgICAgIHNlbGYuc2V0KHNlbGYuX2RlZmF1bHQpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9ICdQWV9WQVInICsgcmVwcihfdmFybnVtKQorICAgICAgICAgICAgX3Zhcm51bSArPSAxCisgICAgICAgIGlmIHZhbHVlICE9IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNldCh2YWx1ZSkKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5fdGsuY2FsbCgiaW5mbyIsICJleGlzdHMiLCBzZWxmLl9uYW1lKToKKyAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuX2RlZmF1bHQpCiAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICIiIlVuc2V0IHRoZSB2YXJpYWJsZSBpbiBUY2wuIiIiCiAgICAgICAgIHNlbGYuX3RrLmdsb2JhbHVuc2V0dmFyKHNlbGYuX25hbWUpCkBAIC0yMTcsMTUgKzIyOSwyOSBAQAogICAgICAgICAiIiJSZXR1cm4gYWxsIHRyYWNlIGNhbGxiYWNrIGluZm9ybWF0aW9uLiIiIgogICAgICAgICByZXR1cm4gbWFwKHNlbGYuX3RrLnNwbGl0LCBzZWxmLl90ay5zcGxpdGxpc3QoCiAgICAgICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2aW5mbyIsIHNlbGYuX25hbWUpKSkKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKD09KS4KKworICAgICAgICBOb3RlOiBpZiB0aGUgVmFyaWFibGUncyBtYXN0ZXIgbWF0dGVycyB0byBiZWhhdmlvcgorICAgICAgICBhbHNvIGNvbXBhcmUgc2VsZi5fbWFzdGVyID09IG90aGVyLl9tYXN0ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyA9PSBvdGhlci5fX2NsYXNzX18uX19uYW1lX18gXAorICAgICAgICAgICAgYW5kIHNlbGYuX25hbWUgPT0gb3RoZXIuX25hbWUKIAogY2xhc3MgU3RyaW5nVmFyKFZhcmlhYmxlKToKICAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIHN0cmluZ3MgdmFyaWFibGVzLiIiIgogICAgIF9kZWZhdWx0ID0gIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgc3RyaW5nIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4iIiIKLSAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAiIikKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQogCiAgICAgZGVmIGdldChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHZhbHVlIG9mIHZhcmlhYmxlIGFzIHN0cmluZy4iIiIKQEAgLTIzNywxMSArMjYzLDE3IEBACiBjbGFzcyBJbnRWYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgaW50ZWdlciB2YXJpYWJsZXMuIiIiCiAgICAgX2RlZmF1bHQgPSAwCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhbiBpbnRlZ2VyIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4iIiIKLSAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAwKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKICAgICAgICAgIiIiU2V0IHRoZSB2YXJpYWJsZSB0byB2YWx1ZSwgY29udmVydGluZyBib29sZWFucyB0byBpbnRlZ2Vycy4iIiIKQEAgLTI1NiwxMSArMjg4LDE3IEBACiBjbGFzcyBEb3VibGVWYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgZmxvYXQgdmFyaWFibGVzLiIiIgogICAgIF9kZWZhdWx0ID0gMC4wCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIGZsb2F0IHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgYSBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIDAuMCkKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQogCiAgICAgZGVmIGdldChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYXMgYSBmbG9hdC4iIiIKQEAgLTI2OCwxMiArMzA2LDE4IEBACiAKIGNsYXNzIEJvb2xlYW5WYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgYm9vbGVhbiB2YXJpYWJsZXMuIiIiCi0gICAgX2RlZmF1bHQgPSAiZmFsc2UiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBfZGVmYXVsdCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgogICAgICAgICAiIiJDb25zdHJ1Y3QgYSBib29sZWFuIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgYSBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIEZhbHNlKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhIGJvb2wuIiIiCkBAIC0xNDU2LDEwICsxNTAwLDE5IEBACiAgICAgICAgIHRoZSBncm91cCBsZWFkZXIgb2YgdGhpcyB3aWRnZXQgaWYgTm9uZSBpcyBnaXZlbi4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnZ3JvdXAnLCBzZWxmLl93LCBwYXRoTmFtZSkKICAgICBncm91cCA9IHdtX2dyb3VwCi0gICAgZGVmIHdtX2ljb25iaXRtYXAoc2VsZiwgYml0bWFwPU5vbmUpOgorICAgIGRlZiB3bV9pY29uYml0bWFwKHNlbGYsIGJpdG1hcD1Ob25lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAiIiJTZXQgYml0bWFwIGZvciB0aGUgaWNvbmlmaWVkIHdpZGdldCB0byBCSVRNQVAuIFJldHVybgotICAgICAgICB0aGUgYml0bWFwIGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCBiaXRtYXApCisgICAgICAgIHRoZSBiaXRtYXAgaWYgTm9uZSBpcyBnaXZlbi4KKworICAgICAgICBVbmRlciBXaW5kb3dzLCB0aGUgREVGQVVMVCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpY29uCisgICAgICAgIGZvciB0aGUgd2lkZ2V0IGFuZCBhbnkgZGVzY2VuZGVudHMgdGhhdCBkb24ndCBoYXZlIGFuIGljb24gc2V0CisgICAgICAgIGV4cGxpY2l0bHkuICBERUZBVUxUIGNhbiBiZSB0aGUgcmVsYXRpdmUgcGF0aCB0byBhIC5pY28gZmlsZQorICAgICAgICAoZXhhbXBsZTogcm9vdC5pY29uYml0bWFwKGRlZmF1bHQ9J215aWNvbi5pY28nKSApLiAgU2VlIFRrCisgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIGlmIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdpY29uYml0bWFwJywgc2VsZi5fdywgJy1kZWZhdWx0JywgZGVmYXVsdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCBiaXRtYXApCiAgICAgaWNvbmJpdG1hcCA9IHdtX2ljb25iaXRtYXAKICAgICBkZWYgd21faWNvbmlmeShzZWxmKToKICAgICAgICAgIiIiRGlzcGxheSB3aWRnZXQgYXMgaWNvbi4iIiIKQEAgLTE4ODAsOSArMTkzMyw5IEBACiAgICAgZGVmIGRlc3Ryb3koc2VsZik6CiAgICAgICAgICIiIkRlc3Ryb3kgdGhpcyBhbmQgYWxsIGRlc2NlbmRhbnRzIHdpZGdldHMuIiIiCiAgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW4udmFsdWVzKCk6IGMuZGVzdHJveSgpCisgICAgICAgIHNlbGYudGsuY2FsbCgnZGVzdHJveScsIHNlbGYuX3cpCiAgICAgICAgIGlmIHNlbGYubWFzdGVyLmNoaWxkcmVuLmhhc19rZXkoc2VsZi5fbmFtZSk6CiAgICAgICAgICAgICBkZWwgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0KLSAgICAgICAgc2VsZi50ay5jYWxsKCdkZXN0cm95Jywgc2VsZi5fdykKICAgICAgICAgTWlzYy5kZXN0cm95KHNlbGYpCiAgICAgZGVmIF9kbyhzZWxmLCBuYW1lLCBhcmdzPSgpKToKICAgICAgICAgIyBYWFggT2Jzb2xldGUgLS0gYmV0dGVyIHVzZSBzZWxmLnRrLmNhbGwgZGlyZWN0bHkhCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3RrTWVzc2FnZUJveC5weSBiL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CmluZGV4IDI1MDcxZmUuLmFmZjA2OWIgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CisrKyBiL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CkBAIC02Myw5ICs2MywxMCBAQAogIwogIyBjb252ZW5pZW5jZSBzdHVmZgogCi1kZWYgX3Nob3codGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCBpY29uPU5vbmUsIHR5cGU9Tm9uZSwgKipvcHRpb25zKToKLSAgICBpZiBpY29uOiAgICBvcHRpb25zWyJpY29uIl0gPSBpY29uCi0gICAgaWYgdHlwZTogICAgb3B0aW9uc1sidHlwZSJdID0gdHlwZQorIyBSZW5hbWUgX2ljb24gYW5kIF90eXBlIG9wdGlvbnMgdG8gYWxsb3cgb3ZlcnJpZGluZyB0aGVtIGluIG9wdGlvbnMKK2RlZiBfc2hvdyh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsIF9pY29uPU5vbmUsIF90eXBlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgaWYgX2ljb24gYW5kICJpY29uIiBub3QgaW4gb3B0aW9uczogICAgb3B0aW9uc1siaWNvbiJdID0gX2ljb24KKyAgICBpZiBfdHlwZSBhbmQgInR5cGUiIG5vdCBpbiBvcHRpb25zOiAgICBvcHRpb25zWyJ0eXBlIl0gPSBfdHlwZQogICAgIGlmIHRpdGxlOiAgIG9wdGlvbnNbInRpdGxlIl0gPSB0aXRsZQogICAgIGlmIG1lc3NhZ2U6IG9wdGlvbnNbIm1lc3NhZ2UiXSA9IG1lc3NhZ2UKICAgICByZXMgPSBNZXNzYWdlKCoqb3B0aW9ucykuc2hvdygpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3R1cnRsZS5weSBiL0xpYi9saWItdGsvdHVydGxlLnB5CmluZGV4IGQ2OGU0MDUuLjAxYTU1YjEgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdHVydGxlLnB5CisrKyBiL0xpYi9saWItdGsvdHVydGxlLnB5CkBAIC0zMCw2ICszMCw3IEBACiAgICAgICAgIHNlbGYuX3RyYWNpbmcgPSAxCiAgICAgICAgIHNlbGYuX2Fycm93ID0gMAogICAgICAgICBzZWxmLl9kZWxheSA9IDEwICAgICAjIGRlZmF1bHQgZGVsYXkgZm9yIGRyYXdpbmcKKyAgICAgICAgc2VsZi5fYW5nbGUgPSAwLjAKICAgICAgICAgc2VsZi5kZWdyZWVzKCkKICAgICAgICAgc2VsZi5yZXNldCgpCiAKQEAgLTM5LDYgKzQwLDEwIEBACiAgICAgICAgIEV4YW1wbGU6CiAgICAgICAgID4+PiB0dXJ0bGUuZGVncmVlcygpCiAgICAgICAgICIiIgorICAgICAgICAjIERvbid0IHRyeSB0byBjaGFuZ2UgX2FuZ2xlIGlmIGl0IGlzIDAsIGJlY2F1c2UKKyAgICAgICAgIyBfZnVsbGNpcmNsZSBtaWdodCBub3QgYmUgc2V0LCB5ZXQKKyAgICAgICAgaWYgc2VsZi5fYW5nbGU6CisgICAgICAgICAgICBzZWxmLl9hbmdsZSA9IChzZWxmLl9hbmdsZSAvIHNlbGYuX2Z1bGxjaXJjbGUpICogZnVsbGNpcmNsZQogICAgICAgICBzZWxmLl9mdWxsY2lyY2xlID0gZnVsbGNpcmNsZQogICAgICAgICBzZWxmLl9pbnZyYWRpYW4gPSBwaSAvIChmdWxsY2lyY2xlICogMC41KQogCkBAIC04MSw3ICs4Niw2IEBACiAgICAgICAgIHNlbGYuX2NvbG9yID0gImJsYWNrIgogICAgICAgICBzZWxmLl9maWxsaW5nID0gMAogICAgICAgICBzZWxmLl9wYXRoID0gW10KLSAgICAgICAgc2VsZi5fdG9maWxsID0gW10KICAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgIGNhbnZhcy5fcm9vdCgpLnRrcmFpc2UoKQogCkBAIC0zMDEsMTkgKzMwNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZpbGwnOiBzZWxmLl9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbW9vdGgnOiBzbW9vdGh9KQogICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQotICAgICAgICAgICAgICAgIGlmIHNlbGYuX3RvZmlsbDoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fdG9maWxsOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FudmFzLml0ZW1jb25maWd1cmUoaXRlbSwgZmlsbD1zZWxmLl9jb2xvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICBzZWxmLl9wYXRoID0gW10KLSAgICAgICAgc2VsZi5fdG9maWxsID0gW10KICAgICAgICAgc2VsZi5fZmlsbGluZyA9IGZsYWcKICAgICAgICAgaWYgZmxhZzoKICAgICAgICAgICAgIHNlbGYuX3BhdGguYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQotICAgICAgICBzZWxmLmZvcndhcmQoMCkKIAogICAgIGRlZiBiZWdpbl9maWxsKHNlbGYpOgogICAgICAgICAiIiIgQ2FsbGVkIGp1c3QgYmVmb3JlIGRyYXdpbmcgYSBzaGFwZSB0byBiZSBmaWxsZWQuCisgICAgICAgICAgICBNdXN0IGV2ZW50dWFsbHkgYmUgZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIGVuZF9maWxsKCkgY2FsbC4KKyAgICAgICAgICAgIE90aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCiAKICAgICAgICAgRXhhbXBsZToKICAgICAgICAgPj4+IHR1cnRsZS5iZWdpbl9maWxsKCkKQEAgLTMyNiw3ICszMjYsOCBAQAogICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQogICAgICAgICA+Pj4gdHVydGxlLmVuZF9maWxsKCkKICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuZmlsbCgxKQorICAgICAgICBzZWxmLl9wYXRoID0gW3NlbGYuX3Bvc2l0aW9uXQorICAgICAgICBzZWxmLl9maWxsaW5nID0gMQogCiAgICAgZGVmIGVuZF9maWxsKHNlbGYpOgogICAgICAgICAiIiIgQ2FsbGVkIGFmdGVyIGRyYXdpbmcgYSBzaGFwZSB0byBiZSBmaWxsZWQuCkBAIC0zNDQsNyArMzQ1LDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZmlsbCgwKQogCi0gICAgZGVmIGNpcmNsZShzZWxmLCByYWRpdXMsIGV4dGVudD1Ob25lKToKKyAgICBkZWYgY2lyY2xlKHNlbGYsIHJhZGl1cywgZXh0ZW50ID0gTm9uZSk6CiAgICAgICAgICIiIiBEcmF3IGEgY2lyY2xlIHdpdGggZ2l2ZW4gcmFkaXVzLgogICAgICAgICBUaGUgY2VudGVyIGlzIHJhZGl1cyB1bml0cyBsZWZ0IG9mIHRoZSB0dXJ0bGU7IGV4dGVudAogICAgICAgICBkZXRlcm1pbmVzIHdoaWNoIHBhcnQgb2YgdGhlIGNpcmNsZSBpcyBkcmF3bi4gSWYgbm90IGdpdmVuLApAQCAtMzYxLDUyICszNjIsMTggQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIGV4dGVudCBpcyBOb25lOgogICAgICAgICAgICAgZXh0ZW50ID0gc2VsZi5fZnVsbGNpcmNsZQotICAgICAgICB4MCwgeTAgPSBzZWxmLl9wb3NpdGlvbgotICAgICAgICB4YyA9IHgwIC0gcmFkaXVzICogc2luKHNlbGYuX2FuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICB5YyA9IHkwIC0gcmFkaXVzICogY29zKHNlbGYuX2FuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICBpZiByYWRpdXMgPj0gMC4wOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSAtIChzZWxmLl9mdWxsY2lyY2xlIC8gNC4wKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSArIChzZWxmLl9mdWxsY2lyY2xlIC8gNC4wKQotICAgICAgICAgICAgZXh0ZW50ID0gLWV4dGVudAotICAgICAgICBpZiBzZWxmLl9maWxsaW5nOgotICAgICAgICAgICAgaWYgYWJzKGV4dGVudCkgPj0gc2VsZi5fZnVsbGNpcmNsZToKLSAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9vdmFsKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9IiIpCi0gICAgICAgICAgICAgICAgc2VsZi5fdG9maWxsLmFwcGVuZChpdGVtKQotICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2NhbnZhcy5jcmVhdGVfYXJjKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjK3JhZGl1cywgeWMrcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJjaG9yZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50PWV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSIiKQotICAgICAgICAgICAgc2VsZi5fdG9maWxsLmFwcGVuZChpdGVtKQotICAgICAgICBpZiBzZWxmLl9kcmF3aW5nOgotICAgICAgICAgICAgaWYgYWJzKGV4dGVudCkgPj0gc2VsZi5fZnVsbGNpcmNsZToKLSAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9vdmFsKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9c2VsZi5fY29sb3IpCi0gICAgICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9hcmMoeGMtcmFkaXVzLCB5Yy1yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImFyYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50PWV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPXNlbGYuX2NvbG9yKQotICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgIGFuZ2xlID0gc3RhcnQgKyBleHRlbnQKLSAgICAgICAgeDEgPSB4YyArIGFicyhyYWRpdXMpICogY29zKGFuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICB5MSA9IHljIC0gYWJzKHJhZGl1cykgKiBzaW4oYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCi0gICAgICAgIHNlbGYuX2FuZ2xlID0gKHNlbGYuX2FuZ2xlICsgZXh0ZW50KSAlIHNlbGYuX2Z1bGxjaXJjbGUKLSAgICAgICAgc2VsZi5fcG9zaXRpb24gPSB4MSwgeTEKLSAgICAgICAgaWYgc2VsZi5fZmlsbGluZzoKLSAgICAgICAgICAgIHNlbGYuX3BhdGguYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQotICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCisgICAgICAgIGZyYWMgPSBhYnMoZXh0ZW50KS9zZWxmLl9mdWxsY2lyY2xlCisgICAgICAgIHN0ZXBzID0gMStpbnQobWluKDExK2FicyhyYWRpdXMpLzYuMCwgNTkuMCkqZnJhYykKKyAgICAgICAgdyA9IDEuMCAqIGV4dGVudCAvIHN0ZXBzCisgICAgICAgIHcyID0gMC41ICogdworICAgICAgICBsID0gMi4wICogcmFkaXVzICogc2luKHcyKnNlbGYuX2ludnJhZGlhbikKKyAgICAgICAgaWYgcmFkaXVzIDwgMDoKKyAgICAgICAgICAgIGwsIHcsIHcyID0gLWwsIC13LCAtdzIKKyAgICAgICAgc2VsZi5sZWZ0KHcyKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzdGVwcyk6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQobCkKKyAgICAgICAgICAgIHNlbGYubGVmdCh3KQorICAgICAgICBzZWxmLnJpZ2h0KHcyKQogCiAgICAgZGVmIGhlYWRpbmcoc2VsZik6CiAgICAgICAgICIiIiBSZXR1cm4gdGhlIHR1cnRsZSdzIGN1cnJlbnQgaGVhZGluZy4KQEAgLTYzNCw2ICs2MDEsNyBAQAogCiAgICAgZGVmIF9kcmF3X3R1cnRsZShzZWxmLCBwb3NpdGlvbj1bXSk6CiAgICAgICAgIGlmIG5vdCBzZWxmLl90cmFjaW5nOgorICAgICAgICAgICAgc2VsZi5fY2FudmFzLnVwZGF0ZSgpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgcG9zaXRpb24gPT0gW106CiAgICAgICAgICAgICBwb3NpdGlvbiA9IHNlbGYuX3Bvc2l0aW9uCkBAIC02NzgsNyArNjQ2LDcgQEAKICAgICAgICAgICAgIF9jYW52YXMgPSBUa2ludGVyLkNhbnZhcyhfcm9vdCwgYmFja2dyb3VuZD0id2hpdGUiKQogICAgICAgICAgICAgX2NhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKIAotICAgICAgICBzZXR1cCh3aWR0aD1fd2lkdGgsIGhlaWdodD0gX2hlaWdodCwgc3RhcnR4PV9zdGFydHgsIHN0YXJ0eT1fc3RhcnR5KQorICAgICAgICAgICAgc2V0dXAod2lkdGg9X3dpZHRoLCBoZWlnaHQ9IF9oZWlnaHQsIHN0YXJ0eD1fc3RhcnR4LCBzdGFydHk9X3N0YXJ0eSkKIAogICAgICAgICBSYXdQZW4uX19pbml0X18oc2VsZiwgX2NhbnZhcykKIApAQCAtNzIwLDcgKzY4OCw3IEBACiBkZWYgd3JpdGUoYXJnLCBtb3ZlPTApOiBfZ2V0cGVuKCkud3JpdGUoYXJnLCBtb3ZlKQogZGVmIGZpbGwoZmxhZyk6IF9nZXRwZW4oKS5maWxsKGZsYWcpCiBkZWYgYmVnaW5fZmlsbCgpOiBfZ2V0cGVuKCkuYmVnaW5fZmlsbCgpCi1kZWYgZW5kX2ZpbGwoKTogX2dldHBlbi5lbmRfZmlsbCgpCitkZWYgZW5kX2ZpbGwoKTogX2dldHBlbigpLmVuZF9maWxsKCkKIGRlZiBjaXJjbGUocmFkaXVzLCBleHRlbnQ9Tm9uZSk6IF9nZXRwZW4oKS5jaXJjbGUocmFkaXVzLCBleHRlbnQpCiBkZWYgZ290bygqYXJncyk6IF9nZXRwZW4oKS5nb3RvKCphcmdzKQogZGVmIGhlYWRpbmcoKTogcmV0dXJuIF9nZXRwZW4oKS5oZWFkaW5nKCkKQEAgLTc0NSw3ICs3MTMsNyBAQAogZGVmIHNldHVwKCoqZ2VvbWV0cnkpOgogICAgICIiIiBTZXRzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgbWFpbiB3aW5kb3cuCiAKLSAgICBLZXl3b3JkcyBhcmUgd2lkdGgsIGhlaWdodCwgc3RhcnR4IGFuZCBzdGFydHkKKyAgICBLZXl3b3JkcyBhcmUgd2lkdGgsIGhlaWdodCwgc3RhcnR4IGFuZCBzdGFydHk6CiAKICAgICB3aWR0aDogZWl0aGVyIGEgc2l6ZSBpbiBwaXhlbHMgb3IgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgogICAgICAgRGVmYXVsdCBpcyA1MCUgb2Ygc2NyZWVuLgpAQCAtODIwLDcgKzc4OCw3IEBACiAgICAgICAgIF9yb290Lmdlb21ldHJ5KCIlZHglZCslZCslZCIgJSAoX3dpZHRoLCBfaGVpZ2h0LCBfc3RhcnR4LCBfc3RhcnR5KSkKIAogZGVmIHRpdGxlKHRpdGxlKToKLSAgICAiIiIgc2V0IHRoZSB3aW5kb3cgdGl0bGUuCisgICAgIiIiU2V0IHRoZSB3aW5kb3cgdGl0bGUuCiAKICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvICdUdXJ0bGUgR3JhcGhpY3MnCiAKQEAgLTkyOSwxNSArODk3LDMwIEBACiAgICAgICAgICAgICBzcGVlZChzcGVlZHNbc3BdKQogICAgIGNvbG9yKDAuMjUsMCwwLjc1KQogICAgIGZpbGwoMCkKLSAgICBjb2xvcigiZ3JlZW4iKQogCi0gICAgbGVmdCgxMzApCisgICAgIyBkcmF3IGFuZCBmaWxsIGEgY29uY2F2ZSBzaGFwZQorICAgIGxlZnQoMTIwKQogICAgIHVwKCkKLSAgICBmb3J3YXJkKDkwKQorICAgIGZvcndhcmQoNzApCisgICAgcmlnaHQoMzApCisgICAgZG93bigpCiAgICAgY29sb3IoInJlZCIpCi0gICAgc3BlZWQoJ2Zhc3Rlc3QnKQorICAgIHNwZWVkKCJmYXN0ZXN0IikKKyAgICBmaWxsKDEpCisgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgIGNpcmNsZSg1MCw5MCkKKyAgICAgICAgcmlnaHQoOTApCisgICAgICAgIGZvcndhcmQoMzApCisgICAgICAgIHJpZ2h0KDkwKQorICAgIGNvbG9yKCJ5ZWxsb3ciKQorICAgIGZpbGwoMCkKKyAgICBsZWZ0KDkwKQorICAgIHVwKCkKKyAgICBmb3J3YXJkKDMwKQogICAgIGRvd24oKTsKIAorICAgIGNvbG9yKCJyZWQiKQorCiAgICAgIyBjcmVhdGUgYSBzZWNvbmQgdHVydGxlIGFuZCBtYWtlIHRoZSBvcmlnaW5hbCBwdXJzdWUgYW5kIGNhdGNoIGl0CiAgICAgdHVydGxlPVR1cnRsZSgpCiAgICAgdHVydGxlLnJlc2V0KCkKZGlmZiAtLWdpdCBhL0xpYi9saW5lY2FjaGUucHkgYi9MaWIvbGluZWNhY2hlLnB5CmluZGV4IGY0OTY5NWEuLjQ4Mzg2MjUgMTAwNjQ0Ci0tLSBhL0xpYi9saW5lY2FjaGUucHkKKysrIGIvTGliL2xpbmVjYWNoZS5weQpAQCAtOTQsNiArOTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBsdWNrLCB0aGUgUEVQMzAyIGxvYWRlciBjYW5ub3QgZmluZCB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhpcyBtb2R1bGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5lKydcbicgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCldLCBmdWxsbmFtZQpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvY29uZmlnLnB5IGIvTGliL2xvZ2dpbmcvY29uZmlnLnB5CmluZGV4IDQ1N2VjNWMuLjFkNWY4YzQgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2NvbmZpZy5weQorKysgYi9MaWIvbG9nZ2luZy9jb25maWcucHkKQEAgLTc5LDYgKzc5LDcgQEAKICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCiAgICAgdHJ5OgogICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCisgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJMaXN0ID0gW10KICAgICAgICAgIyBIYW5kbGVycyBhZGQgdGhlbXNlbHZlcyB0byBsb2dnaW5nLl9oYW5kbGVycwogICAgICAgICBoYW5kbGVycyA9IF9pbnN0YWxsX2hhbmRsZXJzKGNwLCBmb3JtYXR0ZXJzKQogICAgICAgICBfaW5zdGFsbF9sb2dnZXJzKGNwLCBoYW5kbGVycykKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5IGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKaW5kZXggZTBkYTI1NC4uMzU1Mjk1MCAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKKysrIGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKQEAgLTEyOCwxMiArMTI4LDcgQEAKICAgICAgICAgICAgIGRmbiA9IHNlbGYuYmFzZUZpbGVuYW1lICsgIi4xIgogICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGZuKToKICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQotICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKyAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQogICAgICAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gY29kZWNzLm9wZW4oc2VsZi5iYXNlRmlsZW5hbWUsICd3Jywgc2VsZi5lbmNvZGluZykKQEAgLTI3MywxMiArMjY4LDcgQEAKICAgICAgICAgZGZuID0gc2VsZi5iYXNlRmlsZW5hbWUgKyAiLiIgKyB0aW1lLnN0cmZ0aW1lKHNlbGYuc3VmZml4LCB0aW1lVHVwbGUpCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CiAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKLSAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICByYWlzZQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKyAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCiAgICAgICAgIGlmIHNlbGYuYmFja3VwQ291bnQgPiAwOgogICAgICAgICAgICAgIyBmaW5kIHRoZSBvbGRlc3QgbG9nIGZpbGUgYW5kIGRlbGV0ZSBpdAogICAgICAgICAgICAgcyA9IGdsb2IuZ2xvYihzZWxmLmJhc2VGaWxlbmFtZSArICIuMjAqIikKQEAgLTU3Miw2ICs1NjIsMTggQEAKICAgICAgICAgImxvY2FsNyI6ICAgTE9HX0xPQ0FMNywKICAgICAgICAgfQogCisgICAgI1RoZSBtYXAgYmVsb3cgYXBwZWFycyB0byBiZSB0cml2aWFsbHkgbG93ZXJjYXNpbmcgdGhlIGtleS4gSG93ZXZlciwKKyAgICAjdGhlcmUncyBtb3JlIHRvIGl0IHRoYW4gbWVldHMgdGhlIGV5ZSAtIGluIHNvbWUgbG9jYWxlcywgbG93ZXJjYXNpbmcKKyAgICAjZ2l2ZXMgdW5leHBlY3RlZCByZXN1bHRzLiBTZWUgU0YgIzE1MjQwODE6IGluIHRoZSBUdXJraXNoIGxvY2FsZSwKKyAgICAjIklORk8iLmxvd2VyKCkgIT0gImluZm8iCisgICAgcHJpb3JpdHlfbWFwID0geworICAgICAgICAiREVCVUciIDogImRlYnVnIiwKKyAgICAgICAgIklORk8iIDogImluZm8iLAorICAgICAgICAiV0FSTklORyIgOiAid2FybmluZyIsCisgICAgICAgICJFUlJPUiIgOiAiZXJyb3IiLAorICAgICAgICAiQ1JJVElDQUwiIDogImNyaXRpY2FsIgorICAgIH0KKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzPSgnbG9jYWxob3N0JywgU1lTTE9HX1VEUF9QT1JUKSwgZmFjaWxpdHk9TE9HX1VTRVIpOgogICAgICAgICAiIiIKICAgICAgICAgSW5pdGlhbGl6ZSBhIGhhbmRsZXIuCkBAIC02MDgsNyArNjEwLDcgQEAKICAgICAjICAgbmVjZXNzYXJ5LgogICAgIGxvZ19mb3JtYXRfc3RyaW5nID0gJzwlZD4lc1wwMDAnCiAKLSAgICBkZWYgZW5jb2RlUHJpb3JpdHkgKHNlbGYsIGZhY2lsaXR5LCBwcmlvcml0eSk6CisgICAgZGVmIGVuY29kZVByaW9yaXR5KHNlbGYsIGZhY2lsaXR5LCBwcmlvcml0eSk6CiAgICAgICAgICIiIgogICAgICAgICBFbmNvZGUgdGhlIGZhY2lsaXR5IGFuZCBwcmlvcml0eS4gWW91IGNhbiBwYXNzIGluIHN0cmluZ3Mgb3IKICAgICAgICAgaW50ZWdlcnMgLSBpZiBzdHJpbmdzIGFyZSBwYXNzZWQsIHRoZSBmYWNpbGl0eV9uYW1lcyBhbmQKQEAgLTYyOSw2ICs2MzEsMTYgQEAKICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKICAgICAgICAgbG9nZ2luZy5IYW5kbGVyLmNsb3NlKHNlbGYpCiAKKyAgICBkZWYgbWFwUHJpb3JpdHkoc2VsZiwgbGV2ZWxOYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcCBhIGxvZ2dpbmcgbGV2ZWwgbmFtZSB0byBhIGtleSBpbiB0aGUgcHJpb3JpdHlfbmFtZXMgbWFwLgorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpbiB0d28gc2NlbmFyaW9zOiB3aGVuIGN1c3RvbSBsZXZlbHMgYXJlIGJlaW5nCisgICAgICAgIHVzZWQsIGFuZCBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgY2FuJ3QgZG8gYSBzdHJhaWdodGZvcndhcmQKKyAgICAgICAgbWFwcGluZyBieSBsb3dlcmNhc2luZyB0aGUgbG9nZ2luZyBsZXZlbCBuYW1lIGJlY2F1c2Ugb2YgbG9jYWxlLQorICAgICAgICBzcGVjaWZpYyBpc3N1ZXMgKHNlZSBTRiAjMTUyNDA4MSkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcmlvcml0eV9tYXAuZ2V0KGxldmVsTmFtZSwgIndhcm5pbmciKQorCiAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgIiIiCiAgICAgICAgIEVtaXQgYSByZWNvcmQuCkBAIC02NDMsOCArNjU1LDggQEAKICAgICAgICAgIiIiCiAgICAgICAgIG1zZyA9IHNlbGYubG9nX2Zvcm1hdF9zdHJpbmcgJSAoCiAgICAgICAgICAgICBzZWxmLmVuY29kZVByaW9yaXR5KHNlbGYuZmFjaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5sb3dlcihyZWNvcmQubGV2ZWxuYW1lKSksCi0gICAgICAgICAgICBtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFwUHJpb3JpdHkocmVjb3JkLmxldmVsbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYudW5peHNvY2tldDoKICAgICAgICAgICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvbWFpbGJveC5weSBiL0xpYi9tYWlsYm94LnB5CmluZGV4IGJiMTE1ZTEuLmI3MjEyOGIgMTAwNzU1Ci0tLSBhL0xpYi9tYWlsYm94LnB5CisrKyBiL0xpYi9tYWlsYm94LnB5CkBAIC0xNSw3ICsxNSwxMCBAQAogaW1wb3J0IHJmYzgyMgogaW1wb3J0IFN0cmluZ0lPCiB0cnk6Ci0gICAgaW1wb3J0IGZuY3RsCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICAjIE9TLzIgRU1YIGZjbnRsKCkgbm90IGFkZXF1YXRlCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisgICAgaW1wb3J0IGZjbnRsCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgZmNudGwgPSBOb25lCiAKQEAgLTU2NSw3ICs1NjgsOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6Ci0gICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUIG9yIFwKKyAgICAgICAgICAgICAgKG9zLm5hbWUgPT0gJ29zMicgYW5kIGUuZXJybm8gPT0gZXJybm8uRUFDQ0VTKToKICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5fcGF0aCkKICAgICAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKICAgICAgICAgICAgIGVsc2U6CkBAIC0xMDMwLDYgKzEwMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKHByZXYgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbm5vdCB1bmxpbmsgYW4gb3BlbiBmaWxlIG9uIE9TLzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQpAQCAtMTc5OCwyNiArMTgwNSwxOCBAQAogCiAKIGRlZiBfbG9ja19maWxlKGYsIGRvdGxvY2s9VHJ1ZSk6Ci0gICAgIiIiTG9jayBmaWxlIGYgdXNpbmcgbG9ja2YsIGZsb2NrLCBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgIiIiTG9jayBmaWxlIGYgdXNpbmcgbG9ja2YgYW5kIGRvdCBsb2NraW5nLiIiIgogICAgIGRvdGxvY2tfZG9uZSA9IEZhbHNlCiAgICAgdHJ5OgogICAgICAgICBpZiBmY250bDoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgotICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUFHQUlOOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVBR0FJTiwgZXJybm8uRUFDQ0VTKToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdsb2NrZjogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfRVggfCBmY250bC5MT0NLX05CKQotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FV09VTERCTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdmbG9jazogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICBpZiBkb3Rsb2NrOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHByZV9sb2NrID0gX2NyZWF0ZV90ZW1wb3JhcnkoZi5uYW1lICsgJy5sb2NrJykKQEAgLTE4MzYsNyArMTgzNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwcmVfbG9jay5uYW1lLCBmLm5hbWUgKyAnLmxvY2snKQogICAgICAgICAgICAgICAgICAgICBkb3Rsb2NrX2RvbmUgPSBUcnVlCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVCBvciBcCisgICAgICAgICAgICAgICAgICAob3MubmFtZSA9PSAnb3MyJyBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUNDRVMpOgogICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocHJlX2xvY2submFtZSkKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdkb3QgbG9jayB1bmF2YWlsYWJsZTogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKQEAgLTE4NDUsMTYgKzE4NDUsMTQgQEAKICAgICBleGNlcHQ6CiAgICAgICAgIGlmIGZjbnRsOgogICAgICAgICAgICAgZmNudGwubG9ja2YoZiwgZmNudGwuTE9DS19VTikKLSAgICAgICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCiAgICAgICAgIGlmIGRvdGxvY2tfZG9uZToKICAgICAgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQogICAgICAgICByYWlzZQogCiBkZWYgX3VubG9ja19maWxlKGYpOgotICAgICIiIlVubG9jayBmaWxlIGYgdXNpbmcgbG9ja2YsIGZsb2NrLCBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgIiIiVW5sb2NrIGZpbGUgZiB1c2luZyBsb2NrZiBhbmQgZG90IGxvY2tpbmcuIiIiCiAgICAgaWYgZmNudGw6CiAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfVU4pCi0gICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCiAgICAgaWYgb3MucGF0aC5leGlzdHMoZi5uYW1lICsgJy5sb2NrJyk6CiAgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQogCmRpZmYgLS1naXQgYS9MaWIvbWltZXR5cGVzLnB5IGIvTGliL21pbWV0eXBlcy5weQppbmRleCBiZWUyZmY3Li5iMGQyZjE4IDEwMDY0NAotLS0gYS9MaWIvbWltZXR5cGVzLnB5CisrKyBiL0xpYi9taW1ldHlwZXMucHkKQEAgLTMzLDYgKzMzLDEwIEBACiAKIGtub3duZmlsZXMgPSBbCiAgICAgIi9ldGMvbWltZS50eXBlcyIsCisgICAgIi9ldGMvaHR0cGQvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICAgICAjIE1hYyBPUyBYCisgICAgIi9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAjIEFwYWNoZQorICAgICIvZXRjL2FwYWNoZS9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAgIyBBcGFjaGUgMQorICAgICIvZXRjL2FwYWNoZTIvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICAgIyBBcGFjaGUgMgogICAgICIvdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLAogICAgICIvdXNyL2xvY2FsL2xpYi9uZXRzY2FwZS9taW1lLnR5cGVzIiwKICAgICAiL3Vzci9sb2NhbC9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwgICAgICMgQXBhY2hlIDEuMgpkaWZmIC0tZ2l0IGEvTGliL21zaWxpYi9fX2luaXRfXy5weSBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKaW5kZXggMDg4MTQwOS4uNGJlODJiMCAxMDA2NDQKLS0tIGEvTGliL21zaWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAgICAgc2VsZi5maWxlbmFtZXMgPSBzZXRzLlNldCgpCiAgICAgICAgIHNlbGYuaW5kZXggPSAwCiAKLSAgICBkZWYgZ2VuX2lkKHNlbGYsIGRpciwgZmlsZSk6CisgICAgZGVmIGdlbl9pZChzZWxmLCBmaWxlKToKICAgICAgICAgbG9naWNhbCA9IF9sb2dpY2FsID0gbWFrZV9pZChmaWxlKQogICAgICAgICBwb3MgPSAxCiAgICAgICAgIHdoaWxlIGxvZ2ljYWwgaW4gc2VsZi5maWxlbmFtZXM6CkBAIC0xOTYsOSArMTk2LDExIEBACiAgICAgICAgIHNlbGYuZmlsZW5hbWVzLmFkZChsb2dpY2FsKQogICAgICAgICByZXR1cm4gbG9naWNhbAogCi0gICAgZGVmIGFwcGVuZChzZWxmLCBmdWxsLCBsb2dpY2FsKToKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGZ1bGwsIGZpbGUsIGxvZ2ljYWwpOgogICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGwpOgogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBsb2dpY2FsOgorICAgICAgICAgICAgbG9naWNhbCA9IHNlbGYuZ2VuX2lkKGZpbGUpCiAgICAgICAgIHNlbGYuaW5kZXggKz0gMQogICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZCgoZnVsbCwgbG9naWNhbCkpCiAgICAgICAgIHJldHVybiBzZWxmLmluZGV4LCBsb2dpY2FsCkBAIC0zMjgsNyArMzMwLDcgQEAKICAgICAgICAgICAgIGxvZ2ljYWwgPSBzZWxmLmtleWZpbGVzW2ZpbGVdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBsb2dpY2FsID0gTm9uZQotICAgICAgICBzZXF1ZW5jZSwgbG9naWNhbCA9IHNlbGYuY2FiLmFwcGVuZChhYnNvbHV0ZSwgbG9naWNhbCkKKyAgICAgICAgc2VxdWVuY2UsIGxvZ2ljYWwgPSBzZWxmLmNhYi5hcHBlbmQoYWJzb2x1dGUsIGZpbGUsIGxvZ2ljYWwpCiAgICAgICAgIGFzc2VydCBsb2dpY2FsIG5vdCBpbiBzZWxmLmlkcwogICAgICAgICBzZWxmLmlkcy5hZGQobG9naWNhbCkKICAgICAgICAgc2hvcnQgPSBzZWxmLm1ha2Vfc2hvcnQoZmlsZSkKQEAgLTQwMyw3ICs0MDUsNyBAQAogICAgICAgICAgICAgICAgICBbKHNlbGYuZGxnLm5hbWUsIHNlbGYubmFtZSwgZXZlbnQsIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgb3JkZXJpbmcpXSkKIAotICAgIGRlZiBtYXBwaW5nKHNlbGYsIG1hcHBpbmcsIGF0dHJpYnV0ZSk6CisgICAgZGVmIG1hcHBpbmcoc2VsZiwgZXZlbnQsIGF0dHJpYnV0ZSk6CiAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGxnLmRiLCAiRXZlbnRNYXBwaW5nIiwKICAgICAgICAgICAgICAgICAgWyhzZWxmLmRsZy5uYW1lLCBzZWxmLm5hbWUsIGV2ZW50LCBhdHRyaWJ1dGUpXSkKIApkaWZmIC0tZ2l0IGEvTGliL29wdHBhcnNlLnB5IGIvTGliL29wdHBhcnNlLnB5CmluZGV4IDZiOGY1ZDEuLjYyZDJmN2UgMTAwNjQ0Ci0tLSBhL0xpYi9vcHRwYXJzZS5weQorKysgYi9MaWIvb3B0cGFyc2UucHkKQEAgLTE2LDcgKzE2LDcgQEAKICMgUHl0aG9uIGRldmVsb3BlcnM6IHBsZWFzZSBkbyBub3QgbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSwgc2luY2UKICMgaXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT3B0aWsgc291cmNlIGNvZGUuCiAKLV9fdmVyc2lvbl9fID0gIjEuNS4xIgorX192ZXJzaW9uX18gPSAiMS41LjMiCiAKIF9fYWxsX18gPSBbJ09wdGlvbicsCiAgICAgICAgICAgICdTVVBQUkVTU19IRUxQJywKQEAgLTc1LDkgKzc1LDkgQEAKIAogCiAjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb206Ci0jICAgSWQ6IG9wdGlvbl9wYXJzZXIucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCi0jICAgSWQ6IG9wdGlvbi5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKLSMgICBJZDogaGVscC5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKKyMgICBJZDogb3B0aW9uX3BhcnNlci5weSA1MjcgMjAwNi0wNy0yMyAxNToyMTozMFogZ3JlZworIyAgIElkOiBvcHRpb24ucHkgNTIyIDIwMDYtMDYtMTEgMTY6MjI6MDNaIGd3YXJkCisjICAgSWQ6IGhlbHAucHkgNTI3IDIwMDYtMDctMjMgMTU6MjE6MzBaIGdyZWcKICMgICBJZDogZXJyb3JzLnB5IDUwOSAyMDA2LTA0LTIwIDAwOjU4OjI0WiBnd2FyZAogCiB0cnk6CkBAIC0xNjI5LDYgKzE2MjksMTMgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmZvcm1hdF9lcGlsb2coZm9ybWF0dGVyKSkKICAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQogCisgICAgIyB1c2VkIGJ5IHRlc3Qgc3VpdGUKKyAgICBkZWYgX2dldF9lbmNvZGluZyhzZWxmLCBmaWxlKToKKyAgICAgICAgZW5jb2RpbmcgPSBnZXRhdHRyKGZpbGUsICJlbmNvZGluZyIsIE5vbmUpCisgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHJldHVybiBlbmNvZGluZworCiAgICAgZGVmIHByaW50X2hlbHAoc2VsZiwgZmlsZT1Ob25lKToKICAgICAgICAgIiIicHJpbnRfaGVscChmaWxlIDogZmlsZSA9IHN0ZG91dCkKIApAQCAtMTYzNyw3ICsxNjQ0LDggQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0Ci0gICAgICAgIGZpbGUud3JpdGUoc2VsZi5mb3JtYXRfaGVscCgpKQorICAgICAgICBlbmNvZGluZyA9IHNlbGYuX2dldF9lbmNvZGluZyhmaWxlKQorICAgICAgICBmaWxlLndyaXRlKHNlbGYuZm9ybWF0X2hlbHAoKS5lbmNvZGUoZW5jb2RpbmcsICJyZXBsYWNlIikpCiAKICMgY2xhc3MgT3B0aW9uUGFyc2VyCiAKZGlmZiAtLWdpdCBhL0xpYi9vcy5weSBiL0xpYi9vcy5weQppbmRleCAzMTAwMmFjLi4yZDFiMjliIDEwMDY0NAotLS0gYS9MaWIvb3MucHkKKysrIGIvTGliL29zLnB5CkBAIC03MjMsNyArNzIzLDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF91cmFuZG9tZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiL2Rldi91cmFuZG9tIChvciBlcXVpdmFsZW50KSBub3QgZm91bmQiKQogICAgICAgICBieXRlcyA9ICIiCiAgICAgICAgIHdoaWxlIGxlbihieXRlcykgPCBuOgpkaWZmIC0tZ2l0IGEvTGliL3BkYi5weSBiL0xpYi9wZGIucHkKaW5kZXggOTRmNjFmNy4uMDYxODFlNyAxMDA3NTUKLS0tIGEvTGliL3BkYi5weQorKysgYi9MaWIvcGRiLnB5CkBAIC0yMzUsNyArMjM1LDggQEAKICAgICAgICAgIiIiSW50ZXJwcmV0IHRoZSBhcmd1bWVudCBhcyB0aG91Z2ggaXQgaGFkIGJlZW4gdHlwZWQgaW4gcmVzcG9uc2UKICAgICAgICAgdG8gdGhlIHByb21wdC4KIAotICAgICAgICBDaGVja3Mgd2V0aGVyICB0aGlzIGxpbmUgaXMgdHlwZWQgaW4gdGhlIG5vcm1hbCBwcm9tcHQgb3IgaW4gYSBicmVha3BvaW50IGNvbW1hbmQgbGlzdCBkZWZpbml0aW9uCisgICAgICAgIENoZWNrcyB3aGV0aGVyIHRoaXMgbGluZSBpcyB0eXBlZCBhdCB0aGUgbm9ybWFsIHByb21wdCBvciBpbgorICAgICAgICBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19kZWZpbmluZzoKICAgICAgICAgICAgIHJldHVybiBjbWQuQ21kLm9uZWNtZChzZWxmLCBsaW5lKQpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCAyNmM3OTdmLi4zNzczOGU0IDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtNjksNyArNjksMzMgQEAKIAogCiBkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKLSAgICAiIiJZaWVsZCBzdWJtb2R1bGUgbmFtZXMrbG9hZGVycyByZWN1cnNpdmVseSwgZm9yIHBhdGggb3Igc3lzLnBhdGgiIiIKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKKyAgICBvbiBwYXRoLCBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgYWNjZXNzaWJsZSBtb2R1bGVzLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKworICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgaW1wb3J0IGFsbCAqcGFja2FnZXMqIChOT1QgYWxsCisgICAgbW9kdWxlcyEpIG9uIHRoZSBnaXZlbiBwYXRoLCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIF9fcGF0aF9fCisgICAgYXR0cmlidXRlIHRvIGZpbmQgc3VibW9kdWxlcy4KKworICAgICdvbmVycm9yJyBpcyBhIGZ1bmN0aW9uIHdoaWNoIGdldHMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50ICh0aGUKKyAgICBuYW1lIG9mIHRoZSBwYWNrYWdlIHdoaWNoIHdhcyBiZWluZyBpbXBvcnRlZCkgaWYgYW55IGV4Y2VwdGlvbgorICAgIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IGEgcGFja2FnZS4gIElmIG5vIG9uZXJyb3IgZnVuY3Rpb24gaXMKKyAgICBzdXBwbGllZCwgSW1wb3J0RXJyb3JzIGFyZSBjYXVnaHQgYW5kIGlnbm9yZWQsIHdoaWxlIGFsbCBvdGhlcgorICAgIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQsIHRlcm1pbmF0aW5nIHRoZSBzZWFyY2guCisKKyAgICBFeGFtcGxlczoKKworICAgICMgbGlzdCBhbGwgbW9kdWxlcyBweXRob24gY2FuIGFjY2VzcworICAgIHdhbGtfcGFja2FnZXMoKQorCisgICAgIyBsaXN0IGFsbCBzdWJtb2R1bGVzIG9mIGN0eXBlcworICAgIHdhbGtfcGFja2FnZXMoY3R5cGVzLl9fcGF0aF9fLCBjdHlwZXMuX19uYW1lX18rJy4nKQorICAgICIiIgogCiAgICAgZGVmIHNlZW4ocCwgbT17fSk6CiAgICAgICAgIGlmIHAgaW4gbToKQEAgLTg0LDE5ICsxMTAsMzMgQEAKICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpCisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW25hbWVdLCAnX19wYXRoX18nLCBOb25lKSBvciBbXQogCiAgICAgICAgICAgICAgICAgIyBkb24ndCB0cmF2ZXJzZSBwYXRoIGl0ZW1zIHdlJ3ZlIHNlZW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgcGF0aCA9IFtwIGZvciBwIGluIHBhdGggaWYgbm90IHNlZW4ocCldCiAKLSAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nKToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nLCBvbmVycm9yKToKICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQogCiAKIGRlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgotICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisgICAgIiIiWWllbGRzIChtb2R1bGVfbG9hZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBzdWJtb2R1bGVzIG9uIHBhdGgsCisgICAgb3IsIGlmIHBhdGggaXMgTm9uZSwgYWxsIHRvcC1sZXZlbCBtb2R1bGVzIG9uIHN5cy5wYXRoLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKyAgICAiIiIKKwogICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgaW1wb3J0ZXJzID0gaXRlcl9pbXBvcnRlcnMoKQogICAgIGVsc2U6CkBAIC0yMDgsNiArMjQ4LDcgQEAKIAogICAgIGRlZiBfcmVvcGVuKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmZpbGUgYW5kIHNlbGYuZmlsZS5jbG9zZWQ6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCiAgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKICAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyVScpCiAgICAgICAgICAgICBlbGlmIG1vZF90eXBlIGluIChpbXAuUFlfQ09NUElMRUQsIGltcC5DX0VYVEVOU0lPTik6CkBAIC0zNDAsOSArMzgxLDcgQEAKICAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQogICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5zZXRkZWZhdWx0KHBhdGhfaXRlbSwgaW1wb3J0ZXIpCiAKLSAgICAjIFRoZSBib29sZWFuIHZhbHVlcyBhcmUgdXNlZCBmb3IgY2FjaGluZyB2YWxpZCBhbmQgaW52YWxpZAotICAgICMgZmlsZSBwYXRocyBmb3IgdGhlIGJ1aWx0LWluIGltcG9ydCBtYWNoaW5lcnkKLSAgICBpZiBpbXBvcnRlciBpbiAoTm9uZSwgVHJ1ZSwgRmFsc2UpOgorICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydGVyID0gSW1wSW1wb3J0ZXIocGF0aF9pdGVtKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvcG9wZW4yLnB5IGIvTGliL3BvcGVuMi5weQppbmRleCBiOTY2ZDRjLi42OTQ5NzllIDEwMDY0NAotLS0gYS9MaWIvcG9wZW4yLnB5CisrKyBiL0xpYi9wb3BlbjIucHkKQEAgLTcyLDE0ICs3MiwxNCBAQAogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQogICAgICAgICBpZiBzZWxmLnN0cyA8IDA6Ci0gICAgICAgICAgICBpZiBfYWN0aXZlOgorICAgICAgICAgICAgaWYgX2FjdGl2ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCiAgICAgICAgICAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKIAogICAgIGRlZiBfcnVuX2NoaWxkKHNlbGYsIGNtZCk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIGNtZCA9IFsnL2Jpbi9zaCcsICctYycsIGNtZF0KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgTUFYRkQpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMywgTUFYRkQpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG9zLmNsb3NlKGkpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9wc3RhdHMucHkgYi9MaWIvcHN0YXRzLnB5CmluZGV4IGMzYTg4MjguLjRlOTRiMGMgMTAwNjQ0Ci0tLSBhL0xpYi9wc3RhdHMucHkKKysrIGIvTGliL3BzdGF0cy5weQpAQCAtNTQ4LDggKzU0OCwxMCBAQAogICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSAiJSAiCiAgICAgICAgICAgICBpZiBwcm9maWxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBTdGF0cyhwcm9maWxlKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5zdGF0cy5zdHJlYW0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN5cy5zdGRvdXQKIAogICAgICAgICBkZWYgZ2VuZXJpYyhzZWxmLCBmbiwgbGluZSk6CiAgICAgICAgICAgICBhcmdzID0gbGluZS5zcGxpdCgpCkBAIC02NjcsMTQgKzY2OSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGltcG9ydCBzeXMKLSAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIldlbGNvbWUgdG8gdGhlIHByb2ZpbGUgc3RhdGlzdGljcyBicm93c2VyLiIKICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKICAgICAgICAgaW5pdHByb2ZpbGUgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIGluaXRwcm9maWxlID0gTm9uZQogICAgIHRyeToKLSAgICAgICAgUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpLmNtZGxvb3AoKQotICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkdvb2RieWUuIgorICAgICAgICBicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpCisgICAgICAgIHByaW50ID4+IGJyb3dzZXIuc3RyZWFtLCAiV2VsY29tZSB0byB0aGUgcHJvZmlsZSBzdGF0aXN0aWNzIGJyb3dzZXIuIgorICAgICAgICBicm93c2VyLmNtZGxvb3AoKQorICAgICAgICBwcmludCA+PiBicm93c2VyLnN0cmVhbSwgIkdvb2RieWUuIgogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKaW5kZXggY2YzODYzMC4uMjljNmNjNCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtMzE4LDYgKzMxOCw4IEBACiAgICAgICAgICMgaWRlbnRpZmllcyBzb21ldGhpbmcgaW4gYSB3YXkgdGhhdCBweWRvYyBpdHNlbGYgaGFzIGlzc3VlcyBoYW5kbGluZzsKICAgICAgICAgIyB0aGluayAnc3VwZXInIGFuZCBob3cgaXQgaXMgYSBkZXNjcmlwdG9yICh3aGljaCByYWlzZXMgdGhlIGV4Y2VwdGlvbgogICAgICAgICAjIGJ5IGxhY2tpbmcgYSBfX25hbWVfXyBhdHRyaWJ1dGUpIGFuZCBhbiBpbnN0YW5jZS4KKyAgICAgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKKyAgICAgICAgaWYgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgaW5zcGVjdC5pc21vZHVsZShvYmplY3QpOiByZXR1cm4gc2VsZi5kb2Ntb2R1bGUoKmFyZ3MpCiAgICAgICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jY2xhc3MoKmFyZ3MpCkBAIC0zMzMsNyArMzM1LDcgQEAKICAgICAgICAgICAgIG5hbWUgYW5kICcgJyArIHJlcHIobmFtZSksIHR5cGUob2JqZWN0KS5fX25hbWVfXykKICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBtZXNzYWdlCiAKLSAgICBkb2Ntb2R1bGUgPSBkb2NjbGFzcyA9IGRvY3JvdXRpbmUgPSBkb2NvdGhlciA9IGZhaWwKKyAgICBkb2Ntb2R1bGUgPSBkb2NjbGFzcyA9IGRvY3JvdXRpbmUgPSBkb2NvdGhlciA9IGRvY3Byb3BlcnR5ID0gZG9jZGF0YSA9IGZhaWwKIAogICAgIGRlZiBnZXRkb2Nsb2Moc2VsZiwgb2JqZWN0KToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiBtb2R1bGUgZG9jcyBvciBOb25lIiIiCkBAIC05MTUsNiArOTE3LDEwIEBACiAgICAgICAgIGxocyA9IG5hbWUgYW5kICc8c3Ryb25nPiVzPC9zdHJvbmc+ID0gJyAlIG5hbWUgb3IgJycKICAgICAgICAgcmV0dXJuIGxocyArIHNlbGYucmVwcihvYmplY3QpCiAKKyAgICBkZWYgZG9jZGF0YShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIGh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIGRlc2NyaXB0b3IuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCiAgICAgZGVmIGluZGV4KHNlbGYsIGRpciwgc2hhZG93ZWQ9Tm9uZSk6CiAgICAgICAgICIiIkdlbmVyYXRlIGFuIEhUTUwgaW5kZXggZm9yIGEgZGlyZWN0b3J5IG9mIG1vZHVsZXMuIiIiCiAgICAgICAgIG1vZHBrZ3MgPSBbXQpAQCAtMTI2OCw2ICsxMjc0LDEwIEBACiAgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIHByb3BlcnR5LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCBvYmplY3QsIG1vZCkKIAorICAgIGRlZiBkb2NkYXRhKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGRhdGEgZGVzY3JpcHRvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgb2JqZWN0LCBtb2QpCisKICAgICBkZWYgZG9jb3RoZXIoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBwYXJlbnQ9Tm9uZSwgbWF4bGVuPU5vbmUsIGRvYz1Ob25lKToKICAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZGF0YSBvYmplY3QuIiIiCiAgICAgICAgIHJlcHIgPSBzZWxmLnJlcHIob2JqZWN0KQpAQCAtMTM5Nyw2ICsxNDA3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gJ21vZHVsZSAnICsgdGhpbmcuX19uYW1lX18KICAgICBpZiBpbnNwZWN0LmlzYnVpbHRpbih0aGluZyk6CiAgICAgICAgIHJldHVybiAnYnVpbHQtaW4gZnVuY3Rpb24gJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IodGhpbmcpOgorICAgICAgICByZXR1cm4gJ2dldHNldCBkZXNjcmlwdG9yICVzLiVzLiVzJyAlICgKKyAgICAgICAgICAgIHRoaW5nLl9fb2JqY2xhc3NfXy5fX21vZHVsZV9fLCB0aGluZy5fX29iamNsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICB0aGluZy5fX25hbWVfXykKKyAgICBpZiBpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcih0aGluZyk6CisgICAgICAgIHJldHVybiAnbWVtYmVyIGRlc2NyaXB0b3IgJXMuJXMuJXMnICUgKAorICAgICAgICAgICAgdGhpbmcuX19vYmpjbGFzc19fLl9fbW9kdWxlX18sIHRoaW5nLl9fb2JqY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgIHRoaW5nLl9fbmFtZV9fKQogICAgIGlmIGluc3BlY3QuaXNjbGFzcyh0aGluZyk6CiAgICAgICAgIHJldHVybiAnY2xhc3MgJyArIHRoaW5nLl9fbmFtZV9fCiAgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKHRoaW5nKToKQEAgLTE0NTMsNiArMTQ3MSw4IEBACiAgICAgICAgIGlmIG5vdCAoaW5zcGVjdC5pc21vZHVsZShvYmplY3QpIG9yCiAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2NsYXNzKG9iamVjdCkgb3IKICAgICAgICAgICAgICAgICBpbnNwZWN0Lmlzcm91dGluZShvYmplY3QpIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KSBvcgorICAgICAgICAgICAgICAgIGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCkgb3IKICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG9iamVjdCwgcHJvcGVydHkpKToKICAgICAgICAgICAgICMgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYSBwaWVjZSBvZiBkYXRhIG9yIGFuIGluc3RhbmNlLAogICAgICAgICAgICAgIyBkb2N1bWVudCBpdHMgYXZhaWxhYmxlIG1ldGhvZHMgaW5zdGVhZCBvZiBpdHMgdmFsdWUuCmRpZmYgLS1naXQgYS9MaWIvcmFuZG9tLnB5IGIvTGliL3JhbmRvbS5weQppbmRleCA0NjVmNDc3Li5hZTJkNDM0IDEwMDY0NAotLS0gYS9MaWIvcmFuZG9tLnB5CisrKyBiL0xpYi9yYW5kb20ucHkKQEAgLTI5LDEzICsyOSwxMiBAQAogR2VuZXJhbCBub3RlcyBvbiB0aGUgdW5kZXJseWluZyBNZXJzZW5uZSBUd2lzdGVyIGNvcmUgZ2VuZXJhdG9yOgogCiAqIFRoZSBwZXJpb2QgaXMgMioqMTk5MzctMS4KLSogSXQgaXMgb25lIG9mIHRoZSBtb3N0IGV4dGVuc2l2ZWx5IHRlc3RlZCBnZW5lcmF0b3JzIGluIGV4aXN0ZW5jZQotKiBXaXRob3V0IGEgZGlyZWN0IHdheSB0byBjb21wdXRlIE4gc3RlcHMgZm9yd2FyZCwgdGhlCi0gIHNlbWFudGljcyBvZiBqdW1wYWhlYWQobikgYXJlIHdlYWtlbmVkIHRvIHNpbXBseSBqdW1wCi0gIHRvIGFub3RoZXIgZGlzdGFudCBzdGF0ZSBhbmQgcmVseSBvbiB0aGUgbGFyZ2UgcGVyaW9kCi0gIHRvIGF2b2lkIG92ZXJsYXBwaW5nIHNlcXVlbmNlcy4KLSogVGhlIHJhbmRvbSgpIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBDLCBleGVjdXRlcyBpbgotICBhIHNpbmdsZSBQeXRob24gc3RlcCwgYW5kIGlzLCB0aGVyZWZvcmUsIHRocmVhZHNhZmUuCisqIEl0IGlzIG9uZSBvZiB0aGUgbW9zdCBleHRlbnNpdmVseSB0ZXN0ZWQgZ2VuZXJhdG9ycyBpbiBleGlzdGVuY2UuCisqIFdpdGhvdXQgYSBkaXJlY3Qgd2F5IHRvIGNvbXB1dGUgTiBzdGVwcyBmb3J3YXJkLCB0aGUgc2VtYW50aWNzIG9mCisgIGp1bXBhaGVhZChuKSBhcmUgd2Vha2VuZWQgdG8gc2ltcGx5IGp1bXAgdG8gYW5vdGhlciBkaXN0YW50IHN0YXRlIGFuZCByZWx5CisgIG9uIHRoZSBsYXJnZSBwZXJpb2QgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzLgorKiBUaGUgcmFuZG9tKCkgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIEMsIGV4ZWN1dGVzIGluIGEgc2luZ2xlIFB5dGhvbiBzdGVwLAorICBhbmQgaXMsIHRoZXJlZm9yZSwgdGhyZWFkc2FmZS4KIAogIiIiCiAKQEAgLTI1MywxMSArMjUyLDYgQEAKIAogICAgICAgICBPcHRpb25hbCBhcmcgcmFuZG9tIGlzIGEgMC1hcmd1bWVudCBmdW5jdGlvbiByZXR1cm5pbmcgYSByYW5kb20KICAgICAgICAgZmxvYXQgaW4gWzAuMCwgMS4wKTsgYnkgZGVmYXVsdCwgdGhlIHN0YW5kYXJkIHJhbmRvbS5yYW5kb20uCi0KLSAgICAgICAgTm90ZSB0aGF0IGZvciBldmVuIHJhdGhlciBzbWFsbCBsZW4oeCksIHRoZSB0b3RhbCBudW1iZXIgb2YKLSAgICAgICAgcGVybXV0YXRpb25zIG9mIHggaXMgbGFyZ2VyIHRoYW4gdGhlIHBlcmlvZCBvZiBtb3N0IHJhbmRvbSBudW1iZXIKLSAgICAgICAgZ2VuZXJhdG9yczsgdGhpcyBpbXBsaWVzIHRoYXQgIm1vc3QiIHBlcm11dGF0aW9ucyBvZiBhIGxvbmcKLSAgICAgICAgc2VxdWVuY2UgY2FuIG5ldmVyIGJlIGdlbmVyYXRlZC4KICAgICAgICAgIiIiCiAKICAgICAgICAgaWYgcmFuZG9tIGlzIE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc2dtbGxpYi5weSBiL0xpYi9zZ21sbGliLnB5CmluZGV4IDNlODVhOTEuLjMwMjBkMTEgMTAwNjQ0Ci0tLSBhL0xpYi9zZ21sbGliLnB5CisrKyBiL0xpYi9zZ21sbGliLnB5CkBAIC0yOSwxMSArMjksMTYgQEAKIHNob3J0dGFnb3BlbiA9IHJlLmNvbXBpbGUoJzxbYS16QS1aXVstLmEtekEtWjAtOV0qLycpCiBzaG9ydHRhZyA9IHJlLmNvbXBpbGUoJzwoW2EtekEtWl1bLS5hLXpBLVowLTldKikvKFteL10qKS8nKQogcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQotZW5kYnJhY2tldCA9IHJlLmNvbXBpbGUoJ1s8Pl0nKQorc3RhcnR0YWcgPSByZS5jb21waWxlKHInPFthLXpBLVpdWy1fLjphLXpBLVowLTldKlxzKignCisgICAgICAgIHInXHMqKFthLXpBLVpfXVstOi5hLXpBLVpfMC05XSopKFxzKj1ccyonCisgICAgICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+QF0nCisgICAgICAgIHInW11bXC1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKig/PVtccz4vPF0pKSk/JworICAgIHInKSpccyovP1xzKig/PVs8Pl0pJykKK2VuZHRhZyA9IHJlLmNvbXBpbGUocic8Lz9bYS16QS1aXVstXy46YS16QS1aMC05XSpccyovP1xzKig/PVs8Pl0pJykKIHRhZ2ZpbmQgPSByZS5jb21waWxlKCdbYS16QS1aXVstXy5hLXpBLVowLTldKicpCiBhdHRyZmluZCA9IHJlLmNvbXBpbGUoCiAgICAgcidccyooW2EtekEtWl9dWy06LmEtekEtWl8wLTldKikoXHMqPVxzKicKLSAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8Wy1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKikpPycpCisgICAgcicoXCdbXlwnXSpcJ3wiW14iXSoifFtdW1wtYS16QS1aMC05Li8sOjsrKiU/ISYkXChcKV8jPX5cJyJAXSopKT8nKQogCiAKIGNsYXNzIFNHTUxQYXJzZUVycm9yKFJ1bnRpbWVFcnJvcik6CkBAIC01Myw2ICs1OCwxMCBAQAogIyBzZWxmLmhhbmRsZV9lbnRpdHlyZWYoKSB3aXRoIHRoZSBlbnRpdHkgcmVmZXJlbmNlIGFzIGFyZ3VtZW50LgogCiBjbGFzcyBTR01MUGFyc2VyKG1hcmt1cGJhc2UuUGFyc2VyQmFzZSk6CisgICAgIyBEZWZpbml0aW9uIG9mIGVudGl0aWVzIC0tIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKyAgICBlbnRpdHlfb3JfY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyYoPzonCisgICAgICAnKFthLXpBLVpdWy0uYS16QS1aMC05XSopfCMoWzAtOV0rKScKKyAgICAgICcpKDs/KScpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT0wKToKICAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhpcyBpbnN0YW5jZS4iIiIKQEAgLTI0NSwxMSArMjU0LDEwIEBACiAgICAgICAgICAgICBzZWxmLmZpbmlzaF9zaG9ydHRhZyh0YWcsIGRhdGEpCiAgICAgICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IHJhd2RhdGFbc3RhcnRfcG9zOm1hdGNoLmVuZCgxKSArIDFdCiAgICAgICAgICAgICByZXR1cm4gawotICAgICAgICAjIFhYWCBUaGUgZm9sbG93aW5nIHNob3VsZCBza2lwIG1hdGNoaW5nIHF1b3RlcyAoJyBvciAiKQotICAgICAgICBtYXRjaCA9IGVuZGJyYWNrZXQuc2VhcmNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgbWF0Y2ggPSBzdGFydHRhZy5tYXRjaChyYXdkYXRhLCBpKQogICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KDApCisgICAgICAgIGogPSBtYXRjaC5lbmQoMCkKICAgICAgICAgIyBOb3cgcGFyc2UgdGhlIGRhdGEgYmV0d2VlbiBpKzEgYW5kIGogaW50byBhIHRhZyBhbmQgYXR0cnMKICAgICAgICAgYXR0cnMgPSBbXQogICAgICAgICBpZiByYXdkYXRhW2k6aSsyXSA9PSAnPD4nOgpAQCAtMjc0LDMyICsyODIsOCBAQAogICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XSk6CiAgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgcXVvdGVzCiAgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQotICAgICAgICAgICAgICAgIGwgPSAwCi0gICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSA9ICcnCi0gICAgICAgICAgICAgICAgd2hpbGUgbCA8IGxlbihhdHRydmFsdWUpOgotICAgICAgICAgICAgICAgICAgICBhdl9tYXRjaCA9IGVudGl0eXJlZi5tYXRjaChhdHRydmFsdWUsIGwpCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdl9tYXRjaCBhbmQgYXZfbWF0Y2guZ3JvdXAoMSkgaW4gc2VsZi5lbnRpdHlkZWZzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlW2F2X21hdGNoLmVuZCgxKV0gPT0gJzsnKToKLSAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzdWJzdGl0dXRlIGVudGl0eXJlZnMgZW5kaW5nIGluICc7JyBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugd2UgbWF5IGJyZWFrIDxhIGhyZWY9Jz9wPXgmcT15Jz4KLSAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgdmVyeSBjb21tb24KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gc2VsZi5lbnRpdHlkZWZzW2F2X21hdGNoLmdyb3VwKDEpXQotICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGF2X21hdGNoLmVuZCgwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgY2hfbWF0Y2ggPSBjaGFycmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKLSAgICAgICAgICAgICAgICAgICAgaWYgY2hfbWF0Y2g6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IGNocihpbnQoY2hfbWF0Y2guZ3JvdXAoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gY2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBjaF9tYXRjaC5lbmQoMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnZhbGlkIGNoYXJhY3RlciByZWZlcmVuY2UsIGRvbid0IHN1YnN0aXR1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAgICAgICAgICMgYWxsIG90aGVyIGNhc2VzCi0gICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gYXR0cnZhbHVlW2xdCi0gICAgICAgICAgICAgICAgICAgIGwgKz0gMQotICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IG5ld19hdHRydmFsdWUKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBzZWxmLmVudGl0eV9vcl9jaGFycmVmLnN1YigKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydF9yZWYsIGF0dHJ2YWx1ZSkKICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgoYXR0cm5hbWUubG93ZXIoKSwgYXR0cnZhbHVlKSkKICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CkBAIC0zMDgsMTMgKzI5MiwyNCBAQAogICAgICAgICBzZWxmLmZpbmlzaF9zdGFydHRhZyh0YWcsIGF0dHJzKQogICAgICAgICByZXR1cm4gagogCisgICAgIyBJbnRlcm5hbCAtLSBjb252ZXJ0IGVudGl0eSBvciBjaGFyYWN0ZXIgcmVmZXJlbmNlCisgICAgZGVmIF9jb252ZXJ0X3JlZihzZWxmLCBtYXRjaCk6CisgICAgICAgIGlmIG1hdGNoLmdyb3VwKDIpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jaGFycmVmKG1hdGNoLmdyb3VwKDIpKSBvciBcCisgICAgICAgICAgICAgICAgJyYjJXMlcycgJSBtYXRjaC5ncm91cHMoKVsxOl0KKyAgICAgICAgZWxpZiBtYXRjaC5ncm91cCgzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG1hdGNoLmdyb3VwKDEpKSBvciBcCisgICAgICAgICAgICAgICAgJyYlczsnICUgbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJiVzJyAlIG1hdGNoLmdyb3VwKDEpCisKICAgICAjIEludGVybmFsIC0tIHBhcnNlIGVuZHRhZwogICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CiAgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKLSAgICAgICAgbWF0Y2ggPSBlbmRicmFja2V0LnNlYXJjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIG1hdGNoID0gZW5kdGFnLm1hdGNoKHJhd2RhdGEsIGkpCiAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgaiA9IG1hdGNoLmVuZCgwKQogICAgICAgICB0YWcgPSByYXdkYXRhW2krMjpqXS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CiAgICAgICAgICAgICBqID0gaisxCkBAIC0zOTEsMzUgKzM4Niw1MSBAQAogICAgICAgICAgICAgcHJpbnQgJyoqKiBVbmJhbGFuY2VkIDwvJyArIHRhZyArICc+JwogICAgICAgICAgICAgcHJpbnQgJyoqKiBTdGFjazonLCBzZWxmLnN0YWNrCiAKLSAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgbmFtZSk6Ci0gICAgICAgICIiIkhhbmRsZSBjaGFyYWN0ZXIgcmVmZXJlbmNlLCBubyBuZWVkIHRvIG92ZXJyaWRlLiIiIgorICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbWF5IGJlIG92ZXJyaWRkZW4uIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG4gPSBpbnQobmFtZSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLnVua25vd25fY2hhcnJlZihuYW1lKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIG5vdCAwIDw9IG4gPD0gMjU1OgotICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGNocihuKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jb2RlcG9pbnQobikKKworICAgIGRlZiBjb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpOgorICAgICAgICByZXR1cm4gY2hyKGNvZGVwb2ludCkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiSGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5jb252ZXJ0X2NoYXJyZWYobmFtZSkKKyAgICAgICAgaWYgcmVwbGFjZW1lbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9jaGFycmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJlcGxhY2VtZW50KQogCiAgICAgIyBEZWZpbml0aW9uIG9mIGVudGl0aWVzIC0tIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUKICAgICBlbnRpdHlkZWZzID0gXAogICAgICAgICAgICAgeydsdCc6ICc8JywgJ2d0JzogJz4nLCAnYW1wJzogJyYnLCAncXVvdCc6ICciJywgJ2Fwb3MnOiAnXCcnfQogCi0gICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6Ci0gICAgICAgICIiIkhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcy4KKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgZW50aXR5IHJlZmVyZW5jZXMuCiAKLSAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IGl0IGNhbiBiZQotICAgICAgICB0YWlsb3JlZCBieSBzZXR0aW5nIHVwIHRoZSBzZWxmLmVudGl0eWRlZnMgbWFwcGluZyBhcHByb3ByaWF0ZWx5LgorICAgICAgICBBcyBhbiBhbHRlcm5hdGl2ZSB0byBvdmVycmlkaW5nIHRoaXMgbWV0aG9kOyBvbmUgY2FuIHRhaWxvciB0aGUKKyAgICAgICAgcmVzdWx0cyBieSBzZXR0aW5nIHVwIHRoZSBzZWxmLmVudGl0eWRlZnMgbWFwcGluZyBhcHByb3ByaWF0ZWx5LgogICAgICAgICAiIiIKICAgICAgICAgdGFibGUgPSBzZWxmLmVudGl0eWRlZnMKICAgICAgICAgaWYgbmFtZSBpbiB0YWJsZToKLSAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEodGFibGVbbmFtZV0pCisgICAgICAgICAgICByZXR1cm4gdGFibGVbbmFtZV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbnRpdHlyZWYobmFtZSkKICAgICAgICAgICAgIHJldHVybgogCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcywgbm8gbmVlZCB0byBvdmVycmlkZS4iIiIKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGlmIHJlcGxhY2VtZW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVua25vd25fZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHNlbGYuY29udmVydF9lbnRpdHlyZWYobmFtZSkpCisKICAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIGRhdGEsIHNob3VsZCBiZSBvdmVycmlkZGVuCiAgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgogICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvc2hlbHZlLnB5IGIvTGliL3NoZWx2ZS5weQppbmRleCA0OTU5YzI2Li43YTc1NDQ1IDEwMDY0NAotLS0gYS9MaWIvc2hlbHZlLnB5CisrKyBiL0xpYi9zaGVsdmUucHkKQEAgLTEzOSw2ICsxMzksOSBAQAogICAgICAgICBzZWxmLmRpY3QgPSAwCiAKICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3dyaXRlYmFjaycpOgorICAgICAgICAgICAgIyBfX2luaXRfXyBkaWRuJ3Qgc3VjY2VlZCwgc28gZG9uJ3QgYm90aGVyIGNsb3NpbmcKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBzeW5jKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3NodXRpbC5weSBiL0xpYi9zaHV0aWwucHkKaW5kZXggYzUwMTg0Yy4uYzNmZjY4NyAxMDA2NDQKLS0tIGEvTGliL3NodXRpbC5weQorKysgYi9MaWIvc2h1dGlsLnB5CkBAIC0xMjcsNyArMTI3LDEzIEBACiAgICAgICAgICMgY29udGludWUgd2l0aCBvdGhlciBmaWxlcwogICAgICAgICBleGNlcHQgRXJyb3IsIGVycjoKICAgICAgICAgICAgIGVycm9ycy5leHRlbmQoZXJyLmFyZ3NbMF0pCi0gICAgY29weXN0YXQoc3JjLCBkc3QpCisgICAgdHJ5OgorICAgICAgICBjb3B5c3RhdChzcmMsIGRzdCkKKyAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAjIGNhbid0IGNvcHkgZmlsZSBhY2Nlc3MgdGltZXMgb24gV2luZG93cworICAgICAgICBwYXNzCisgICAgZXhjZXB0IE9TRXJyb3IsIHdoeToKKyAgICAgICAgZXJyb3JzLmV4dGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgICBpZiBlcnJvcnM6CiAgICAgICAgIHJhaXNlIEVycm9yLCBlcnJvcnMKIApkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCA0N2VkYTI0Li4wMTA4NmI3IDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTEsMTAgKzExLDExIEBACiB3b3JrcykuCiAKIFRoaXMgd2lsbCBhcHBlbmQgc2l0ZS1zcGVjaWZpYyBwYXRocyB0byB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLiAgT24KLVVuaXgsIGl0IHN0YXJ0cyB3aXRoIHN5cy5wcmVmaXggYW5kIHN5cy5leGVjX3ByZWZpeCAoaWYgZGlmZmVyZW50KSBhbmQKLWFwcGVuZHMgbGliL3B5dGhvbjx2ZXJzaW9uPi9zaXRlLXBhY2thZ2VzIGFzIHdlbGwgYXMgbGliL3NpdGUtcHl0aG9uLgotT24gb3RoZXIgcGxhdGZvcm1zIChtYWlubHkgTWFjIGFuZCBXaW5kb3dzKSwgaXQgdXNlcyBqdXN0IHN5cy5wcmVmaXgKLShhbmQgc3lzLmV4ZWNfcHJlZml4LCBpZiBkaWZmZXJlbnQsIGJ1dCB0aGlzIGlzIHVubGlrZWx5KS4gIFRoZQorVW5peCAoaW5jbHVkaW5nIE1hYyBPU1gpLCBpdCBzdGFydHMgd2l0aCBzeXMucHJlZml4IGFuZAorc3lzLmV4ZWNfcHJlZml4IChpZiBkaWZmZXJlbnQpIGFuZCBhcHBlbmRzCitsaWIvcHl0aG9uPHZlcnNpb24+L3NpdGUtcGFja2FnZXMgYXMgd2VsbCBhcyBsaWIvc2l0ZS1weXRob24uCitPbiBvdGhlciBwbGF0Zm9ybXMgKHN1Y2ggYXMgV2luZG93cyksIGl0IHRyaWVzIGVhY2ggb2YgdGhlCitwcmVmaXhlcyBkaXJlY3RseSwgYXMgd2VsbCBhcyB3aXRoIGxpYi9zaXRlLXBhY2thZ2VzIGFwcGVuZGVkLiAgVGhlCiByZXN1bHRpbmcgZGlyZWN0b3JpZXMsIGlmIHRoZXkgZXhpc3QsIGFyZSBhcHBlbmRlZCB0byBzeXMucGF0aCwgYW5kCiBhbHNvIGluc3BlY3RlZCBmb3IgcGF0aCBjb25maWd1cmF0aW9uIGZpbGVzLgogCmRpZmYgLS1naXQgYS9MaWIvc29ja2V0LnB5IGIvTGliL3NvY2tldC5weQppbmRleCBmYTBlNjYzLi41MmZiOGUzIDEwMDY0NAotLS0gYS9MaWIvc29ja2V0LnB5CisrKyBiL0xpYi9zb2NrZXQucHkKQEAgLTEzMCwzNSArMTMwLDQwIEBACiBpZiBzeXMucGxhdGZvcm0gPT0gInJpc2NvcyI6CiAgICAgX3NvY2tldG1ldGhvZHMgPSBfc29ja2V0bWV0aG9kcyArICgnc2xlZXB0YXNrdycsKQogCisjIEFsbCB0aGUgbWV0aG9kIG5hbWVzIHRoYXQgbXVzdCBiZSBkZWxlZ2F0ZWQgdG8gZWl0aGVyIHRoZSByZWFsIHNvY2tldAorIyBvYmplY3Qgb3IgdGhlIF9jbG9zZWRzb2NrZXQgb2JqZWN0LgorX2RlbGVnYXRlX21ldGhvZHMgPSAoInJlY3YiLCAicmVjdmZyb20iLCAicmVjdl9pbnRvIiwgInJlY3Zmcm9tX2ludG8iLAorICAgICAgICAgICAgICAgICAgICAgInNlbmQiLCAic2VuZHRvIikKKwogY2xhc3MgX2Nsb3NlZHNvY2tldChvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgZGVmIF9kdW1teSgqYXJncyk6CiAgICAgICAgIHJhaXNlIGVycm9yKEVCQURGLCAnQmFkIGZpbGUgZGVzY3JpcHRvcicpCi0gICAgc2VuZCA9IHJlY3YgPSBzZW5kdG8gPSByZWN2ZnJvbSA9IF9fZ2V0YXR0cl9fID0gX2R1bW15CisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgIyBBbGwgX2RlbGVnYXRlX21ldGhvZHMgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkIGhlcmUuCisgICAgc2VuZCA9IHJlY3YgPSByZWN2X2ludG8gPSBzZW5kdG8gPSByZWN2ZnJvbSA9IHJlY3Zmcm9tX2ludG8gPSBfZHVtbXkKKyAgICBfX2dldGF0dHJfXyA9IF9kdW1teQogCiBjbGFzcyBfc29ja2V0b2JqZWN0KG9iamVjdCk6CiAKICAgICBfX2RvY19fID0gX3JlYWxzb2NrZXQuX19kb2NfXwogCi0gICAgX19zbG90c19fID0gWyJfc29jayIsCi0gICAgICAgICAgICAgICAgICJyZWN2IiwgInJlY3ZfaW50byIsICJyZWN2ZnJvbV9pbnRvIiwKLSAgICAgICAgICAgICAgICAgInNlbmQiLCAic2VuZHRvIiwgInJlY3Zmcm9tIiwKLSAgICAgICAgICAgICAgICAgIl9fd2Vha3JlZl9fIl0KKyAgICBfX3Nsb3RzX18gPSBbIl9zb2NrIiwgIl9fd2Vha3JlZl9fIl0gKyBsaXN0KF9kZWxlZ2F0ZV9tZXRob2RzKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhbWlseT1BRl9JTkVULCB0eXBlPVNPQ0tfU1RSRUFNLCBwcm90bz0wLCBfc29jaz1Ob25lKToKICAgICAgICAgaWYgX3NvY2sgaXMgTm9uZToKICAgICAgICAgICAgIF9zb2NrID0gX3JlYWxzb2NrZXQoZmFtaWx5LCB0eXBlLCBwcm90bykKICAgICAgICAgc2VsZi5fc29jayA9IF9zb2NrCi0gICAgICAgIHNlbGYuc2VuZCA9IHNlbGYuX3NvY2suc2VuZAotICAgICAgICBzZWxmLnJlY3YgPSBzZWxmLl9zb2NrLnJlY3YKLSAgICAgICAgc2VsZi5yZWN2X2ludG8gPSBzZWxmLl9zb2NrLnJlY3ZfaW50bwotICAgICAgICBzZWxmLnNlbmR0byA9IHNlbGYuX3NvY2suc2VuZHRvCi0gICAgICAgIHNlbGYucmVjdmZyb20gPSBzZWxmLl9zb2NrLnJlY3Zmcm9tCi0gICAgICAgIHNlbGYucmVjdmZyb21faW50byA9IHNlbGYuX3NvY2sucmVjdmZyb21faW50bworICAgICAgICBmb3IgbWV0aG9kIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2QsIGdldGF0dHIoX3NvY2ssIG1ldGhvZCkpCiAKICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY2xvc2UoKQogICAgICAgICBzZWxmLl9zb2NrID0gX2Nsb3NlZHNvY2tldCgpCi0gICAgICAgIHNlbGYuc2VuZCA9IHNlbGYucmVjdiA9IHNlbGYuc2VuZHRvID0gc2VsZi5yZWN2ZnJvbSA9IHNlbGYuX3NvY2suX2R1bW15CisgICAgICAgIGR1bW15ID0gc2VsZi5fc29jay5fZHVtbXkKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBfZGVsZWdhdGVfbWV0aG9kczoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbWV0aG9kLCBkdW1teSkKICAgICBjbG9zZS5fX2RvY19fID0gX3JlYWxzb2NrZXQuY2xvc2UuX19kb2NfXwogCiAgICAgZGVmIGFjY2VwdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IGIxMGIzZWYuLjc2MWJkYWEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtNDgsNiArNDgsOCBAQAogICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIENoZWNrQ29sbGF0aW9uSXNVc2VkKHNlbGYpOgorICAgICAgICBpZiBzcWxpdGUudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpOiAgIyBvbGQgU1FMaXRlIHZlcnNpb25zIGNyYXNoIG9uIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKICAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKaW5kZXggMjVlNGI2My4uYzg3MzNiOSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpAQCAtNjEsNiArNjEsMTQgQEAKIAogICAgICAgICBjb24ucm9sbGJhY2soKQogCisgICAgZGVmIENoZWNrQ29sdW1uTmFtZVdpdGhTcGFjZXMoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJhciBbZGF0ZXRpbWVdIicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXIiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJheiInKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmF6IikKKwogZGVmIHN1aXRlKCk6CiAgICAgcmVncmVzc2lvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWdyZXNzaW9uVGVzdHMsICJDaGVjayIpCiAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgocmVncmVzc2lvbl9zdWl0ZSwpKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKaW5kZXggZTQ5ZjdkZC4uOGRhNTcyMiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0yMSw3ICsyMSw3IEBACiAjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAotaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgYnoyLCBkYXRldGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIApAQCAtMTAxLDE2ICsxMDEsMTYgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IpIikKIAogICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZsb2F0Il0gPSBsYW1iZGEgeDogNDcuMgorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXSA9IGxhbWJkYSB4OiA0Ny4yCiAKICAgICAgICAgIyBhbmQgaW1wbGVtZW50IHR3byBjdXN0b20gb25lcwotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYm9vbCJdID0gbGFtYmRhIHg6IGJvb2woaW50KHgpKQotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBEZWNsVHlwZXNUZXN0cy5Gb28KKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXSA9IGxhbWJkYSB4OiBib29sKGludCh4KSkKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdCiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCkBAIC0yMDgsMTQgKzIwOCwxNCBAQAogICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHggZm9vKSIpCiAKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdID0gbGFtYmRhIHg6ICJbJXNdIiAlIHgKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImJhciJdID0gbGFtYmRhIHg6ICI8JXM+IiAlIHgKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdID0gbGFtYmRhIHg6IDUvMAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRk9PIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQkFSIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRVhDIl0gPSBsYW1iZGEgeDogNS8wCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KLSAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJiYXIiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkVYQyJdCiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCkBAIC0yMzEsMTIgKzIzMSw2IEBACiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQogCi0gICAgZGVmIENoZWNrRXhjKHNlbGYpOgotICAgICAgICAjIEV4Y2VwdGlvbnMgaW4gdHlwZSBjb252ZXJ0ZXJzIHJlc3VsdCBpbiByZXR1cm5lZCBOb25lcwotICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgNSBhcyAieCBbZXhjXSInKQotICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKLQogICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgeCBhcyAieCBbYmFyXSIgZnJvbSB0ZXN0JykKQEAgLTI3OSw2ICsyNzMsMjMgQEAKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQogCitjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNvbnZlcnQocyk6CisgICAgICAgIHJldHVybiBiejIuZGVjb21wcmVzcyhzKQorICAgIGNvbnZlcnQgPSBzdGF0aWNtZXRob2QoY29udmVydCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0NPTE5BTUVTKQorICAgICAgICBzcWxpdGUucmVnaXN0ZXJfY29udmVydGVyKCJiaW4iLCBCaW5hcnlDb252ZXJ0ZXJUZXN0cy5jb252ZXJ0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tCaW5hcnlJbnB1dEZvckNvbnZlcnRlcihzZWxmKToKKyAgICAgICAgdGVzdGRhdGEgPSAiYWJjZGVmZyIgKiAxMAorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAoYnVmZmVyKGJ6Mi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKKwogY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQpAQCAtMzI4LDggKzMzOSw5IEBACiAgICAgZGVjbHR5cGVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGVjbFR5cGVzVGVzdHMsICJDaGVjayIpCiAgICAgY29sbmFtZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xOYW1lc1Rlc3RzLCAiQ2hlY2siKQogICAgIGFkYXB0YXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoT2JqZWN0QWRhcHRhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGJpbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShCaW5hcnlDb252ZXJ0ZXJUZXN0cywgIkNoZWNrIikKICAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoc3FsaXRlX3R5cGVfc3VpdGUsIGRlY2x0eXBlc190eXBlX3N1aXRlLCBjb2xuYW1lc190eXBlX3N1aXRlLCBhZGFwdGF0aW9uX3N1aXRlLCBkYXRlX3N1aXRlKSkKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChzcWxpdGVfdHlwZV9zdWl0ZSwgZGVjbHR5cGVzX3R5cGVfc3VpdGUsIGNvbG5hbWVzX3R5cGVfc3VpdGUsIGFkYXB0YXRpb25fc3VpdGUsIGJpbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CmluZGV4IDc4NjU2ZTcuLjMxYmYyODkgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKQEAgLTU1LDYgKzU1LDkgQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHBhc3MKIAorICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKwogY2xhc3MgQWdnck5vRmluYWxpemU6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBwYXNzCkBAIC0xNDQsOSArMTQ3LDEyIEBACiAgICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgogICAgICAgICBkZWYgZ2V0ZnVuYygpOgogICAgICAgICAgICAgZGVmIGYoKToKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgIHJldHVybiBmCi0gICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgZiA9IGdldGZ1bmMoKQorICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgorICAgICAgICAjIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZikKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQogCkBAIC0xOTUsOSArMjAxLDEyIEBACiAKICAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQotICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJhaXNlZXhjZXB0aW9uKCkiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCisgICAgICAgICAgICBjdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKIAogICAgIGRlZiBDaGVja1BhcmFtU3RyaW5nKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMjY3LDMxICsyNzYsNDcgQEAKIAogICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIkFnZ3JOb1N0ZXAgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnc3RlcCciKQogCiAgICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JblN0ZXAoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDQyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQotICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNGaW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMzMxLDEwICszNTYsNTQgQEAKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA2MCkKIAorZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCisgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQorICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCisKK2NsYXNzIEF1dGhvcml6ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDEgKGMxLCBjMik7CisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDIgKGMxLCBjMik7CisgICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gdDIgKGMxLCBjMikgdmFsdWVzICg0LCA1KTsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICAjIEZvciBvdXIgc2VjdXJpdHkgdGVzdDoKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDIiKQorCisgICAgICAgIHNlbGYuY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXJfY2IpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja1RhYmxlQWNjZXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHQyIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCisKKyAgICBkZWYgQ2hlY2tDb2x1bW5BY2Nlc3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQxIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCisKIGRlZiBzdWl0ZSgpOgogICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCiAgICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQotICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUpKQorICAgIGF1dGhvcml6ZXJfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUsIGF1dGhvcml6ZXJfc3VpdGUpKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zdHJpbmcucHkgYi9MaWIvc3RyaW5nLnB5CmluZGV4IGJhODVhNDkuLmE1ODM3ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9zdHJpbmcucHkKKysrIGIvTGliL3N0cmluZy5weQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKICAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgdmFsCisgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAodmFsLCkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgpAQCAtMTg2LDEzICsxODYsMTMgQEAKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIKICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlIG1hcHBpbmdbbmFtZWRdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbbmFtZWRdLCkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlciArIG5hbWVkCiAgICAgICAgICAgICBicmFjZWQgPSBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIGJyYWNlZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgbWFwcGluZ1ticmFjZWRdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbYnJhY2VkXSwpCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIgKyAneycgKyBicmFjZWQgKyAnfScKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc3RydWN0LnB5IGIvTGliL3N0cnVjdC5weQppbmRleCA5MTEzZTcxLi4wN2MyMWJmIDEwMDY0NAotLS0gYS9MaWIvc3RydWN0LnB5CisrKyBiL0xpYi9zdHJ1Y3QucHkKQEAgLTY0LDcgKzY0LDcgQEAKIAogZGVmIHBhY2tfaW50byhmbXQsIGJ1Ziwgb2Zmc2V0LCAqYXJncyk6CiAgICAgIiIiCi0gICAgUGFjayB0aGUgdmFsdWVzIHYyLCB2MiwgLi4uIGFjY29yZGluZyB0byBmbXQsIHdyaXRlCisgICAgUGFjayB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uIGFjY29yZGluZyB0byBmbXQsIHdyaXRlCiAgICAgdGhlIHBhY2tlZCBieXRlcyBpbnRvIHRoZSB3cml0YWJsZSBidWZmZXIgYnVmIHN0YXJ0aW5nIGF0IG9mZnNldC4KICAgICBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuCiAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvc3VicHJvY2Vzcy5weSBiL0xpYi9zdWJwcm9jZXNzLnB5CmluZGV4IGE2YWY3ZTcuLjBkMTkxMjkgMTAwNjQ0Ci0tLSBhL0xpYi9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9zdWJwcm9jZXNzLnB5CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUuICBJZiB0aGUKICAgICBleGl0IGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZQogICAgIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZSBDYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUKLSAgICByZXR1cm4gY29kZSBpbiB0aGUgZXJybm8gYXR0cmlidXRlLgorICAgIHJldHVybiBjb2RlIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KIAogICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgogCkBAIC0xNDEsOCArMTQxLDggQEAKIAogQSBWYWx1ZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIFBvcGVuIGlzIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzLgogCi1jaGVja19jYWxsKCkgd2lsbCByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IsIHdoaWNoIGlzIGEgc3ViY2xhc3Mgb2YKLU9TRXJyb3IsIGlmIHRoZSBjYWxsZWQgcHJvY2VzcyByZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCitjaGVja19jYWxsKCkgd2lsbCByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IsIGlmIHRoZSBjYWxsZWQgcHJvY2VzcworcmV0dXJucyBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgogCiAKIFNlY3VyaXR5CkBAIC0yMzQsNyArMjM0LDcgQEAKIHN0cyA9IG9zLnN5c3RlbSgibXljbWQiICsgIiBteWFyZyIpCiA9PT4KIHAgPSBQb3BlbigibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCi1zdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQorcGlkLCBzdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQogCiBOb3RlOgogCkBAIC0zNjAsMTEgKzM2MCwxNiBAQAogaW1wb3J0IHRyYWNlYmFjawogCiAjIEV4Y2VwdGlvbiBjbGFzc2VzIHVzZWQgYnkgdGhpcyBtb2R1bGUuCi1jbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoT1NFcnJvcik6CitjbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoRXhjZXB0aW9uKToKICAgICAiIiJUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHByb2Nlc3MgcnVuIGJ5IGNoZWNrX2NhbGwoKSByZXR1cm5zCiAgICAgYSBub24temVybyBleGl0IHN0YXR1cy4gIFRoZSBleGl0IHN0YXR1cyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKLSAgICBlcnJubyBhdHRyaWJ1dGUuICBUaGlzIGV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mCi0gICAgT1NFcnJvci4iIiIKKyAgICByZXR1cm5jb2RlIGF0dHJpYnV0ZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZSwgY21kKToKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZCIgJSAoc2VsZi5jbWQsIHNlbGYucmV0dXJuY29kZSkKKwogCiBpZiBtc3dpbmRvd3M6CiAgICAgaW1wb3J0IHRocmVhZGluZwpAQCAtNDQyLDcgKzQ0Nyw3IEBACiAgICAgIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiAgSWYKICAgICB0aGUgZXhpdCBjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UKICAgICBDYWxsZWRQcm9jZXNzRXJyb3IuICBUaGUgQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlCi0gICAgcmV0dXJuIGNvZGUgaW4gdGhlIGVycm5vIGF0dHJpYnV0ZS4KKyAgICByZXR1cm4gY29kZSBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCiAKICAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKIApAQCAtNDUzLDcgKzQ1OCw3IEBACiAgICAgaWYgY21kIGlzIE5vbmU6CiAgICAgICAgIGNtZCA9IHBvcGVuYXJnc1swXQogICAgIGlmIHJldGNvZGU6Ci0gICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCAiQ29tbWFuZCAlcyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyIgJSBjbWQpCisgICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCBjbWQpCiAgICAgcmV0dXJuIHJldGNvZGUKIAogCkBAIC02MTMsNyArNjE4LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQotICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmUgYW5kIF9hY3RpdmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCiAgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQogCkBAIC05NDEsNyArOTQ2LDcgQEAKIAogCiAgICAgICAgIGRlZiBfY2xvc2VfZmRzKHNlbGYsIGJ1dCk6Ci0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBNQVhGRCk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMywgTUFYRkQpOgogICAgICAgICAgICAgICAgIGlmIGkgPT0gYnV0OgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggMDYxZDBmNS4uYzE4NWZiZCAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTQxNyw3ICs0MTcsMTMgQEAKICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKICAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKICAgICAgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKLSAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxsIiwgc2VsZi5jcmMpKQorICAgICAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CisgICAgICAgICAgICAgICAgIyB0aGUgUHl0aG9uIHdyYXBwZXIgaW1wbGljaXRseSBjYXN0cyB0aGF0IHRvIGEgc2lnbmVkIEMKKyAgICAgICAgICAgICAgICAjIGxvbmcuICBTbywgb24gYSAzMi1iaXQgYm94IHNlbGYuY3JjIG1heSAibG9vayBuZWdhdGl2ZSIsCisgICAgICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCisgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBpcmtzb21lIHdhcm5pbmdzIGZyb20gdGhlIGBzdHJ1Y3RgIG1vZHVsZSwgZm9yY2UKKyAgICAgICAgICAgICAgICAjIGl0IHRvIGxvb2sgcG9zaXRpdmUgb24gYWxsIGJveGVzLgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLmNyYyAmIDB4ZmZmZmZmZmZMKSkKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MgJiAweGZmZmZGRkZGTCkpCiAKICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CkBAIC0xNzUwLDEzICsxNzU2LDYgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB0YXJpbmZvID0gVGFySW5mby5mcm9tYnVmKGJ1ZikKIAotICAgICAgICAgICAgICAgICMgV2Ugc2hvdWxkbid0IHJlbHkgb24gdGhpcyBjaGVja3N1bSwgYmVjYXVzZSBzb21lIHRhciBwcm9ncmFtcwotICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGl0IGRpZmZlcmVudGx5IGFuZCBpdCBpcyBtZXJlbHkgdmFsaWRhdGluZyB0aGUKLSAgICAgICAgICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAotICAgICAgICAgICAgICAgICMgaGF2ZSBhIHNsaWdodCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuLi4KLSAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogQmFkIENoZWNrc3VtICVyIiAlIHRhcmluZm8ubmFtZSkKLQogICAgICAgICAgICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKICAgICAgICAgICAgICAgICAjIFRhckZpbGUgYW5kIHNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzCiAgICAgICAgICAgICAgICAgIyBzaG91bGQgYmVnaW4uCmRpZmYgLS1naXQgYS9MaWIvdGVsbmV0bGliLnB5IGIvTGliL3RlbG5ldGxpYi5weQppbmRleCAzNTIzMDM3Li5hMTNlODVjIDEwMDY0NAotLS0gYS9MaWIvdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZWxuZXRsaWIucHkKQEAgLTMxMSw2ICszMTEsOCBAQAogICAgICAgICBzX2FyZ3MgPSBzX3JlcGx5CiAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzX2FyZ3MgPSBzX2FyZ3MgKyAodGltZW91dCwpCisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKICAgICAgICAgd2hpbGUgbm90IHNlbGYuZW9mIGFuZCBzZWxlY3Quc2VsZWN0KCpzX2FyZ3MpID09IHNfcmVwbHk6CiAgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzZWxmLmNvb2tlZHEpLW4pCiAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCkBAIC0zMjEsNiArMzIzLDExIEBACiAgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxWzppXQogICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtpOl0KICAgICAgICAgICAgICAgICByZXR1cm4gYnVmCisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgaWYgZWxhcHNlZCA+PSB0aW1lb3V0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNfYXJncyA9IHNfcmVwbHkgKyAodGltZW91dC1lbGFwc2VkLCkKICAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQogCiAgICAgZGVmIHJlYWRfYWxsKHNlbGYpOgpAQCAtNjAxLDYgKzYwOCw5IEBACiAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihsaXN0W2ldLCAic2VhcmNoIik6CiAgICAgICAgICAgICAgICAgaWYgbm90IHJlOiBpbXBvcnQgcmUKICAgICAgICAgICAgICAgICBsaXN0W2ldID0gcmUuY29tcGlsZShsaXN0W2ldKQorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCiAgICAgICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgpAQCAtNjEzLDcgKzYyMywxMSBAQAogICAgICAgICAgICAgaWYgc2VsZi5lb2Y6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuZmlsZW5vKCldLCBbXSwgW10sIHRpbWVvdXQpCisgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc19hcmdzID0gKFtzZWxmLmZpbGVubygpXSwgW10sIFtdLCB0aW1lb3V0LWVsYXBzZWQpCisgICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoKnNfYXJncykKICAgICAgICAgICAgICAgICBpZiBub3QgcjoKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKZGlmZiAtLWdpdCBhL0xpYi90ZW1wZmlsZS5weSBiL0xpYi90ZW1wZmlsZS5weQppbmRleCBkZDdlODY0Li4yZThjZDZkIDEwMDY0NAotLS0gYS9MaWIvdGVtcGZpbGUucHkKKysrIGIvTGliL3RlbXBmaWxlLnB5CkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9dGVtcGxhdGUsIGRpcj1Ob25lKToKICAgICAgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZS4KICAgICAgICAgQXJndW1lbnRzOgotICAgICAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXJlY3RvcnknIC0tIGFzIGZvciBta3N0ZW1wLgorICAgICAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXInIC0tIGFzIGZvciBta3N0ZW1wLgogICAgICAgICAnbW9kZScgLS0gdGhlIG1vZGUgYXJndW1lbnQgdG8gb3MuZmRvcGVuIChkZWZhdWx0ICJ3K2IiKS4KICAgICAgICAgJ2J1ZnNpemUnIC0tIHRoZSBidWZmZXIgc2l6ZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgLTEpLgogICAgICAgICBUaGUgZmlsZSBpcyBjcmVhdGVkIGFzIG1rc3RlbXAoKSB3b3VsZCBkbyBpdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2JvZ3VzX2NvZGVfb2JqLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfY29kZV9vYmoucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzYWU1MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvZ3VzX2NvZGVfb2JqLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIgorQnJva2VuIGJ5dGVjb2RlIG9iamVjdHMgY2FuIGVhc2lseSBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuCisKK1RoaXMgaXMgbm90IGdvaW5nIHRvIGJlIGZpeGVkLiAgSXQgaXMgZ2VuZXJhbGx5IGFncmVlZCB0aGF0IHRoZXJlIGlzIG5vCitwb2ludCBpbiB3cml0aW5nIGEgYnl0ZWNvZGUgdmVyaWZpZXIgYW5kIHB1dHRpbmcgaXQgaW4gQ1B5dGhvbiBqdXN0IGZvcgordGhpcy4gIE1vcmVvdmVyLCBhIHZlcmlmaWVyIGlzIGJvdW5kIHRvIGFjY2VwdCBvbmx5IGEgc3Vic2V0IG9mIGFsbCBzYWZlCitieXRlY29kZXMsIHNvIGl0IGNvdWxkIGxlYWQgdG8gdW5uZWNlc3NhcnkgYnJlYWthZ2UuCisKK0ZvciBzZWN1cml0eSBwdXJwb3NlcywgInJlc3RyaWN0ZWQiIGludGVycHJldGVycyBhcmUgbm90IGdvaW5nIHRvIGxldAordGhlIHVzZXIgYnVpbGQgb3IgbG9hZCByYW5kb20gYnl0ZWNvZGVzIGFueXdheS4gIE90aGVyd2lzZSwgdGhpcyBpcyBhCisid29uJ3QgZml4IiBjYXNlLgorCisiIiIKKworaW1wb3J0IHR5cGVzCisKK2NvID0gdHlwZXMuQ29kZVR5cGUoMCwgMCwgMCwgMCwgJ1x4MDRceDcxXHgwMFx4MDAnLCAoKSwKKyAgICAgICAgICAgICAgICAgICAgKCksICgpLCAnJywgJycsIDEsICcnKQorZXhlYyBjbwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzEucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9ib3Jyb3dlZF9yZWZfMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTZlZGUyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzEucHkKQEAgLTAsMCArMSwyOSBAQAorIiIiCitfUHlUeXBlX0xvb2t1cCgpIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UuCitUaGlzIGF0dGFja3MgdGhlIGNhbGwgaW4gZGljdG9iamVjdC5jLgorIiIiCisKK2NsYXNzIEEob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgcHJpbnQgJ2hpJworICAgICAgICBkZWwgRC5fX21pc3NpbmdfXworCitjbGFzcyBEKGRpY3QpOgorICAgIGNsYXNzIF9fbWlzc2luZ19fOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworCisKK2QgPSBEKCkKK2EgPSBBKCkKK2EuY3ljbGUgPSBhCithLm90aGVyID0gQigpCitkZWwgYQorCitwcmV2ID0gTm9uZQord2hpbGUgMToKKyAgICBkWzVdCisgICAgcHJldiA9IChwcmV2LCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2JvcnJvd2VkX3JlZl8yLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3YjNmZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvcnJvd2VkX3JlZl8yLnB5CkBAIC0wLDAgKzEsMzggQEAKKyIiIgorX1B5VHlwZV9Mb29rdXAoKSByZXR1cm5zIGEgYm9ycm93ZWQgcmVmZXJlbmNlLgorVGhpcyBhdHRhY2tzIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKCkuCisKK05CLiBvbiBteSBtYWNoaW5lIHRoaXMgY3Jhc2hlcyBpbiAyLjUgZGVidWcgYnV0IG5vdCByZWxlYXNlLgorIiIiCisKK2NsYXNzIEEob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgcHJpbnQgImhpIgorICAgICAgICBkZWwgQy5kCisKK2NsYXNzIEQob2JqZWN0KToKKyAgICBkZWYgX19zZXRfXyhzZWxmLCBvYmosIHZhbHVlKToKKyAgICAgICAgc2VsZi5oZWxsbyA9IDQyCisKK2NsYXNzIEMob2JqZWN0KToKKyAgICBkID0gRCgpCisKKyAgICBkZWYgZygpOgorICAgICAgICBwYXNzCisKKworYyA9IEMoKQorYSA9IEEoKQorYS5jeWNsZSA9IGEKK2Eub3RoZXIgPSBCKCkKKworbHN0ID0gW05vbmVdICogMTAwMDAwMAoraSA9IDAKK2RlbCBhCit3aGlsZSAxOgorICAgIGMuZCA9IDQyICAgICAgICAgIyBzZWdmYXVsdHMgaW4gUHlNZXRob2RfTmV3KGltX2Z1bmM9RC5fX3NldF9fLCBpbV9zZWxmPWQpCisgICAgbHN0W2ldID0gYy5nICAgICAjIGNvbnN1bWUgdGhlIGZyZWUgbGlzdCBvZiBpbnN0YW5jZW1ldGhvZCBvYmplY3RzCisgICAgaSArPSAxCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9jb2VyY2UucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9jb2VyY2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDk1NmIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY3Jhc2hlcnMvY29lcmNlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLSMgaHR0cDovL3B5dGhvbi5vcmcvc2YvOTkyMDE3Ci0KLWNsYXNzIGZvbzoKLSAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBvdGhlciwgc2VsZgotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGZvbygpKzEgICAjIHNlZ2ZhdWx0OiBpbmZpbml0ZSByZWN1cnNpb24gaW4gQwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvZ2NfaW5zcGVjdGlvbi5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2djX2luc3BlY3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYWE3OQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2djX2luc3BlY3Rpb24ucHkKQEAgLTAsMCArMSwzMiBAQAorIiIiCitnYy5nZXRfcmVmZXJyZXJzKCkgY2FuIGJlIHVzZWQgdG8gc2VlIG9iamVjdHMgYmVmb3JlIHRoZXkgYXJlIGZ1bGx5IGJ1aWx0LgorCitOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFuIGV4YW1wbGUuICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGNyYXNoIFB5dGhvbgorYnkgdXNpbmcgZ2MuZ2V0X3JlZmVycmVycygpLCBhcyB3ZWxsIGFzIG1hbnkgZXh0ZW5zaW9uIG1vZHVsZXMgKGV2ZW4KK3doZW4gdGhleSBhcmUgdXNpbmcgcGVyZmVjdGx5IGRvY3VtZW50ZWQgcGF0dGVybnMgdG8gYnVpbGQgb2JqZWN0cykuCisKK0lkZW50aWZ5aW5nIGFuZCByZW1vdmluZyBhbGwgcGxhY2VzIHRoYXQgZXhwb3NlIHRvIHRoZSBHQyBhCitwYXJ0aWFsbHktYnVpbHQgb2JqZWN0IGlzIGEgbG9uZy10ZXJtIHByb2plY3QuICBBIHBhdGNoIHdhcyBwcm9wb3NlZCBvbgorU0Ygc3BlY2lmaWNhbGx5IGZvciB0aGlzIGV4YW1wbGUgYnV0IEkgY29uc2lkZXIgZml4aW5nIGp1c3QgdGhpcyBzaW5nbGUKK2V4YW1wbGUgYSBiaXQgcG9pbnRsZXNzICgjMTUxNzA0MikuCisKK0EgZml4IHdvdWxkIGluY2x1ZGUgYSB3aG9sZS1zY2FsZSBjb2RlIHJldmlldywgcG9zc2libHkgd2l0aCBhbiBBUEkKK2NoYW5nZSB0byBkZWNvdXBsZSBvYmplY3QgY3JlYXRpb24gYW5kIEdDIHJlZ2lzdHJhdGlvbiwgYW5kIGFjY29yZGluZworZml4ZXMgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIGV4dGVuc2lvbiBtb2R1bGUgd3JpdGVycy4gIEl0J3MgdW5saWtlbHkKK3RvIGhhcHBlbiwgdGhvdWdoLiAgU28gdGhpcyBpcyBjdXJyZW50bHkgY2xhc3NpZmllZCBhcworImdjLmdldF9yZWZlcnJlcnMoKSBpcyBkYW5nZXJvdXMsIHVzZSBvbmx5IGZvciBkZWJ1Z2dpbmciLgorIiIiCisKK2ltcG9ydCBnYworCisKK2RlZiBnKCk6CisgICAgbWFya2VyID0gb2JqZWN0KCkKKyAgICB5aWVsZCBtYXJrZXIKKyAgICAjIG5vdyB0aGUgbWFya2VyIGlzIGluIHRoZSB0dXBsZSBiZWluZyBjb25zdHJ1Y3RlZAorICAgIFt0dXBdID0gW3ggZm9yIHggaW4gZ2MuZ2V0X3JlZmVycmVycyhtYXJrZXIpIGlmIHR5cGUoeCkgaXMgdHVwbGVdCisgICAgcHJpbnQgdHVwCisgICAgcHJpbnQgdHVwWzFdCisKKwordHVwbGUoZygpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvaW5maW5pdGVfcmVjXzMucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9yZWNfMy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwNGU0Yy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9yZWNfMy5weQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0jIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyMDI1MzMKLQotY2xhc3MgQShvYmplY3QpOgotICAgIHBhc3MKLUEuX19jYWxsX18gPSBBKCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBBKCkoKSAgICMgc2VnZmF1bHQ6IGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNGQzMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2lvbl9saW1pdF90b29faGlnaC5weQpAQCAtMCwwICsxLDE2IEBACisjIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBtYXkgY3Jhc2ggb3Igbm90IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisjIEUuZy4gb24gMzItYml0IEludGVsIExpbnV4IGluIGEgInN0YW5kYXJkIiBjb25maWd1cmF0aW9uIGl0IHNlZW1zIHRvCisjIGNyYXNoIG9uIFB5dGhvbiAyLjUgKGJ1dCBub3QgMi40IG5vciAyLjMpLiAgT24gV2luZG93cyB0aGUgaW1wb3J0CisjIGV2ZW50dWFsbHkgZmFpbHMgdG8gZmluZCB0aGUgbW9kdWxlLCBwb3NzaWJseSBiZWNhdXNlIHdlIHJ1biBvdXQgb2YKKyMgZmlsZSBoYW5kbGVzLgorCisjIFRoZSBwb2ludCBvZiB0aGlzIGV4YW1wbGUgaXMgdG8gc2hvdyB0aGF0IHN5cy5zZXRyZWN1cnNpb25saW1pdCgpIGlzIGEKKyMgaGFjaywgYW5kIG5vdCBhIHJvYnVzdCBzb2x1dGlvbi4gIFRoaXMgZXhhbXBsZSBzaW1wbHkgZXhlcmNpY2VzIGEgcGF0aAorIyB3aGVyZSBpdCB0YWtlcyBtYW55IEMtbGV2ZWwgcmVjdXJzaW9ucywgY29uc3VtaW5nIGEgbG90IG9mIHN0YWNrCisjIHNwYWNlLCBmb3IgZWFjaCBQeXRob24tbGV2ZWwgcmVjdXJzaW9uLiAgU28gMTAwMCB0aW1lcyB0aGlzIGFtb3VudCBvZgorIyBzdGFjayBzcGFjZSBtYXkgYmUgdG9vIG11Y2ggZm9yIHN0YW5kYXJkIHBsYXRmb3JtcyBhbHJlYWR5LgorCitpbXBvcnQgc3lzCitpZiAncmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoJyBpbiBzeXMubW9kdWxlczoKKyAgICBkZWwgc3lzLm1vZHVsZXNbJ3JlY3Vyc2lvbl9saW1pdF90b29faGlnaCddCitpbXBvcnQgcmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpdmVfY2FsbC5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CmluZGV4IDA3NzY0NzkuLjMxYzg5NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CkBAIC0xLDYgKzEsMTEgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCiAjIE5vIGJ1ZyByZXBvcnQgQUZBSUssIG1haWwgb24gcHl0aG9uLWRldiBvbiAyMDA2LTAxLTEwCisKKyMgVGhpcyBpcyBhICJ3b24ndCBmaXgiIGNhc2UuICBJdCBpcyBrbm93biB0aGF0IHNldHRpbmcgYSBoaWdoIGVub3VnaAorIyByZWN1cnNpb24gbGltaXQgY3Jhc2hlcyBieSBvdmVyZmxvd2luZyB0aGUgc3RhY2suICBVbmxlc3MgdGhpcyBpcworIyByZWRlc2lnbmVkIHNvbWVob3csIGl0IHdvbid0IGdvIGF3YXkuCisKIGltcG9ydCBzeXMKIAogc3lzLnNldHJlY3Vyc2lvbmxpbWl0KDEgPDwgMzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy94bWxfcGFyc2Vycy5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL3htbF9wYXJzZXJzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI1NzI3Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL3htbF9wYXJzZXJzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKLQotIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMjk2NDMzCi0KLWRlZiB0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKToKLSAgICAjCi0gICAgeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMjUpCi0gICAgIyB0aGlzIG9uZSBkb2Vzbid0IGNyYXNoCi0gICAgI3htbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMDAwKQotCi0gICAgZGVmIGhhbmRsZXIodGV4dCk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbgotCi0gICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKLSAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBoYW5kbGVyCi0KLSAgICB0cnk6Ci0gICAgICAgIHBhcnNlci5QYXJzZSh4bWwpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9wYXJzZV9vbmx5X3htbF9kYXRhKCkKLQotIyBJbnZhbGlkIHJlYWQgb2Ygc2l6ZSA0Ci0jICAgIGF0IDB4NDNGOTM2OiBQeU9iamVjdF9GcmVlIChvYm1hbGxvYy5jOjczNSkKLSMgICAgYnkgMHg0NUE3Qzc6IHVuaWNvZGVfZGVhbGxvYyAodW5pY29kZW9iamVjdC5jOjI0NikKLSMgICAgYnkgMHgxMjk5MDIxRDogUHlVbmtub3duRW5jb2RpbmdIYW5kbGVyIChweWV4cGF0LmM6MTMxNCkKLSMgICAgYnkgMHgxMjk5M0E2NjogcHJvY2Vzc1htbERlY2wgKHhtbHBhcnNlLmM6MzMzMCkKLSMgICAgYnkgMHgxMjk5OTIxMTogZG9Qcm9sb2cgKHhtbHBhcnNlLmM6MzY3OCkKLSMgICAgYnkgMHgxMjk5QzNGMDogcHJvbG9nSW5pdFByb2Nlc3NvciAoeG1scGFyc2UuYzozNTUwKQotIyAgICBieSAweDEyOTkxRUEzOiBYTUxfUGFyc2VCdWZmZXIgKHhtbHBhcnNlLmM6MTU2MikKLSMgICAgYnkgMHgxMjk4RjhFQzogeG1scGFyc2VfUGFyc2UgKHB5ZXhwYXQuYzo4OTUpCi0jICAgIGJ5IDB4NDdCM0ExOiBQeUV2YWxfRXZhbEZyYW1lRXggKGNldmFsLmM6MzU2NSkKLSMgICAgYnkgMHg0N0NDQUM6IFB5RXZhbF9FdmFsQ29kZUV4IChjZXZhbC5jOjI3MzkpCi0jICAgIGJ5IDB4NDdDREUxOiBQeUV2YWxfRXZhbENvZGUgKGNldmFsLmM6NDkwKQotIyAgICBieSAweDQ5OTgyMDogUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MgKHB5dGhvbnJ1bi5jOjExOTgpCi0jICAgIGJ5IDB4NDExN0YxOiBQeV9NYWluIChtYWluLmM6NDkyKQotIyAgICBieSAweDEyNDc2RDFGOiBfX2xpYmNfc3RhcnRfbWFpbiAoaW4gL2xpYi9saWJjLTIuMy41LnNvKQotIyAgICBieSAweDQxMERDOTogKHdpdGhpbiAvaG9tZS9uZWFsL2J1aWxkL3B5dGhvbi9zdm4vY2xlYW4vcHl0aG9uKQotIyAgQWRkcmVzcyAweDEyNzA0MDIwIGlzIDI2NCBieXRlcyBpbnNpZGUgYSBibG9jayBvZiBzaXplIDU5MiBmcmVlJ2QKLSMgICAgYXQgMHgxMUIxQkE4QTogZnJlZSAodmdfcmVwbGFjZV9tYWxsb2MuYzoyMzUpCi0jICAgIGJ5IDB4MTI0QjVGMTg6ICh3aXRoaW4gL2xpYi9saWJjLTIuMy41LnNvKQotIyAgICBieSAweDQ4REU0MzogZmluZF9tb2R1bGUgKGltcG9ydC5jOjEzMjApCi0jICAgIGJ5IDB4NDhFOTk3OiBpbXBvcnRfc3VibW9kdWxlIChpbXBvcnQuYzoyMjQ5KQotIyAgICBieSAweDQ4RUMxNTogbG9hZF9uZXh0IChpbXBvcnQuYzoyMDgzKQotIyAgICBieSAweDQ4RjA5MTogaW1wb3J0X21vZHVsZV9leCAoaW1wb3J0LmM6MTkxNCkKLSMgICAgYnkgMHg0OEYzODU6IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4IChpbXBvcnQuYzoxOTU1KQotIyAgICBieSAweDQ2RDA3MDogYnVpbHRpbl9fX2ltcG9ydF9fIChibHRpbm1vZHVsZS5jOjQ0KQotIyAgICBieSAweDQxODZDRjogUHlPYmplY3RfQ2FsbCAoYWJzdHJhY3QuYzoxNzc3KQotIyAgICBieSAweDQ3NEU5QjogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMgKGNldmFsLmM6MzQzMikKLSMgICAgYnkgMHg0NzkyOEU6IFB5RXZhbF9FdmFsRnJhbWVFeCAoY2V2YWwuYzoyMDM4KQotIyAgICBieSAweDQ3Q0NBQzogUHlFdmFsX0V2YWxDb2RlRXggKGNldmFsLmM6MjczOSkKLSMgICAgYnkgMHg0N0NERTE6IFB5RXZhbF9FdmFsQ29kZSAoY2V2YWwuYzo0OTApCi0jICAgIGJ5IDB4NDhEMEY3OiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4IChpbXBvcnQuYzo2MzUpCi0jICAgIGJ5IDB4NDhENEY0OiBsb2FkX3NvdXJjZV9tb2R1bGUgKGltcG9ydC5jOjkxMykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Zvcmtfd2FpdC5weSBiL0xpYi90ZXN0L2Zvcmtfd2FpdC5weQppbmRleCA1NjAwYmRiLi43ZWI1NWY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9mb3JrX3dhaXQucHkKKysrIGIvTGliL3Rlc3QvZm9ya193YWl0LnB5CkBAIC0zNCw3ICszNCwxNCBAQAogICAgICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6Ci0gICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0cGlkKCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgyICogU0hPUlRTTEVFUCkKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzcGlkLCBjcGlkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9vc3NhdWRpb2RldiBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CmluZGV4IDlmNTVhZmEuLmYwZGY1ZDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CisrKyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CkBAIC0xLDMgKzEsMiBAQAogdGVzdF9vc3NhdWRpb2RldgotcGxheWluZyB0ZXN0IHNvdW5kIGZpbGUuLi4KLWVsYXBzZWQgdGltZTogMy4xIHNlYworcGxheWluZyB0ZXN0IHNvdW5kIGZpbGUgKGV4cGVjdGVkIHJ1bm5pbmcgdGltZTogMi45MyBzZWMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF90aHJlYWQgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF90aHJlYWQKaW5kZXggZDQ5NjUxZC4uNjhjNmE5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdGhyZWFkCisrKyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X3RocmVhZApAQCAtNCwzICs0LDE1IEBACiAKICoqKiBCYXJyaWVyIFRlc3QgKioqCiBhbGwgdGFza3MgZG9uZQorCisqKiogQ2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUgKioqCitjYXVnaHQgZXhwZWN0ZWQgVmFsdWVFcnJvciBzZXR0aW5nIHN0YWNrX3NpemUoNDA5NikKK3N1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSgyNjIxNDQpCitzdWNjZXNzZnVsbHkgc2V0IHN0YWNrX3NpemUoMTA0ODU3NikKK3N1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSgwKQordHJ5aW5nIHN0YWNrX3NpemUgPSAyNjIxNDQKK3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZQorYWxsIHRhc2tzIGRvbmUKK3RyeWluZyBzdGFja19zaXplID0gMTA0ODU3Ngord2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlCithbGwgdGFza3MgZG9uZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcmVncnRlc3QucHkgYi9MaWIvdGVzdC9yZWdydGVzdC5weQppbmRleCBjYTRhM2I1Li40NTUzODM4IDEwMDc1NQotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtNjYsNyArNjYsOSBAQAogCiAtTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCiB0eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCi0yIGJpbGlvbiBvYmplY3RzLCBhbmQgb25seSB3b3JrIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAorMiBiaWxsaW9uIG9iamVjdHMsIHdoaWNoIG9ubHkgd29ya3Mgb24gNjQtYml0IHN5c3RlbXMuIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3Rlc3RzIHRoYXQgdHJ5IHRvIGV4aGF1c3QgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MsIHdoaWNoIG9ubHkgbWFrZXMKK3NlbnNlIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGggYXQgbGVhc3QgMkdiIG9mIG1lbW9yeS4gVGhlIHBhc3NlZC1pbiBtZW1saW1pdCwKIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mICcyLjVHYicsIGRldGVybWluZXMgaG93bXVjaCBtZW1vcnkgdGhlCiB0ZXN0cyB3aWxsIGxpbWl0IHRoZW1zZWx2ZXMgdG8gKGJ1dCB0aGV5IG1heSBnbyBzbGlnaHRseSBvdmVyLikgVGhlIG51bWJlcgogc2hvdWxkbid0IGJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIG1hY2hpbmUgaGFzIChpbmNsdWRpbmcgc3dhcCBtZW1vcnkpLiBZb3UKQEAgLTQ5NiwxNCArNDk4LDMwIEBACiAKIGRlZiBydW50ZXN0KHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwgdGVzdGRpcj1Ob25lLCBodW50cmxlYWtzPUZhbHNlKToKICAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKwogICAgIHRlc3QgLS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QKICAgICBnZW5lcmF0ZSAtLSBpZiB0cnVlLCBnZW5lcmF0ZSBvdXRwdXQsIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdGVzdAotICAgIGFuZCBjb21wYXJpbmcgaXQgdG8gYSBwcmV2aW91c2x5IGNyZWF0ZWQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICBhbmQgY29tcGFyaW5nIGl0IHRvIGEgcHJldmlvdXNseSBjcmVhdGVkIG91dHB1dCBmaWxlCiAgICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCiAgICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCiAgICAgdGVzdGRpciAtLSB0ZXN0IGRpcmVjdG9yeQorICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCisgICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cworICAgIFJldHVybjoKKyAgICAgICAgLTIgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAorICAgICAgICAtMSAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgorICAgICAgICAgMCAgdGVzdCBmYWlsZWQKKyAgICAgICAgIDEgIHRlc3QgcGFzc2VkCiAgICAgIiIiCiAKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBydW50ZXN0X2lubmVyKHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwgdGVzdGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcykKKyAgICBmaW5hbGx5OgorICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCisKK2RlZiBydW50ZXN0X2lubmVyKHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwKKyAgICAgICAgICAgICAgICAgICAgIHRlc3RkaXI9Tm9uZSwgaHVudHJsZWFrcz1GYWxzZSk6CiAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCh0ZXN0KQogICAgIGlmIG5vdCB0ZXN0ZGlyOgogICAgICAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIoKQpAQCAtNTk1LDYgKzYxMywzNyBAQAogICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICAgcmV0dXJuIDAKIAorZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgorICAgIGltcG9ydCBzaHV0aWwKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluICh0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBudWtlcihuYW1lKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBtc2c6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSkKKwogZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKICAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgogICAgIGltcG9ydCBjb3B5X3JlZwpAQCAtNjM3LDcgKzY4Niw3IEBACiAKIGRlZiBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYyk6CiAgICAgaW1wb3J0IGdjLCBjb3B5X3JlZwotICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZSwgd2FybmluZ3MsIGRpcmNhY2hlCisgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlLCBkaXJjYWNoZQogICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyLCBtaW1ldHlwZXMsIGRvY3Rlc3QKICAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wCiAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKQEAgLTEyMjcsNiArMTI3NiwzNyBAQAogICAgICAgICB0ZXN0X3dpbnJlZwogICAgICAgICB0ZXN0X3dpbnNvdW5kCiAgICAgICAgICIiIiwKKyAgICAnbmV0YnNkMyc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2FlcGFjaworICAgICAgICB0ZXN0X2FsCisgICAgICAgIHRlc3RfYXBwbGVzaW5nbGUKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY2QKKyAgICAgICAgdGVzdF9jbAorICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dsCisgICAgICAgIHRlc3RfaW1nZmlsZQorICAgICAgICB0ZXN0X2xpbnV4YXVkaW9kZXYKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9tYWNmcworICAgICAgICB0ZXN0X21hY29zdG9vbHMKKyAgICAgICAgdGVzdF9uaXMKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BlcDI3NworICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQorICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdW5pY29kZV9maWxlCisgICAgICAgIHRlc3Rfd2lucmVnCisgICAgICAgIHRlc3Rfd2luc291bmQKKyAgICAgICAgIiIiLAogfQogX2V4cGVjdGF0aW9uc1snZnJlZWJzZDUnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KIF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q2J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKaW5kZXggYWFhMmRjMi4uNzM0NDdhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcjIsIHJlbSA9IGxlbihpKSsxLCAwCiAgICAgICAgICAgICAgICAgaWYgcmVtIG9yIHIxICE9IHIyOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbSwgMCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtLCAwLCAnJXMgIT0gMCBmb3IgJXMnICUgKHJlbSwgaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyLCAnJXMgIT0gJXMgZm9yICVzJyAlIChyMSwgcjIsIGkpKQogCiAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmNkZWZnaGlhYmMnLCAnZmluZCcsICdhYmMnKQpAQCAtNjM2LDYgKzYzNiwxMSBAQAogICAgICAgICBFUSgiYm9ib2JYYm9ib2IiLCAiYm9ib2JvYlhib2JvYm9iIiwgInJlcGxhY2UiLCAiYm9ib2IiLCAiYm9iIikKICAgICAgICAgRVEoIkJPQk9CT0IiLCAiQk9CT0JPQiIsICJyZXBsYWNlIiwgImJvYiIsICJib2JieSIpCiAKKyAgICAgICAgYmEgPSBidWZmZXIoJ2EnKQorICAgICAgICBiYiA9IGJ1ZmZlcignYicpCisgICAgICAgIEVRKCJiYmMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYSwgYmIpCisgICAgICAgIEVRKCJhYWMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYiwgYmEpCisKICAgICAgICAgIwogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmV0d290aHJlZScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnJykKQEAgLTgxOSw2ICs4MjQsMjEgQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJykKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJywgNDIpCiAKKyAgICAgICAgIyB0ZXN0IHR1cGxlIGFyZ3VtZW50cworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlJywgJ2hhJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2xvJywgJ2xsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlbGxveCcsICdoZWxsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgKCdoZWxsb3dvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcsICdsb3dvJyksIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnc3RhcnRzd2l0aCcsICgnaGVsbG93bycsICdlbGxvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnKSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdsbycsICdoZScpLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGVsJyksIDAsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGVsJyksIDAsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJywgKDQyLCkpCisKICAgICBkZWYgdGVzdF9lbmRzd2l0aChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICdsbycpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2hlJykKQEAgLTg1Myw2ICs4NzMsMjEgQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcpCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCA0MikKIAorICAgICAgICAjIHRlc3QgdHVwbGUgYXJndW1lbnRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoYScpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdsbycsICdsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbG94JywgJ2hlbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICgnaGVsbG93bycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnLCAnbG93bycpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgKCdoZWxsb3dvJywgJ2VsbG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcpLCAzLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbCcsICdlbGwnKSwgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGUnLCAnaGVsbCcpLCAwLCA0KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoNDIsKSkKKwogICAgIGRlZiB0ZXN0X19fY29udGFpbnNfXyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcnLCAnX19jb250YWluc19fJywgJycpICAgICAgICAgIyB2ZXJlcSgnJyBpbiAnJywgVHJ1ZSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhYmMnLCAnX19jb250YWluc19fJywgJycpICAgICAgIyB2ZXJlcSgnJyBpbiAnYWJjJywgVHJ1ZSkKQEAgLTg3Miw3ICs5MDcsNyBAQAogICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdhYmMnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMTAwMCkpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2EnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMSkpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1JycsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAwKSkKLSAgICAgICAgIyBGSVhNRSBXaGF0IGFib3V0IG5lZ2F0aXZlIGluZGl6ZXM/IFRoaXMgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBieSBbXSBhbmQgX19nZXRpdGVtX18oc2xpY2UpCisgICAgICAgICMgRklYTUUgV2hhdCBhYm91dCBuZWdhdGl2ZSBpbmRpY2VzPyBUaGlzIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgYnkgW10gYW5kIF9fZ2V0aXRlbV9fKHNsaWNlKQogCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgJ2RlZicpCiAKQEAgLTkwOCw2ICs5NDMsOCBAQAogICAgICAgICAjIHRlc3QudGVzdF9zdHJpbmcuU3RyaW5nVGVzdC50ZXN0X2pvaW4pCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYSBiIGMgZCcsICcgJywgJ2pvaW4nLCBbJ2EnLCAnYicsICdjJywgJ2QnXSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNkJywgJycsICdqb2luJywgKCdhJywgJ2InLCAnYycsICdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYmQnLCAnJywgJ2pvaW4nLCAoJycsICdiJywgJycsICdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWMnLCAnJywgJ2pvaW4nLCAoJ2EnLCAnJywgJ2MnLCAnJykpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgndyB4IHkgeicsICcgJywgJ2pvaW4nLCBTZXF1ZW5jZSgpKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhJywgJ2pvaW4nLCAoJ2FiYycsKSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd6JywgJ2EnLCAnam9pbicsIFVzZXJMaXN0KFsneiddKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQppbmRleCA5Nzk5Zjg5Li5lYzU5ZDcxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CkBAIC0xMTMsNiArMTEzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIGV2YWwoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludChmbG9hdCgnMy4xNCcpICogMTAwKSwgMzE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgZmxvYXQoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKKyAgICAgICAgICAgIGlmIGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddICE9ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXS5qb2luKFsnMScsICcyMyddKSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChfTG9jYWxlVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CmluZGV4IGM2NGFkMjguLjE0ZmMwMTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0xNjAsNyArMTYwLDcgQEAKICgnTW9kdWxlJywgWygnRnVuY3Rpb25EZWYnLCAoMSwgMCksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgTm9uZSwgW10pLCBbKCdSZXR1cm4nLCAoMSwgOCksICgnTnVtJywgKDEsIDE1KSwgMSkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ0RlbGV0ZScsICgxLCAwKSwgWygnTmFtZScsICgxLCA0KSwgJ3YnLCAoJ0RlbCcsKSldKV0pLAogKCdNb2R1bGUnLCBbKCdBc3NpZ24nLCAoMSwgMCksIFsoJ05hbWUnLCAoMSwgMCksICd2JywgKCdTdG9yZScsKSldLCAoJ051bScsICgxLCA0KSwgMSkpXSksCi0oJ01vZHVsZScsIFsoJ0F1Z0Fzc2lnbicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAndicsICgnTG9hZCcsKSksICgnQWRkJywpLCAoJ051bScsICgxLCA1KSwgMSkpXSksCisoJ01vZHVsZScsIFsoJ0F1Z0Fzc2lnbicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAndicsICgnU3RvcmUnLCkpLCAoJ0FkZCcsKSwgKCdOdW0nLCAoMSwgNSksIDEpKV0pLAogKCdNb2R1bGUnLCBbKCdQcmludCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDgpLCAnZicsICgnTG9hZCcsKSksIFsoJ051bScsICgxLCAxMSksIDEpXSwgRmFsc2UpXSksCiAoJ01vZHVsZScsIFsoJ0ZvcicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDQpLCAndicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgOSksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCAxMSkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ1doaWxlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNiksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA4KSldLCBbXSldKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CmluZGV4IGY5MzU4N2EuLjk5MjYxNjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQpAQCAtMTMsNyArMTMsOCBAQAogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICAgICAgc29jay5iaW5kKChIT1NULCBQT1JUKSkKKyAgICAgICAgZ2xvYmFsIFBPUlQKKyAgICAgICAgUE9SVCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc29jaywgSE9TVCwgUE9SVCkKICAgICAgICAgc29jay5saXN0ZW4oMSkKICAgICAgICAgY29ubiwgY2xpZW50ID0gc29jay5hY2NlcHQoKQogICAgICAgICBidWZmZXIgPSAiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkgYi9MaWIvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxNWZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkKQEAgLTAsMCArMSw0NiBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGJpZ2FkZHJzcGFjZXRlc3QsIE1BWF9QeV9zc2l6ZV90CisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgc3lzCisKKworY2xhc3MgU3RyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAYmlnYWRkcnNwYWNldGVzdAorICAgIGRlZiB0ZXN0X2NvbmNhdChzZWxmKToKKyAgICAgICAgczEgPSAneCcgKiBNQVhfUHlfc3NpemVfdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcGVyYXRvci5hZGQsIHMxLCAnPycpCisKKyAgICBAYmlnYWRkcnNwYWNldGVzdAorICAgIGRlZiB0ZXN0X29wdGltaXplZF9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSAneCcgKiBNQVhfUHlfc3NpemVfdAorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0geCArICc/JyAgICAgIyB0aGlzIHN0YXRlbWVudCB1c2VzIGEgZmFzdCBwYXRoIGluIGNldmFsLmMKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPdmVyZmxvd0Vycm9yIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCArPSAnPycgICAgICAgICMgdGhpcyBzdGF0ZW1lbnQgdXNlcyBhIGZhc3QgcGF0aCBpbiBjZXZhbC5jCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3ZlcmZsb3dFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih4KSwgTUFYX1B5X3NzaXplX3QpCisKKyAgICAjIyMgdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHBlbmRpbmcgYSBwYXRjaAorICAgICMgICAoaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA2LUp1bHkvMDY3Nzc0Lmh0bWwpCisgICAgI0BiaWdhZGRyc3BhY2V0ZXN0CisgICAgI2RlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAjICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9wZXJhdG9yLm11bCwgJ3gnLCBNQVhfUHlfc3NpemVfdCArIDEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnNldF9tZW1saW1pdChzeXMuYXJndlsxXSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkgYi9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQppbmRleCAyNTU0MjhmLi42ZDZjMzdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQpAQCAtMjgsNyArMjgsNyBAQAogIyAgLSBXaGlsZSB0aGUgYmlnbWVtdGVzdCBkZWNvcmF0b3Igc3BlYWtzIG9mICdtaW5zaXplJywgYWxsIHRlc3RzIHdpbGwKICMgICAgYWN0dWFsbHkgYmUgY2FsbGVkIHdpdGggYSBtdWNoIHNtYWxsZXIgbnVtYmVyIHRvbywgaW4gdGhlIG5vcm1hbAogIyAgICB0ZXN0IHJ1biAoNUtiIGN1cnJlbnRseS4pIFRoaXMgaXMgc28gdGhlIHRlc3RzIHRoZW1zZWx2ZXMgZ2V0IGZyZXF1ZW50Ci0jICAgIHRlc3RpbmcgQ29uc2VxdWVudGx5LCBhbHdheXMgbWFrZSBhbGwgbGFyZ2UgYWxsb2NhdGlvbnMgYmFzZWQgb24gdGhlCisjICAgIHRlc3RpbmcuIENvbnNlcXVlbnRseSwgYWx3YXlzIG1ha2UgYWxsIGxhcmdlIGFsbG9jYXRpb25zIGJhc2VkIG9uIHRoZQogIyAgICBwYXNzZWQtaW4gJ3NpemUnLCBhbmQgZG9uJ3QgcmVseSBvbiB0aGUgc2l6ZSBiZWluZyB2ZXJ5IGxhcmdlLiBBbHNvLAogIyAgICBtZW11c2UtcGVyLXNpemUgc2hvdWxkIHJlbWFpbiBzYW5lIChsZXNzIHRoYW4gYSBmZXcgdGhvdXNhbmQpOyBpZiB5b3VyCiAjICAgIHRlc3QgdXNlcyBtb3JlLCBhZGp1c3QgJ3NpemUnIHVwd2FyZCwgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CmluZGV4IDUxM2U1NDEuLjQ3NGYzZGEgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQpAQCAtOCw3ICs4LDYgQEAKIGltcG9ydCBkYmhhc2ggIyBKdXN0IHNvIHdlIGtub3cgaXQncyBpbXBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotZnJvbSBzZXRzIGltcG9ydCBTZXQKIAogY2xhc3MgVGVzdEJTRERCKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBvcGVuZmxhZyA9ICdjJwpAQCAtNTMsNyArNTIsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZba10sIHYpCiAKICAgICBkZWYgYXNzZXJ0U2V0RXF1YWxzKHNlbGYsIHNlcW4xLCBzZXFuMik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU2V0KHNlcW4xKSwgU2V0KHNlcW4yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VxbjEpLCBzZXQoc2VxbjIpKQogCiAgICAgZGVmIHRlc3RfbWFwcGluZ19pdGVyYXRpb25fbWV0aG9kcyhzZWxmKToKICAgICAgICAgZiA9IHNlbGYuZgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IGU2ZTQ0NDAuLmM3ZTQzOTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTUzMiwxMyArNTMyLDI0IEBACiAgICAgQHJ1bl93aXRoX2xvY2FsZSgnTENfTlVNRVJJQycsICdmcl9GUicsICdkZV9ERScpCiAgICAgZGVmIHRlc3RfZmxvYXRfd2l0aF9jb21tYShzZWxmKToKICAgICAgICAgIyBzZXQgbG9jYWxlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgdXNlICcuJyBmb3IgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgIyBmbG9hdCBtdXN0IG5vdCBhY2NlcHQgdGhlIGxvY2FsZSBzcGVjaWZpYyBkZWNpbWFsIHBvaW50IGJ1dAorICAgICAgICAjIGl0IHN0aWxsIGhhcyB0byBhY2NlcHQgdGhlIG5vcm1hbCBweXRob24gc3ludGFjCiAgICAgICAgIGltcG9ydCBsb2NhbGUKICAgICAgICAgaWYgbm90IGxvY2FsZS5sb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXSA9PSAnLCc6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDMsMTQgICIpLCAzLjE0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgICszLDE0ICAiKSwgMy4xNCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAtMywxNCAgIiksIC0zLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDMuMTQgICIpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIrMy4xNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIi0zLjE0ICAiKSwgLTMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIi4xNCAgIiksIC4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy4gICIpLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjMuZTMgICIpLCAzMDAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjMuMmUzICAiKSwgMzIwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIyLjVlLTEgICIpLCAwLjI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCI1ZS0xIiksIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIDMsMTQgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICArMywxNCAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0zLDE0ICAiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgMHgzLjEgICIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAtMHgzLnAtMSAgIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAyNS5lLTEgICIpLCAyLjUpCkBAIC02MDMsNiArNjE0LDE5IEBACiAgICAgICAgIGRlZiBmKCk6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBbXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCB7fSkKKyAgICAgICAgIyBCdWcgMTUzNjAyMTogQWxsb3cgaGFzaCB0byByZXR1cm4gbG9uZyBvYmplY3RzCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIqKjEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGhhc2goWCgpKSksIGludCkKKyAgICAgICAgY2xhc3MgWShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKioxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHlwZShoYXNoKFkoKSkpLCBpbnQpCisgICAgICAgIGNsYXNzIFoobG9uZyk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGFzaChaKDQyKSksIGhhc2goNDJMKSkKIAogICAgIGRlZiB0ZXN0X2hleChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMTYpLCAnMHgxMCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J6Mi5weSBiL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CmluZGV4IDM1NmMyZTMuLmYxOTgxMTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgYnoyZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSkKICAgICAgICAgeGxpbmVzID0gbGlzdChiejJmLnJlYWRsaW5lcygpKQogICAgICAgICBiejJmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWydUZXN0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeGxpbmVzLCBbJ1Rlc3QnXSkKIAogCiBjbGFzcyBCWjJDb21wcmVzc29yVGVzdChCYXNlVGVzdCk6CkBAIC0zNDQsNiArMzQ0LDcgQEAKICAgICAgICAgQloyRGVjb21wcmVzc29yVGVzdCwKICAgICAgICAgRnVuY1Rlc3QKICAgICApCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCBlYzg2MGQxLi41ZTg5ODYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTg3LDYgKzg3LDcgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbWRMaW5lVGVzdCkKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlLnB5CmluZGV4IDUyYmM4OTQuLjRlNjg2MzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGUucHkKQEAgLTYxLDYgKzYxLDIzIEBACiBmbGFnczogNjcKIGNvbnN0czogKCdOb25lJywpCiAKKz4+PiBkZWYgb3B0aW1pemVfYXdheSgpOgorLi4uICAgICAnZG9jIHN0cmluZycKKy4uLiAgICAgJ25vdCBhIGRvY3N0cmluZycKKy4uLiAgICAgNTMKKy4uLiAgICAgNTNMCisKKz4+PiBkdW1wKG9wdGltaXplX2F3YXkuZnVuY19jb2RlKQorbmFtZTogb3B0aW1pemVfYXdheQorYXJnY291bnQ6IDAKK25hbWVzOiAoKQordmFybmFtZXM6ICgpCitjZWxsdmFyczogKCkKK2ZyZWV2YXJzOiAoKQorbmxvY2FsczogMAorZmxhZ3M6IDY3Citjb25zdHM6ICgiJ2RvYyBzdHJpbmcnIiwgJ05vbmUnKQorCiAiIiIKIAogZGVmIGNvbnN0cyh0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggNmVhNDljYy4uODE1Mzk3OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTExNjYsNiArMTE2NiwxMiBAQAogICAgICAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRlbmNvZGVyKGVuY29kaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlbmNvZGVyKQogCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfbWFwX3R5cGVfaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgICAgIGZyb20gZW5jb2RpbmdzIGltcG9ydCBjcDExNDAKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2gsIHdlIGFyZSBvbmx5IHZlcmlmeWluZyB0aGVyZSdzIG5vIGNyYXNoLgorICAgICAgICB0YWJsZV90eXBlID0gdHlwZShjcDExNDAuZW5jb2RpbmdfdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFibGVfdHlwZSwgdGFibGVfdHlwZSkKKwogY2xhc3MgQmFzaWNTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CiAgICAgICAgIHMgPSAiYWJjMTIzIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKaW5kZXggMGY3ZDE1Zi4uYjcyYTFiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CkBAIC01LDcgKzUsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MsIHRlbXBmaWxlLCByZQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuCiBmcm9tIGNvbW1hbmRzIGltcG9ydCAqCiAKICMgVGhlIG1vZHVsZSBzYXlzOgpAQCAtNTgsNiArNTgsNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KENvbW1hbmRUZXN0cykKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDcyYzRmN2UuLmEzZjE1YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTE2Niw2ICsxNjYsMTYgQEAKICAgICAgICAgcGFzcyIiIgogICAgICAgICBjb21waWxlKHMsICI8c3RyaW5nPiIsICJleGVjIikKIAorICAgICMgVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHNwZWNpZmljIHRvIENQeXRob24gYW5kIG1heSBub3QgZ2VuZXJhbGl6ZQorICAgICMgdG8gb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgV2UgYXJlIHRyeWluZyB0byBlbnN1cmUgdGhhdCB3aGVuCisgICAgIyB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIHN0YXJ0cyBhZnRlciAyNTYsIGNvcnJlY3QgbGluZSBudW1iZXJzCisgICAgIyBpbiB0cmFjZWJhY2tzIGFyZSBzdGlsbCBwcm9kdWNlZC4KKyAgICBkZWYgdGVzdF9sZWFkaW5nX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzMjU2ID0gIiIuam9pbihbIlxuIl0gKiAyNTYgKyBbInNwYW0iXSkKKyAgICAgICAgY28gPSBjb21waWxlKHMyNTYsICdmbicsICdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19maXJzdGxpbmVubywgMjU3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2xub3RhYiwgJycpCisKICAgICBkZWYgdGVzdF9saXRlcmFsc193aXRoX2xlYWRpbmdfemVyb2VzKHNlbGYpOgogICAgICAgICBmb3IgYXJnIGluIFsiMDc3Nzg3IiwgIjB4aiIsICIweC4iLCAiMGUiLCAgIjA5MDAwMDAwMDAwMDAwMCIsCiAgICAgICAgICAgICAgICAgICAgICIwODAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDA5IiwgIjAwMDAwMDAwMDAwMDAwOCJdOgpAQCAtMjExLDYgKzIyMSwyNSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCItIiArIGFsbF9vbmVfYml0cyksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkhvdyBtYW55IGJpdHMgKmRvZXMqIHRoaXMgbWFjaGluZSBoYXZlPz8/IikKKyAgICAgICAgIyBWZXJpZnkgdHJlYXRtZW50IG9mIGNvbnRhbnQgZm9sZGluZyBvbiAtKHN5cy5tYXhpbnQrMSkKKyAgICAgICAgIyBpLmUuIC0yMTQ3NDgzNjQ4IG9uIDMyIGJpdCBwbGF0Zm9ybXMuICBTaG91bGQgcmV0dXJuIGludCwgbm90IGxvbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGV2YWwoIiVzIiAlICgtc3lzLm1heGludCAtIDEpKSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXZhbCgiJXMiICUgKC1zeXMubWF4aW50IC0gMikpLCBsb25nKSkKKworICAgIGlmIHN5cy5tYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgZGVmIHRlc3RfMzJfNjNfYml0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgICAgIGEgPSArNDI5NDk2NzI5NiAgIyAxIDw8IDMyCisgICAgICAgICAgICBiID0gLTQyOTQ5NjcyOTYgICMgMSA8PCAzMgorICAgICAgICAgICAgYyA9ICsyODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZCA9IC0yODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZSA9ICs0NjExNjg2MDE4NDI3Mzg3OTA0ICAjIDEgPDwgNjIKKyAgICAgICAgICAgIGYgPSAtNDYxMTY4NjAxODQyNzM4NzkwNCAgIyAxIDw8IDYyCisgICAgICAgICAgICBnID0gKzkyMjMzNzIwMzY4NTQ3NzU4MDcgICMgMSA8PCA2MyAtIDEKKyAgICAgICAgICAgIGggPSAtOTIyMzM3MjAzNjg1NDc3NTgwNyAgIyAxIDw8IDYzIC0gMQorCisgICAgICAgICAgICBmb3IgdmFyaWFibGUgaW4gc2VsZi50ZXN0XzMyXzYzX2JpdF92YWx1ZXMuZnVuY19jb2RlLmNvX2NvbnN0czoKKyAgICAgICAgICAgICAgICBpZiB2YXJpYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFyaWFibGUsIGludCkpCiAKICAgICBkZWYgdGVzdF9zZXF1ZW5jZV91bnBhY2tpbmdfZXJyb3Ioc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHNlcXVlbmNlIHBhY2tpbmcvdW5wYWNraW5nIHdpdGggIm9yIi4gIFNGIGJ1ZyAjNzU3ODE4CkBAIC0yMzgsNiArMjY3LDggQEAKICAgICAgICAgc3VjY2VlZCA9IFsKICAgICAgICAgICAgICdpbXBvcnQgc3lzJywKICAgICAgICAgICAgICdpbXBvcnQgb3MsIHN5cycsCisgICAgICAgICAgICAnaW1wb3J0IG9zIGFzIGJhcicsCisgICAgICAgICAgICAnaW1wb3J0IG9zLnBhdGggYXMgYmFyJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMsIGdlbmVyYXRvcnMnLAogICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKG5lc3RlZF9zY29wZXMsXG5nZW5lcmF0b3JzKScsCiAgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAobmVzdGVkX3Njb3BlcyxcbmdlbmVyYXRvcnMsKScsCkBAIC0yNTcsNiArMjg4LDEwIEBACiAgICAgICAgICAgICAnaW1wb3J0IChzeXMnLAogICAgICAgICAgICAgJ2ltcG9ydCBzeXMpJywKICAgICAgICAgICAgICdpbXBvcnQgKG9zLCknLAorICAgICAgICAgICAgJ2ltcG9ydCBvcyBBcyBiYXInLAorICAgICAgICAgICAgJ2ltcG9ydCBvcy5wYXRoIGEgYmFyJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gQXMgc3Rkb3V0JywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gYSBzdGRvdXQnLAogICAgICAgICAgICAgJ2Zyb20gKHN5cykgaW1wb3J0IHN0ZGluJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChuZXN0ZWRfc2NvcGVzJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMpJywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CmluZGV4IDQ4ZjE2NDMuLjFlZmI2YTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQpAQCAtNTYsMTMgKzU2LDMwIEBACiAgICAgZGVmIHRlc3RZaWVsZEV4cHIoc2VsZik6CiAgICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoImRlZiBnKCk6IHlpZWxkXG5cbiIsICI8c3RyaW5nPiIsICJleGVjIikKIAorICAgIGRlZiB0ZXN0VHJ5RXhjZXB0RmluYWxseShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgZXhjZXB0IGFuZCBmaW5hbGx5IGNsYXVzZXMgaW4gb25lIHRyeSBzdG10IGFyZSByZWNvZ25pemVkCisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCJ0cnk6XG4gMS8wXG5leGNlcHQ6XG4gZSA9IDFcbmZpbmFsbHk6XG4gZiA9IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN0cmluZz4iLCAiZXhlYyIpCisgICAgICAgIGRjdCA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGN0LmdldCgnZScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkY3QuZ2V0KCdmJyksIDEpCisKICAgICBkZWYgdGVzdERlZmF1bHRBcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZXIucGFyc2UsICJkZWYgZm9vKGE9MSwgYik6IHBhc3MiKQogCisgICAgZGVmIHRlc3REb2NzdHJpbmdzKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnX19kb2NfXycgaW4gYy5jb19uYW1lcykKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2RlZiBmKCk6XG4gImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGcgPSB7fQorICAgICAgICBleGVjIGMgaW4gZworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhnWydmJ10uX19kb2NfXywgImRvYyIpCisKICAgICBkZWYgdGVzdExpbmVObyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgYWxsIG5vZGVzIGV4Y2VwdCBNb2R1bGUgaGF2ZSBhIGNvcnJlY3QgbGluZW5vIGF0dHJpYnV0ZS4KICAgICAgICAgZmlsZW5hbWUgPSBfX2ZpbGVfXwotICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnB5YyIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIucHlvIik6CisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTFdCiAgICAgICAgIHRyZWUgPSBjb21waWxlci5wYXJzZUZpbGUoZmlsZW5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfbGluZW5vKHRyZWUpCkBAIC04Nyw2ICsxMDQsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmxhdHRlbihbMSwgWzJdXSksIFsxLCAyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmxhdHRlbigoMSwgKDIsKSkpLCBbMSwgMl0pCiAKKyAgICBkZWYgdGVzdE5lc3RlZFNjb3BlKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZGVmIGcoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBhID0gMVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRlZiBmKCk6IHJldHVybiBhICsgMlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHJldHVybiBmKClcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCA9IGcoKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJykKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkY3QuZ2V0KCdyZXN1bHQnKSwgMykKKworCiBOT0xJTkVOTyA9IChjb21waWxlci5hc3QuTW9kdWxlLCBjb21waWxlci5hc3QuU3RtdCwgY29tcGlsZXIuYXN0LkRpc2NhcmQpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEwMyw2ICsxMzMsMTIgQEAKIGwgPSBbKHgsIHkpIGZvciB4LCB5IGluIHppcChyYW5nZSg1KSwgcmFuZ2UoNSwxMCkpXQogbFswXQogbFszOjRdCitkID0geydhJzogMn0KK2QgPSB7fQordCA9ICgpCit0ID0gKDEsIDIpCitsID0gW10KK2wgPSBbMSwgMl0KIGlmIGw6CiAgICAgcGFzcwogZWxzZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3Vyc2VzLnB5IGIvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKaW5kZXggZGMyZjIwYi4uNDAyMjE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKQEAgLTIxMiw2ICsyMTIsMTMgQEAKICAgICAgICAgICAgIG0gPSBjdXJzZXMuZ2V0bW91c2UoKQogICAgICAgICAgICAgY3Vyc2VzLnVuZ2V0bW91c2UoKm0pCiAKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ2lzX3Rlcm1fcmVzaXplZCcpOgorICAgICAgICBjdXJzZXMuaXNfdGVybV9yZXNpemVkKCpzdGRzY3IuZ2V0bWF4eXgoKSkKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ3Jlc2l6ZXRlcm0nKToKKyAgICAgICAgY3Vyc2VzLnJlc2l6ZXRlcm0oKnN0ZHNjci5nZXRtYXh5eCgpKQorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXplX3Rlcm0nKToKKyAgICAgICAgY3Vyc2VzLnJlc2l6ZV90ZXJtKCpzdGRzY3IuZ2V0bWF4eXgoKSkKKwogZGVmIHVuaXRfdGVzdHMoKToKICAgICBmcm9tIGN1cnNlcyBpbXBvcnQgYXNjaWkKICAgICBmb3IgY2gsIGV4cGVjdGVkIGluIFsoJ2EnLCAnYScpLCAoJ0EnLCAnQScpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKaW5kZXggYjVhNjYyOC4uMTM0YjVhOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CkBAIC00LDYgKzQsNyBAQAogaW1wb3J0IGNvcHkKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAogCkBAIC0xMzEsNSArMTMyLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCiAKIAorZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdERlZmF1bHREaWN0KQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCA4ZWU0MzFiLi40YTM5YmU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTE4OTksNiArMTg5OSwxNiBAQAogICAgICAgICBwcm9wMiA9IHByb3BlcnR5KGZzZXQ9c2V0dGVyKQogICAgICAgICB2ZXJlcShwcm9wMi5fX2RvY19fLCBOb25lKQogCisgICAgIyB0aGlzIHNlZ2ZhdWx0ZWQgaW4gMi41YjIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBwID0gcHJvcGVydHkoX3Rlc3RjYXBpLnRlc3Rfd2l0aF9kb2NzdHJpbmcpCisKKwogZGVmIHN1cGVycygpOgogICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIHN1cGVyLi4uIgogCkBAIC0zMDQ2LDYgKzMwNTYsMjEgQEAKICAgICBsaXN0Ll9faW5pdF9fKGEsIHNlcXVlbmNlPVswLCAxLCAyXSkKICAgICB2ZXJlcShhLCBbMCwgMSwgMl0pCiAKK2RlZiByZWN1cnNpdmVfX2NhbGxfXygpOgorICAgIGlmIHZlcmJvc2U6IHByaW50ICgiVGVzdGluZyByZWN1cnNpdmUgX19jYWxsX18oKSBieSBzZXR0aW5nIHRvIGluc3RhbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyAuLi4iKQorICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgcGFzcworCisgICAgQS5fX2NhbGxfXyA9IEEoKQorICAgIHRyeToKKyAgICAgICAgQSgpKCkKKyAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiUmVjdXJzaW9uIGxpbWl0IHNob3VsZCBoYXZlIGJlZW4gcmVhY2hlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2NhbGxfXygpIikKKwogZGVmIGRlbGhvb2soKToKICAgICBpZiB2ZXJib3NlOiBwcmludCAiVGVzdGluZyBfX2RlbF9fIGhvb2suLi4iCiAgICAgbG9nID0gW10KQEAgLTM4MDMsNiArMzgyOCwxMyBAQAogICAgIG8ud2hhdGV2ZXIgPSBQcm92b2tlcihvKQogICAgIGRlbCBvCiAKK2RlZiB3cmFwcGVyX3NlZ2ZhdWx0KCk6CisgICAgIyBTRiA5MjcyNDg6IGRlZXBseSBuZXN0ZWQgd3JhcHBlcnMgY291bGQgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cKKyAgICBmID0gbGFtYmRhOk5vbmUKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMDAwMCk6CisgICAgICAgIGYgPSBmLl9fY2FsbF9fCisgICAgZiA9IE5vbmUKKwogIyBGaXggU0YgIzc2MjQ1NSwgc2VnZmF1bHQgd2hlbiBzeXMuc3Rkb3V0IGlzIGNoYW5nZWQgaW4gZ2V0YXR0cgogZGVmIGZpbGVmYXVsdCgpOgogICAgIGlmIHZlcmJvc2U6CkBAIC0zOTU3LDYgKzM5ODksNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgd2Vha3JlZl9zZWdmYXVsdCgpICMgTXVzdCBiZSBmaXJzdCwgc29tZWhvdworICAgIHdyYXBwZXJfc2VnZmF1bHQoKQogICAgIGRvX3RoaXNfZmlyc3QoKQogICAgIGNsYXNzX2RvY3N0cmluZ3MoKQogICAgIGxpc3RzKCkKQEAgLTQwMTUsNiArNDA0OCw3IEBACiAgICAgYnVmZmVyX2luaGVyaXQoKQogICAgIHN0cl9vZl9zdHJfc3ViY2xhc3MoKQogICAgIGt3ZGFyZ3MoKQorICAgIHJlY3Vyc2l2ZV9fY2FsbF9fKCkKICAgICBkZWxob29rKCkKICAgICBoYXNoaW5oZXJpdCgpCiAgICAgc3Ryb3BzKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKaW5kZXggMDgxOTQxZC4uYzMxMDkyYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKQEAgLTgxLDYgKzgxLDEzIEBACiAgICAgIGJ1ZzEzMzM5ODIuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMiwKICAgICAgYnVnMTMzMzk4Mi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAzKQogCitfQklHX0xJTkVOT19GT1JNQVQgPSAiIiJcCislM2QgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHNwYW0pCisgICAgICAgICAgICAgIDMgUE9QX1RPUAorICAgICAgICAgICAgICA0IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgICA3IFJFVFVSTl9WQUxVRQorIiIiCisKIGNsYXNzIERpc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgZG9fZGlzYXNzZW1ibHlfdGVzdChzZWxmLCBmdW5jLCBleHBlY3RlZCk6CiAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCkBAIC0xMjQsNiArMTMxLDIzIEBACiAgICAgICAgIGlmIF9fZGVidWdfXzoKICAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChidWcxMzMzOTgyLCBkaXNfYnVnMTMzMzk4MikKIAorICAgIGRlZiB0ZXN0X2JpZ19saW5lbm9zKHNlbGYpOgorICAgICAgICBkZWYgZnVuYyhjb3VudCk6CisgICAgICAgICAgICBuYW1lc3BhY2UgPSB7fQorICAgICAgICAgICAgZnVuYyA9ICJkZWYgZm9vKCk6XG4gIiArICIiLmpvaW4oWyJcbiAiXSAqIGNvdW50ICsgWyJzcGFtXG4iXSkKKyAgICAgICAgICAgIGV4ZWMgZnVuYyBpbiBuYW1lc3BhY2UKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VbJ2ZvbyddCisKKyAgICAgICAgIyBUZXN0IGFsbCBzbWFsbCByYW5nZXMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIDMwMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKworICAgICAgICAjIFRlc3Qgc29tZSBsYXJnZXIgcmFuZ2VzIHRvbworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMzAwLCA1MDAwLCAxMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChEaXNUZXN0cykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IDAxZjdhY2QuLmU4Mzc5YzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTQxOSw3ICs0MTksNiBAQAogCiAgICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpCiAgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlQ2xhc3MpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMyAgU2FtcGxlQ2xhc3MKQEAgLTQzNSw3ICs0MzQsNiBAQAogTmV3LXN0eWxlIGNsYXNzZXMgYXJlIGFsc28gc3VwcG9ydGVkOgogCiAgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlTmV3U3R5bGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzCkBAIC00NzUsNyArNDczLDYgQEAKICAgICA+Pj4gIyBpZ25vcmluZyB0aGUgb2JqZWN0cyBzaW5jZSB0aGV5IHdlcmVuJ3QgZGVmaW5lZCBpbiBtLgogICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChtLCBtb2R1bGU9dGVzdC50ZXN0X2RvY3Rlc3QpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMSAgc29tZV9tb2R1bGUKQEAgLTQ5OSw3ICs0OTYsNiBAQAogCiAgICAgPj4+IGZyb20gdGVzdCBpbXBvcnQgZG9jdGVzdF9hbGlhc2VzCiAgICAgPj4+IHRlc3RzID0gZXhjbF9lbXB0eV9maW5kZXIuZmluZChkb2N0ZXN0X2FsaWFzZXMpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBwcmludCBsZW4odGVzdHMpCiAgICAgMgogICAgID4+PiBwcmludCB0ZXN0c1swXS5uYW1lCkBAIC01MTcsNyArNTEzLDYgQEAKIEJ5IGRlZmF1bHQsIGFuIG9iamVjdCB3aXRoIG5vIGRvY3Rlc3RzIGRvZXNuJ3QgY3JlYXRlIGFueSB0ZXN0czoKIAogICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoU2FtcGxlQ2xhc3MpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMyAgU2FtcGxlQ2xhc3MKQEAgLTUzNiw3ICs1MzEsNiBAQAogZGlzcGxheXMuCiAKICAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1GYWxzZSkuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpAQCAtNTU3LDcgKzU1MSw2IEBACiB1c2luZyB0aGUgYHJlY3Vyc2VgIGZsYWc6CiAKICAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIocmVjdXJzZT1GYWxzZSkuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQppbmRleCBhYWRkNTM3Li5jNTUwYTZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpAQCAtMSwxMSArMSwxNSBAQAogIyBDb3B5cmlnaHQgKEMpIDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcwogCi1pbXBvcnQgdW5pdHRlc3QKICMgVGhlIHNwZWNpZmljIHRlc3RzIG5vdyBsaXZlIGluIExpYi9lbWFpbC90ZXN0Ci1mcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbF9jb2RlY3MgaW1wb3J0IHN1aXRlCitmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzCitmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdWl0ZSA9IHRlc3RfZW1haWxfY29kZWNzLnN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQuc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3N1aXRlKHN1aXRlKQogCi0MCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CmluZGV4IGViZTYwYzEuLmJlMmNjYTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTMxNCw2ICszMTQsMTggQEAKICAgICAgICAgeCA9IERlcml2ZWRFeGNlcHRpb24oZmFuY3lfYXJnPTQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LmZhbmN5X2FyZywgNDIpCiAKKyAgICBkZWYgdGVzdEluZmluaXRlUmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGYpCisKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBnKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvblRlc3RzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5IGIvTGliL3Rlc3QvdGVzdF9mY250bC5weQppbmRleCBmNTNiMTNhLi41OGE1N2I1IDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKQEAgLTIwLDkgKzIwLDEwIEBACiBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYXRoZW9zJyk6CiAgICAgc3RhcnRfbGVuID0gInFxIgogCi1pZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywgJ25ldGJzZDInLCAnRGFyd2luMS4yJywgJ2RhcndpbicsCi0gICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsICdmcmVlYnNkNicsCi0gICAgICAgICAgICAgICAgICAgICdmcmVlYnNkNycsCitpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywgJ25ldGJzZDInLCAnbmV0YnNkMycsCisgICAgICAgICAgICAgICAgICAgICdEYXJ3aW4xLjInLCAnZGFyd2luJywKKyAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywKKyAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywKICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0JywKICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnLCAnb3BlbmJzZDInLCAnb3BlbmJzZDMnKToKICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSA9PSA4OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IGRjZmEyNjUuLjIzNDkyMGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTExLDE0ICsxMSwxMiBAQAogICAgICMgZmlsZSB0ZXN0cyBmb3Igd2hpY2ggYSB0ZXN0IGZpbGUgaXMgYXV0b21hdGljYWxseSBzZXQgdXAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5mID0gZmlsZShURVNURk4sICd3YicpCisgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCAnd2InKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBzZWxmLmY6Ci0gICAgICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHNlbGYuZjoKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIG9zLnJlbW92ZShURVNURk4pCiAKICAgICBkZWYgdGVzdFdlYWtSZWZzKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB3ZWFrIHJlZmVyZW5jZXMKQEAgLTgwLDkgKzc4LDExIEBACiAKICAgICBkZWYgdGVzdFdyaXRlbGluZXNOb25TdHJpbmcoc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBub24tc3RyaW5nIG9iamVjdAotICAgICAgICBjbGFzcyBOb25TdHJpbmc6IHBhc3MKKyAgICAgICAgY2xhc3MgTm9uU3RyaW5nOgorICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIFtOb25TdHJpbmcoKSwgTm9uU3RyaW5nKCldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9uU3RyaW5nKCksIE5vblN0cmluZygpXSkKIAogICAgIGRlZiB0ZXN0UmVwcihzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgcmVwciB3b3JrcwpAQCAtOTMsMTkgKzkzLDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYubmFtZSwgVEVTVEZOKQogICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuaXNhdHR5KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5jbG9zZWQpCi0gICAgICAgIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5yZWFkaW50bywgIiIpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydF8oZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdmbHVzaCcsICdpc2F0dHknLCAnbmV4dCcsICdyZWFkJywgJ3JlYWRpbnRvJywKLSAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsICd3cml0ZScsCi0gICAgICAgICAgICAgICAgICAgJ19faXRlcl9fJ10KKyAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsCisgICAgICAgICAgICAgICAgICAgJ3dyaXRlJywgJ19faXRlcl9fJ10KICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgogICAgICAgICAgICAgbWV0aG9kcy5yZW1vdmUoJ3RydW5jYXRlJykKIAotICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQorICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCiAKICAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gbWV0aG9kczoKICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQpAQCAtMTEzLDYgKzExNSwxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWV0aG9kKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgW10pCiAKKyAgICAgICAgIyBmaWxlIGlzIGNsb3NlZCwgX19leGl0X18gc2hvdWxkbid0IGRvIGFueXRoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKSwgTm9uZSkKKyAgICAgICAgIyBpdCBtdXN0IGFsc28gcmV0dXJuIE5vbmUgaWYgYW4gZXhjZXB0aW9uIHdhcyBnaXZlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5mLl9fZXhpdF9fKCpzeXMuZXhjX2luZm8oKSksIE5vbmUpCisKIAogY2xhc3MgT3RoZXJGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xMjAsNyArMTMwLDcgQEAKICAgICAgICAgIyBjaGVjayBpbnZhbGlkIG1vZGUgc3RyaW5ncwogICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiKToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBmID0gZmlsZShURVNURk4sIG1vZGUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxzZToKQEAgLTE0Miw2ICsxNTIsNyBAQAogICAgICAgICBmID0gb3Blbih1bmljb2RlKFRFU1RGTiksICJ3IikKICAgICAgICAgc2VsZi5hc3NlcnRfKHJlcHIoZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSB1JyIgKyBURVNURk4pKQogICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CkBAIC0xODIsMTEgKzE5MywxMSBAQAogICAgICAgICBkZWYgYnVnODAxNjMxKCk6CiAgICAgICAgICAgICAjIFNGIGJ1ZyA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzgwMTYzMT4KICAgICAgICAgICAgICMgImZpbGUudHJ1bmNhdGUgZmF1bHQgb24gd2luZG93cyIKLSAgICAgICAgICAgIGYgPSBmaWxlKFRFU1RGTiwgJ3diJykKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3diJykKICAgICAgICAgICAgIGYud3JpdGUoJzEyMzQ1Njc4OTAxJykgICAjIDExIGJ5dGVzCiAgICAgICAgICAgICBmLmNsb3NlKCkKIAotICAgICAgICAgICAgZiA9IGZpbGUoVEVTVEZOLCdyYisnKQorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCdyYisnKQogICAgICAgICAgICAgZGF0YSA9IGYucmVhZCg1KQogICAgICAgICAgICAgaWYgZGF0YSAhPSAnMTIzNDUnOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVhZCBvbiBmaWxlIG9wZW5lZCBmb3IgdXBkYXRlIGZhaWxlZCAlciIgJSBkYXRhKQpAQCAtMjA4LDE0ICsyMTksMTQgQEAKICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKICAgICBkZWYgdGVzdEl0ZXJhdGlvbihzZWxmKToKLSAgICAgICAgIyBUZXN0IHRoZSBjb21wbGV4IGludGVyYWN0aW9uIHdoZW4gbWl4aW5nIGZpbGUtaXRlcmF0aW9uIGFuZCB0aGUgdmFyaW91cwotICAgICAgICAjIHJlYWQqIG1ldGhvZHMuIE9zdGVuc2libHksIHRoZSBtaXh0dXJlIGNvdWxkIGp1c3QgYmUgdGVzdGVkIHRvIHdvcmsKLSAgICAgICAgIyB3aGVuIGl0IHNob3VsZCB3b3JrIGFjY29yZGluZyB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLCBpbnN0ZWFkIG9mIGZhaWwKLSAgICAgICAgIyB3aGVuIGl0IHNob3VsZCBmYWlsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBDUHl0aG9uIGltcGxlbWVudGF0aW9uLgotICAgICAgICAjIFBlb3BsZSBkb24ndCBhbHdheXMgcHJvZ3JhbSBQeXRob24gdGhlIHdheSB0aGV5IHNob3VsZCwgdGhvdWdoLCBhbmQgdGhlCi0gICAgICAgICMgaW1wbGVtZW5hdGlvbiBtaWdodCBjaGFuZ2UgaW4gc3VidGxlIHdheXMsIHNvIHdlIGV4cGxpY2l0bHkgdGVzdCBmb3IKLSAgICAgICAgIyBlcnJvcnMsIHRvbzsgdGhlIHRlc3Qgd2lsbCBqdXN0IGhhdmUgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZQotICAgICAgICAjIGltcGxlbWVudGF0aW9uIGNoYW5nZXMuCisgICAgICAgICMgVGVzdCB0aGUgY29tcGxleCBpbnRlcmFjdGlvbiB3aGVuIG1peGluZyBmaWxlLWl0ZXJhdGlvbiBhbmQgdGhlCisgICAgICAgICMgdmFyaW91cyByZWFkKiBtZXRob2RzLiBPc3RlbnNpYmx5LCB0aGUgbWl4dHVyZSBjb3VsZCBqdXN0IGJlIHRlc3RlZAorICAgICAgICAjIHRvIHdvcmsgd2hlbiBpdCBzaG91bGQgd29yayBhY2NvcmRpbmcgdG8gdGhlIFB5dGhvbiBsYW5ndWFnZSwKKyAgICAgICAgIyBpbnN0ZWFkIG9mIGZhaWwgd2hlbiBpdCBzaG91bGQgZmFpbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgQ1B5dGhvbgorICAgICAgICAjIGltcGxlbWVudGF0aW9uLiAgUGVvcGxlIGRvbid0IGFsd2F5cyBwcm9ncmFtIFB5dGhvbiB0aGUgd2F5IHRoZXkKKyAgICAgICAgIyBzaG91bGQsIHRob3VnaCwgYW5kIHRoZSBpbXBsZW1lbmF0aW9uIG1pZ2h0IGNoYW5nZSBpbiBzdWJ0bGUgd2F5cywKKyAgICAgICAgIyBzbyB3ZSBleHBsaWNpdGx5IHRlc3QgZm9yIGVycm9ycywgdG9vOyB0aGUgdGVzdCB3aWxsIGp1c3QgaGF2ZSB0bworICAgICAgICAjIGJlIHVwZGF0ZWQgd2hlbiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KICAgICAgICAgZGF0YW9mZnNldCA9IDE2Mzg0CiAgICAgICAgIGZpbGxlciA9ICJoYW1cbiIKICAgICAgICAgYXNzZXJ0IG5vdCBkYXRhb2Zmc2V0ICUgbGVuKGZpbGxlciksIFwKQEAgLTI1MywxMiArMjY0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZG5hbWUsIGFyZ3MpKQogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZCBpdGVyYXRpb24KLSAgICAgICAgICAgICMgc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgaXRlcmF0aW9uCi0gICAgICAgICAgICAjIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYSBmbGV4aWJsZSBtYW5uZXIuCi0gICAgICAgICAgICAjIEVhY2ggbGluZSBpbiB0aGUgYmFnIG8nIGhhbSBpcyA0IGJ5dGVzICgiaCIsICJhIiwgIm0iLCAiXG4iKSwgc28KLSAgICAgICAgICAgICMgNDA5NiBsaW5lcyBvZiB0aGF0IHNob3VsZCBnZXQgdXMgZXhhY3RseSBvbiB0aGUgYnVmZmVyIGJvdW5kYXJ5IGZvcgotICAgICAgICAgICAgIyBhbnkgcG93ZXItb2YtMiBidWZmZXJzaXplIGJldHdlZW4gNCBhbmQgMTYzODQgKGluY2x1c2l2ZSkuCisgICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZAorICAgICAgICAgICAgIyBpdGVyYXRpb24gc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwKKyAgICAgICAgICAgICMgaXRlcmF0aW9uIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYQorICAgICAgICAgICAgIyBmbGV4aWJsZSBtYW5uZXIuICBFYWNoIGxpbmUgaW4gdGhlIGJhZyBvJyBoYW0gaXMgNCBieXRlcworICAgICAgICAgICAgIyAoImgiLCAiYSIsICJtIiwgIlxuIiksIHNvIDQwOTYgbGluZXMgb2YgdGhhdCBzaG91bGQgZ2V0IHVzCisgICAgICAgICAgICAjIGV4YWN0bHkgb24gdGhlIGJ1ZmZlciBib3VuZGFyeSBmb3IgYW55IHBvd2VyLW9mLTIgYnVmZmVyc2l6ZQorICAgICAgICAgICAgIyBiZXR3ZWVuIDQgYW5kIDE2Mzg0IChpbmNsdXNpdmUpLgogICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAncmInKQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmNodW5rcyk6CiAgICAgICAgICAgICAgICAgZi5uZXh0KCkKQEAgLTMxOSw3ICszMzEsMTMgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KEF1dG9GaWxlVGVzdHMsIE90aGVyRmlsZVRlc3RzKQorICAgICMgSGlzdG9yaWNhbGx5LCB0aGVzZSB0ZXN0cyBoYXZlIGJlZW4gc2xvcHB5IGFib3V0IHJlbW92aW5nIFRFU1RGTi4KKyAgICAjIFNvIGdldCByaWQgb2YgaXQgbm8gbWF0dGVyIHdoYXQuCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoQXV0b0ZpbGVUZXN0cywgT3RoZXJGaWxlVGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weQppbmRleCBjNTQxMTljLi41MDM1NjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5CkBAIC0xLDUgKzEsNSBAQAogCi1pbXBvcnQgb3MsIGZpbGVjbXAsIHNodXRpbCwgdGVtcGZpbGUKK2ltcG9ydCBvcywgZmlsZWNtcCwgc2h1dGlsLCB0ZW1wZmlsZSwgc2h1dGlsCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgc2VsZi5jYXNlaW5zZW5zaXRpdmUgPSBvcy5wYXRoLm5vcm1jYXNlKCdBJykgPT0gb3MucGF0aC5ub3JtY2FzZSgnYScpCiAgICAgICAgIGRhdGEgPSAnQ29udGVudHMgb2YgZmlsZSBnbyBoZXJlLlxuJwogICAgICAgICBmb3IgZGlyIGluIFtzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgc2VsZi5kaXJfZGlmZl06CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpciwgVHJ1ZSkKICAgICAgICAgICAgIG9zLm1rZGlyKGRpcikKICAgICAgICAgICAgIGlmIHNlbGYuY2FzZWluc2Vuc2l0aXZlIGFuZCBkaXIgaXMgc2VsZi5kaXJfc2FtZToKICAgICAgICAgICAgICAgICBmbiA9ICdGaUxlJyAgICAgIyBWZXJpZnkgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQppbmRleCBjYmE1ZmM3Li5lNjRlMzk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKQEAgLTIsOCArMiw5IEBACiAiIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgdGltZQogZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIAogdHJ5OgogICAgIG9zLmZvcmsKQEAgLTEyLDEyICsxMywyMCBAQAogCiBjbGFzcyBGb3JrVGVzdChGb3JrV2FpdCk6CiAgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKLSAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXRwaWQoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChGb3JrVGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IGExODRhOGIuLmVlMzY0MTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTE0OTcsMjIgKzE0OTcsNTUgQEAKIDx0eXBlICdnZW5lcmF0b3InPgogCiAKK0EgeWllbGQgZXhwcmVzc2lvbiB3aXRoIGF1Z21lbnRlZCBhc3NpZ25tZW50LgorCis+Pj4gZGVmIGNvcm91dGluZShzZXEpOgorLi4uICAgICBjb3VudCA9IDAKKy4uLiAgICAgd2hpbGUgY291bnQgPCAyMDA6CisuLi4gICAgICAgICBjb3VudCArPSB5aWVsZAorLi4uICAgICAgICAgc2VxLmFwcGVuZChjb3VudCkKKz4+PiBzZXEgPSBbXQorPj4+IGMgPSBjb3JvdXRpbmUoc2VxKQorPj4+IGMubmV4dCgpCis+Pj4gcHJpbnQgc2VxCitbXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMF0KKz4+PiBjLnNlbmQoMTApCis+Pj4gcHJpbnQgc2VxCitbMTAsIDIwXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMCwgMjAsIDMwXQorCisKIENoZWNrIHNvbWUgc3ludGF4IGVycm9ycyBmb3IgeWllbGQgZXhwcmVzc2lvbnM6CiAKID4+PiBmPWxhbWJkYTogKHlpZWxkIDEpLCh5aWVsZCAyKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KLVN5bnRheEVycm9yOiAneWllbGQnIG91dHNpZGUgZnVuY3Rpb24gKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsxMF0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogJ3lpZWxkJyBvdXRzaWRlIGZ1bmN0aW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjFdPiwgbGluZSAxKQogCiA+Pj4gZGVmIGYoKTogcmV0dXJuIGxhbWJkYSB4PSh5aWVsZCk6IDEKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1TeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMTFdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6ICdyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzIyXT4sIGxpbmUgMSkKIAogPj4+IGRlZiBmKCk6IHggPSB5aWVsZCA9IHkKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1TeW50YXhFcnJvcjogYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzEyXT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjNdPiwgbGluZSAxKQorCis+Pj4gZGVmIGYoKTogKHlpZWxkIGJhcikgPSB5CitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byB5aWVsZCBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjRdPiwgbGluZSAxKQorCis+Pj4gZGVmIGYoKTogKHlpZWxkIGJhcikgKz0geQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1N5bnRheEVycm9yOiBhdWdtZW50ZWQgYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzI1XT4sIGxpbmUgMSkKIAogCiBOb3cgY2hlY2sgc29tZSB0aHJvdygpIGNvbmRpdGlvbnM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKaW5kZXggZTQxNDc1Ny4uMjU5OGE3OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgRmlsZSAiPHB5c2hlbGwjND4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgICAgICAgKGkgZm9yIGkgaW4gNikKLSAgICBUeXBlRXJyb3I6IGl0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZQorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQogCiBWZXJpZnkgbGF0ZSBiaW5kaW5nIGZvciB0aGUgb3V0ZXJtb3N0IGlmLWV4cHJlc3Npb24KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKaW5kZXggODg2NGU4ZS4uYzQyOGY0NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC0yMzMsOCArMjMzLDI1IEBACiAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVMTE9OR19NQVgsIGdldGFyZ3NfSyhWRVJZX0xBUkdFKSkKIAorCitjbGFzcyBUdXBsZV9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3R1cGxlCisKKyAgICAgICAgcmV0ID0gZ2V0YXJnc190dXBsZSgxLCAoMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJldCwgKDEsMiwzKSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBpbnZhbGlkIHR1cGxlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkKKyAgICAgICAgY2xhc3Mgc2VxOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc190dXBsZSwgMSwgc2VxKCkpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3RzID0gW1NpZ25lZF9UZXN0Q2FzZSwgVW5zaWduZWRfVGVzdENhc2VdCisgICAgdGVzdHMgPSBbU2lnbmVkX1Rlc3RDYXNlLCBVbnNpZ25lZF9UZXN0Q2FzZSwgVHVwbGVfVGVzdENhc2VdCiAgICAgdHJ5OgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MLCBnZXRhcmdzX0sKICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKaW5kZXggNGJiNGU0NS4uZjE2MDg2NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtNTMxLDYgKzUzMSwxMSBAQAogZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKIGlmIG4gIT0gMjg1OiByYWlzZSBUZXN0RmFpbGVkLCAnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScKIAorcmVzdWx0ID0gW10KK2ZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06CisgICAgcmVzdWx0LmFwcGVuZCh4KQordmVyZXEocmVzdWx0LCBbMSwgMiwgM10pCisKIHByaW50ICd0cnlfc3RtdCcKICMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQogIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IGQ5ZmQ5M2QuLjk5MTQwZDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTEsNiArMSw4IEBACiBpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBkYXRldGltZQogCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAogCkBAIC0xNSw3ICsxNyw3IEBACiAjIGlzZGF0YWRlc2NyaXB0b3IKIAogbW9kZmlsZSA9IG1vZC5fX2ZpbGVfXwotaWYgbW9kZmlsZS5lbmRzd2l0aCgnYycpIG9yIG1vZGZpbGUuZW5kc3dpdGgoJ28nKToKK2lmIG1vZGZpbGUuZW5kc3dpdGgoKCdjJywgJ28nKSk6CiAgICAgbW9kZmlsZSA9IG1vZGZpbGVbOi0xXQogCiBpbXBvcnQgX19idWlsdGluX18KQEAgLTQwLDEwICs0MiwxMiBAQAogICAgICAgICAgICAgc2VsZi5mYWlsSWYob3RoZXIob2JqKSwgJ25vdCAlcyglcyknICUgKG90aGVyLl9fbmFtZV9fLCBleHApKQogCiBjbGFzcyBUZXN0UHJlZGljYXRlcyhJc1Rlc3RCYXNlKToKLSAgICBkZWYgdGVzdF9lbGV2ZW4oc2VsZik6Ci0gICAgICAgICMgRG9jL2xpYi9saWJpbnNwZWN0LnRleCBjbGFpbXMgdGhlcmUgYXJlIDExIHN1Y2ggZnVuY3Rpb25zCisgICAgZGVmIHRlc3RfdGhpcnRlZW4oc2VsZik6CiAgICAgICAgIGNvdW50ID0gbGVuKGZpbHRlcihsYW1iZGEgeDp4LnN0YXJ0c3dpdGgoJ2lzJyksIGRpcihpbnNwZWN0KSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIDExLCAiVGhlcmUgYXJlICVkIChub3QgMTEpIGlzKiBmdW5jdGlvbnMiICUgY291bnQpCisgICAgICAgICMgRG9jL2xpYi9saWJpbnNwZWN0LnRleCBjbGFpbXMgdGhlcmUgYXJlIDEzIHN1Y2ggZnVuY3Rpb25zCisgICAgICAgIGV4cGVjdGVkID0gMTMKKyAgICAgICAgZXJyX21zZyA9ICJUaGVyZSBhcmUgJWQgKG5vdCAlZCkgaXMqIGZ1bmN0aW9ucyIgJSAoY291bnQsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBleHBlY3RlZCwgZXJyX21zZykKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGluZ19wcmVkaWNhdGVzKHNlbGYpOgogICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzYnVpbHRpbiwgJ3N5cy5leGl0JykKQEAgLTU4LDYgKzYyLDE1IEBACiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXN0cmFjZWJhY2ssICd0YicpCiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNkYXRhZGVzY3JpcHRvciwgJ19fYnVpbHRpbl9fLmZpbGUuY2xvc2VkJykKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yLCAnX19idWlsdGluX18uZmlsZS5zb2Z0c3BhY2UnKQorICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKHR5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzKSkKKyAgICAgICAgaWYgaGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyk6CisgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvciwgJ2RhdGV0aW1lLnRpbWVkZWx0YS5kYXlzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzKSkKIAogICAgIGRlZiB0ZXN0X2lzcm91dGluZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRfKGluc3BlY3QuaXNyb3V0aW5lKG1vZC5zcGFtKSkKQEAgLTE4MCw2ICsxOTMsMTcgQEAKICAgICBkZWYgdGVzdF9nZXRmaWxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0ZmlsZShtb2QuU3R1cGlkR2l0KSwgbW9kLl9fZmlsZV9fKQogCisgICAgZGVmIHRlc3RfZ2V0bW9kdWxlX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgZnJvbSBuZXcgaW1wb3J0IG1vZHVsZQorICAgICAgICBuYW1lID0gJ19faW5zcGVjdF9kdW1teScKKyAgICAgICAgbSA9IHN5cy5tb2R1bGVzW25hbWVdID0gbW9kdWxlKG5hbWUpCisgICAgICAgIG0uX19maWxlX18gPSAiPHN0cmluZz4iICMgaG9wZWZ1bGx5IG5vdCBhIHJlYWwgZmlsZW5hbWUuLi4KKyAgICAgICAgbS5fX2xvYWRlcl9fID0gImR1bW15IiAgIyBwcmV0ZW5kIHRoZSBmaWxlbmFtZSBpcyB1bmRlcnN0b29kIGJ5IGEgbG9hZGVyCisgICAgICAgIGV4ZWMgImRlZiB4KCk6IHBhc3MiIGluIG0uX19kaWN0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUobS54LmZ1bmNfY29kZSksICc8c3RyaW5nPicpCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBpbnNwZWN0LmdldG1vZHVsZShjb21waWxlKCdhPTEwJywnJywnc2luZ2xlJykpCisKIGNsYXNzIFRlc3REZWNvcmF0b3JzKEdldFNvdXJjZUJhc2UpOgogICAgIGZvZGRlckZpbGUgPSBtb2QyCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQppbmRleCBiY2QwYTZmLi5hZjQ0NjdlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CkBAIC0yMzUsOSArMjM1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQogCiAKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQorZGVmIHRlc3RfbWFpbigpOgogICAgIHVuaXR0ZXN0cyA9IFsKICAgICAgICAgVGVzdFJlcGVhdCwKICAgICAgICAgVGVzdFhyYW5nZSwKQEAgLTI1NSwzICsyNTMsNiBAQAogICAgICAgICBUZXN0U2VxSXRlclJldmVyc2VkLAogICAgIF0KICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp1bml0dGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCA3M2Y4Mjg4Li42OGMyM2MyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC00ODAsNiArNDgwLDggQEAKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZm4pCisgICAgICAgICAgICAgICAgI2NhbGwgYWdhaW4gdG8gbWFrZSBzdXJlIGNsZWFudXAgaXMgY29ycmVjdAorICAgICAgICAgICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZm4pCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgdCA9IHN5cy5leGNfaW5mbygpWzBdCiAgICAgICAgICAgICAgICAgbWVzc2FnZShzdHIodCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKaW5kZXggOTE0YTIwYy4uNDVkZDExOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIFRlc3RNYWlsYm94LnNldFVwKHNlbGYpCi0gICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpOgogICAgICAgICAgICAgc2VsZi5fYm94LmNvbG9uID0gJyEnCiAKICAgICBkZWYgdGVzdF9hZGRfTU0oc2VsZik6CkBAIC01MjAsNyArNTIwLDcgQEAKICAgICAgICAgIyBJbml0aWFsaXplIGFuIGV4aXN0aW5nIG1haWxib3gKICAgICAgICAgc2VsZi50ZWFyRG93bigpCiAgICAgICAgIGZvciBzdWJkaXIgaW4gJycsICd0bXAnLCAnbmV3JywgJ2N1cic6Ci0gICAgICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKSkKKyAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpcikpKQogICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lk1haWxkaXIoc2VsZi5fcGF0aCkKICAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCiAgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PU5vbmUpCkBAIC03MjAsNiArNzIwLDMwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb250ZW50cyA9PSBvcGVuKHNlbGYuX3BhdGgsICdyYicpLnJlYWQoKSkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQogCisgICAgZGVmIHRlc3RfbG9ja19jb25mbGljdChzZWxmKToKKyAgICAgICAgIyBGb3JrIG9mZiBhIHN1YnByb2Nlc3MgdGhhdCB3aWxsIGxvY2sgdGhlIGZpbGUgZm9yIDIgc2Vjb25kcywKKyAgICAgICAgIyB1bmxvY2sgaXQsIGFuZCB0aGVuIGV4aXQuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAnZm9yaycpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICMgSW4gdGhlIGNoaWxkLCBsb2NrIHRoZSBtYWlsYm94LgorICAgICAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICAgICAgdGltZS5zbGVlcCgyKQorICAgICAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgICMgSW4gdGhlIHBhcmVudCwgc2xlZXAgYSBiaXQgdG8gZ2l2ZSB0aGUgY2hpbGQgdGltZSB0byBhY3F1aXJlCisgICAgICAgICMgdGhlIGxvY2suCisgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtYWlsYm94LkV4dGVybmFsQ2xhc2hFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm94LmxvY2spCisKKyAgICAgICAgIyBXYWl0IGZvciBjaGlsZCB0byBleGl0LiAgTG9ja2luZyBzaG91bGQgbm93IHN1Y2NlZWQuCisgICAgICAgIGV4aXRlZF9waWQsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCiAKIGNsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYpOgogCkBAIC0xNzYxLDYgKzE3ODUsNyBAQAogICAgICAgICAgICAgIFRlc3RNZXNzYWdlQ29udmVyc2lvbiwgVGVzdFByb3h5RmlsZSwgVGVzdFBhcnRpYWxGaWxlLAogICAgICAgICAgICAgIE1haWxkaXJUZXN0Q2FzZSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKaW5kZXggOTZiYmIzNi4uYjBiNWIwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKQEAgLTEsNyArMSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWltcG9ydCBzdHJpbmcsIFN0cmluZ0lPLCBtaW1ldG9vbHMsIHNldHMKK2ltcG9ydCBzdHJpbmcsIFN0cmluZ0lPLCBtaW1ldG9vbHMKIAogbXNndGV4dDEgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTy5TdHJpbmdJTygKICIiIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xOyBmb3JtYXQ9Zmxvd2VkCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uZ2V0dmFsdWUoKSwgc3RhcnQpCiAKICAgICBkZWYgdGVzdF9ib3VuZGFyeShzZWxmKToKLSAgICAgICAgcyA9IHNldHMuU2V0KFsiIl0pCisgICAgICAgIHMgPSBzZXQoWyIiXSkKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBuYiA9IG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5iIG5vdCBpbiBzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCA4YzU4NGFkLi4wMTkwYzJmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBtaW1ldHlwZXMKIGltcG9ydCBTdHJpbmdJTwogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHNldHMgaW1wb3J0IFNldAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCkBAIC01Miw4ICs1MSw4IEBACiAgICAgICAgICMgRmlyc3QgdHJ5IHN0cmljdC4gIFVzZSBhIHNldCBoZXJlIGZvciB0ZXN0aW5nIHRoZSByZXN1bHRzIGJlY2F1c2UgaWYKICAgICAgICAgIyB0ZXN0X3VybGxpYjIgaXMgcnVuIGJlZm9yZSB0ZXN0X21pbWV0eXBlcywgZ2xvYmFsIHN0YXRlIGlzIG1vZGlmaWVkCiAgICAgICAgICMgc3VjaCB0aGF0IHRoZSAnYWxsJyBzZXQgd2lsbCBoYXZlIG1vcmUgaXRlbXMgaW4gaXQuCi0gICAgICAgIGFsbCA9IFNldChzZWxmLmRiLmd1ZXNzX2FsbF9leHRlbnNpb25zKCd0ZXh0L3BsYWluJywgc3RyaWN0PVRydWUpKQotICAgICAgICB1bmxlc3MoYWxsID49IFNldChbJy5iYXQnLCAnLmMnLCAnLmgnLCAnLmtzaCcsICcucGwnLCAnLnR4dCddKSkKKyAgICAgICAgYWxsID0gc2V0KHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ3RleHQvcGxhaW4nLCBzdHJpY3Q9VHJ1ZSkpCisgICAgICAgIHVubGVzcyhhbGwgPj0gc2V0KFsnLmJhdCcsICcuYycsICcuaCcsICcua3NoJywgJy5wbCcsICcudHh0J10pKQogICAgICAgICAjIEFuZCBub3cgbm9uLXN0cmljdAogICAgICAgICBhbGwgPSBzZWxmLmRiLmd1ZXNzX2FsbF9leHRlbnNpb25zKCdpbWFnZS9qcGcnLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgIGFsbC5zb3J0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weSBiL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQppbmRleCBiOTM3N2FlLi5hNmQzMDlmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CkBAIC0xLDQgKzEsNCBAQAotIyB0ZXN0IGZvciB4bWxjb3JlLmRvbS5taW5pZG9tCisjIHRlc3QgZm9yIHhtbC5kb20ubWluaWRvbQogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKQEAgLTcsMTIgKzcsMTIgQEAKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCiAKLWltcG9ydCB4bWxjb3JlLmRvbQotaW1wb3J0IHhtbGNvcmUuZG9tLm1pbmlkb20KLWltcG9ydCB4bWxjb3JlLnBhcnNlcnMuZXhwYXQKK2ltcG9ydCB4bWwuZG9tCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tCitpbXBvcnQgeG1sLnBhcnNlcnMuZXhwYXQKIAotZnJvbSB4bWxjb3JlLmRvbS5taW5pZG9tIGltcG9ydCBwYXJzZSwgTm9kZSwgRG9jdW1lbnQsIHBhcnNlU3RyaW5nCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgcGFyc2UsIE5vZGUsIERvY3VtZW50LCBwYXJzZVN0cmluZworZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKQEAgLTEzOCwyOSArMTM4LDI5IEBACiAgICAgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgndGV4dCcpCiAKICAgICB0cnk6IGRvbS5hcHBlbmRDaGlsZCh0ZXh0KQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJkb20uYXBwZW5kQ2hpbGQgZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKICAgICBkb20uYXBwZW5kQ2hpbGQoZWxlbSkKICAgICB0cnk6IGRvbS5pbnNlcnRCZWZvcmUodGV4dCwgZWxlbSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZG9tLmFwcGVuZENoaWxkIGRpZG4ndCByYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXJyIgogCiAgICAgdHJ5OiBkb20ucmVwbGFjZUNoaWxkKHRleHQsIGVsZW0pCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImRvbS5hcHBlbmRDaGlsZCBkaWRuJ3QgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEVyciIKIAogICAgIG5vZGVtYXAgPSBlbGVtLmF0dHJpYnV0ZXMKICAgICB0cnk6IG5vZGVtYXAuc2V0TmFtZWRJdGVtKHRleHQpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgIk5hbWVkTm9kZU1hcC5zZXROYW1lZEl0ZW0gZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKICAgICB0cnk6IG5vZGVtYXAuc2V0TmFtZWRJdGVtTlModGV4dCkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiTmFtZWROb2RlTWFwLnNldE5hbWVkSXRlbU5TIGRpZG4ndCByYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXJyIgogCkBAIC00MzksNyArNDM5LDcgQEAKICAgICAgICAgICAgIGFuZCBwaS5maXJzdENoaWxkIGlzIE5vbmUKICAgICAgICAgICAgIGFuZCBwaS5sYXN0Q2hpbGQgaXMgTm9uZQogICAgICAgICAgICAgYW5kIHBpLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgcGkubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSkKKyAgICAgICAgICAgIGFuZCBwaS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCiAKIGRlZiB0ZXN0UHJvY2Vzc2luZ0luc3RydWN0aW9uUmVwcigpOiBwYXNzCiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgiZXh0cmEiKQogICAgIHRyeToKICAgICAgICAgZG9jLmFwcGVuZENoaWxkKGVsZW0pCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY2F0Y2ggZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4iIFwKQEAgLTQ5MSw3ICs0OTEsNyBAQAogICAgIGNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCiAgICAgdHJ5OgogICAgICAgICBhdHRycy5yZW1vdmVOYW1lZEl0ZW0oImEiKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RGb3VuZEVycjoKICAgICAgICAgcGFzcwogCiBkZWYgdGVzdFJlbW92ZU5hbWVkSXRlbU5TKCk6CkBAIC01MDMsNyArNTAzLDcgQEAKICAgICBjb25maXJtKGExLmlzU2FtZU5vZGUoYTIpKQogICAgIHRyeToKICAgICAgICAgYXR0cnMucmVtb3ZlTmFtZWRJdGVtTlMoImh0dHA6Ly94bWwucHl0aG9uLm9yZy8iLCAiYiIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdEZvdW5kRXJyOgogICAgICAgICBwYXNzCiAKIGRlZiB0ZXN0QXR0ckxpc3RWYWx1ZXMoKTogcGFzcwpAQCAtNjgyLDcgKzY4Miw3IEBACiAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgIHRyeToKICAgICAgICAgZG9jMS5pbXBvcnROb2RlKGRvYzIsIGRlZXApCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICByYWlzZSBFeGNlcHRpb24odGVzdE5hbWUgKwpAQCAtNzA1LDE0ICs3MDUsMTIgQEAKICAgICBkb2N0eXBlID0gZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudFR5cGUoImRvYyIsIE5vbmUsIE5vbmUpCiAgICAgZG9jdHlwZS5lbnRpdGllcy5fc2VxID0gW10KICAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxID0gW10KLSAgICBub3RhdGlvbiA9IHhtbGNvcmUuZG9tLm1pbmlkb20uTm90YXRpb24oCi0gICAgICAgICJteS1ub3RhdGlvbiIsIE5vbmUsCi0gICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL215IikKKyAgICBub3RhdGlvbiA9IHhtbC5kb20ubWluaWRvbS5Ob3RhdGlvbigibXktbm90YXRpb24iLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL215IikKICAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub3RhdGlvbikKLSAgICBlbnRpdHkgPSB4bWxjb3JlLmRvbS5taW5pZG9tLkVudGl0eSgKLSAgICAgICAgIm15LWVudGl0eSIsIE5vbmUsCi0gICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvZW50aXRpZXMvbXkiLAotICAgICAgICAibXktbm90YXRpb24iKQorICAgIGVudGl0eSA9IHhtbC5kb20ubWluaWRvbS5FbnRpdHkoIm15LWVudGl0eSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL215IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteS1ub3RhdGlvbiIpCiAgICAgZW50aXR5LnZlcnNpb24gPSAiMS4wIgogICAgIGVudGl0eS5lbmNvZGluZyA9ICJ1dGYtOCIKICAgICBlbnRpdHkuYWN0dWFsRW5jb2RpbmcgPSAidXMtYXNjaWkiCkBAIC03MzEsNyArNzI5LDcgQEAKICAgICB0YXJnZXQgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZSgpCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnRlZCA9IHRhcmdldC5pbXBvcnROb2RlKHNyYy5kb2N0eXBlLCAwKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uTm90U3VwcG9ydGVkRXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKApAQCAtNzQyLDcgKzc0MCw3IEBACiAgICAgdGFyZ2V0ID0gY3JlYXRlX2RvY193aXRob3V0X2RvY3R5cGUoKQogICAgIHRyeToKICAgICAgICAgaW1wb3J0ZWQgPSB0YXJnZXQuaW1wb3J0Tm9kZShzcmMuZG9jdHlwZSwgMSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKQEAgLTg1MCw3ICs4NDgsNyBAQAogICAgIGRvYy51bmxpbmsoKQogCiBkZWYgdGVzdFNBWDJET00oKToKLSAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBwdWxsZG9tCisgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCiAKICAgICBzYXgyZG9tID0gcHVsbGRvbS5TQVgyRE9NKCkKICAgICBzYXgyZG9tLnN0YXJ0RG9jdW1lbnQoKQpAQCAtOTQwLDExICs5MzgsMTEgQEAKICAgICBhdHRyID0gZWxlbS5hdHRyaWJ1dGVzWydhJ10KIAogICAgICMgU2ltcGxlIHJlbmFtaW5nCi0gICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQorICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQogICAgIGNvbmZpcm0oYXR0ci5uYW1lID09ICJiIgogICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImIiCiAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgaXMgTm9uZQotICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCiAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgYW5kIGF0dHIudmFsdWUgPT0gInYiCiAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQpAQCAtOTg5LDExICs5ODcsMTEgQEAKICAgICAgICAgICAgIGFuZCBhdHRybWFwWygiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJkIildLmlzU2FtZU5vZGUoYXR0cikpCiAKICAgICAjIFJlbmFtZSBiYWNrIHRvIGEgc2ltcGxlIG5vbi1OUyBub2RlCi0gICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiKQorICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiKQogICAgIGNvbmZpcm0oYXR0ci5uYW1lID09ICJlIgogICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImUiCiAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgaXMgTm9uZQotICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCiAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgYW5kIGF0dHIudmFsdWUgPT0gInYiCiAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQpAQCAtMTAwNyw3ICsxMDA1LDcgQEAKIAogICAgIHRyeToKICAgICAgICAgZG9jLnJlbmFtZU5vZGUoYXR0ciwgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJ4bWxucyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5OYW1lc3BhY2VFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZXhwZWN0ZWQgTmFtZXNwYWNlRXJyIgpAQCAtMTAyMCwxMSArMTAxOCwxMSBAQAogICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CiAKICAgICAjIFNpbXBsZSByZW5hbWluZwotICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhIikKKyAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhIikKICAgICBjb25maXJtKGVsZW0udGFnTmFtZSA9PSAiYSIKICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJhIgogICAgICAgICAgICAgYW5kIGVsZW0ubG9jYWxOYW1lIGlzIE5vbmUKLSAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRQogICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4IGlzIE5vbmUKICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQogCkBAIC0xMDQ3LDExICsxMDQ1LDExIEBACiAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKIAogICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKLSAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZCIpCisgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZCIpCiAgICAgY29uZmlybShlbGVtLnRhZ05hbWUgPT0gImQiCiAgICAgICAgICAgICBhbmQgZWxlbS5ub2RlTmFtZSA9PSAiZCIKICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCBpcyBOb25lCiAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKIApAQCAtMTA2MiwxNSArMTA2MCwxNSBAQAogICAgICMgTWFrZSBzdXJlIGlsbGVnYWwgTlMgdXNhZ2UgaXMgZGV0ZWN0ZWQ6CiAgICAgdHJ5OgogICAgICAgICBkb2MucmVuYW1lTm9kZShub2RlLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgInhtbG5zOmZvbyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5OYW1lc3BhY2VFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZXhwZWN0ZWQgTmFtZXNwYWNlRXJyIgogCiAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgIHRyeToKLSAgICAgICAgZG9jMi5yZW5hbWVOb2RlKG5vZGUsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLldyb25nRG9jdW1lbnRFcnI6CisgICAgICAgIGRvYzIucmVuYW1lTm9kZShub2RlLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCisgICAgZXhjZXB0IHhtbC5kb20uV3JvbmdEb2N1bWVudEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJleHBlY3RlZCBXcm9uZ0RvY3VtZW50RXJyIgpAQCAtMTA3OCwxMiArMTA3NiwxMiBAQAogZGVmIHRlc3RSZW5hbWVPdGhlcigpOgogICAgICMgV2UgaGF2ZSB0byBjcmVhdGUgYSBjb21tZW50IG5vZGUgZXhwbGljaXRseSBzaW5jZSBub3QgYWxsIERPTQogICAgICMgYnVpbGRlcnMgdXNlZCB3aXRoIG1pbmlkb20gYWRkIGNvbW1lbnRzIHRvIHRoZSBET00uCi0gICAgZG9jID0geG1sY29yZS5kb20ubWluaWRvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KAotICAgICAgICB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJlIiwgTm9uZSkKKyAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgKKyAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJlIiwgTm9uZSkKICAgICBub2RlID0gZG9jLmNyZWF0ZUNvbW1lbnQoImNvbW1lbnQiKQogICAgIHRyeToKLSAgICAgICAgZG9jLnJlbmFtZU5vZGUobm9kZSwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyOgorICAgICAgICBkb2MucmVuYW1lTm9kZShub2RlLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCisgICAgZXhjZXB0IHhtbC5kb20uTm90U3VwcG9ydGVkRXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImV4cGVjdGVkIE5vdFN1cHBvcnRlZEVyciB3aGVuIHJlbmFtaW5nIGNvbW1lbnQgbm9kZSIKQEAgLTExOTQsMTMgKzExOTIsMTMgQEAKICAgICAjIHNpbmNlIGVhY2ggc3VwcG9ydHMgYSBkaWZmZXJlbnQgbGV2ZWwgb2YgRFREIGluZm9ybWF0aW9uLgogICAgIHQgPSBlbGVtLnNjaGVtYVR5cGUKICAgICBjb25maXJtKHQubmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFKQorICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQogICAgIG5hbWVzID0gImlkIG5vdGlkIHRleHQgZW51bSByZWYgcmVmcyBlbnQgZW50cyBubSBubXMiLnNwbGl0KCkKICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgYSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKQogICAgICAgICB0ID0gYS5zY2hlbWFUeXBlCiAgICAgICAgIGNvbmZpcm0oaGFzYXR0cih0LCAibmFtZSIpCi0gICAgICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSkKKyAgICAgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCiAKIGRlZiB0ZXN0U2V0SWRBdHRyaWJ1dGUoKToKICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhMT0ndicgYTI9J3cnLz4iKQpAQCAtMTIyOSw3ICsxMjI3LDcgQEAKICAgICAgICAgICAgIGFuZCBhMi5pc0lkCiAgICAgICAgICAgICBhbmQgbm90IGEzLmlzSWQpCiAgICAgIyByZW5hbWluZyBhbiBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhZmZlY3QgaXRzIElELW5lc3M6Ci0gICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKKyAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCiAgICAgY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCiAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKIApAQCAtMTI2NSw3ICsxMjYzLDcgQEAKICAgICBjb25maXJtKG5vdCBhMy5pc0lkKQogICAgIGNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZSkKICAgICAjIHJlbmFtaW5nIGFuIGF0dHJpYnV0ZSBzaG91bGQgbm90IGFmZmVjdCBpdHMgSUQtbmVzczoKLSAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQorICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKICAgICBjb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKICAgICAgICAgICAgIGFuZCBhMi5pc0lkKQogCkBAIC0xMzAxLDcgKzEyOTksNyBAQAogICAgIGNvbmZpcm0obm90IGEzLmlzSWQpCiAgICAgY29uZmlybShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSBpcyBOb25lKQogICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgotICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQogICAgIGNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQogICAgICAgICAgICAgYW5kIGEyLmlzSWQpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CmluZGV4IDI3NmI5YWYuLjM5N2ViZWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpAQCAtNiwxNyArNiwzNyBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcywgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4KK2ltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcywgc3lzLCBvcworCitBTExfQ0pLRU5DT0RJTkdTID0gWworIyBfY29kZWNzX2NuCisgICAgJ2diMjMxMicsICdnYmsnLCAnZ2IxODAzMCcsICdoeicsCisjIF9jb2RlY3NfaGsKKyAgICAnYmlnNWhrc2NzJywKKyMgX2NvZGVjc19qcAorICAgICdjcDkzMicsICdzaGlmdF9qaXMnLCAnZXVjX2pwJywgJ2V1Y19qaXN4MDIxMycsICdzaGlmdF9qaXN4MDIxMycsCisgICAgJ2V1Y19qaXNfMjAwNCcsICdzaGlmdF9qaXNfMjAwNCcsCisjIF9jb2RlY3Nfa3IKKyAgICAnY3A5NDknLCAnZXVjX2tyJywgJ2pvaGFiJywKKyMgX2NvZGVjc190dworICAgICdiaWc1JywgJ2NwOTUwJywKKyMgX2NvZGVjc19pc28yMDIyCisgICAgJ2lzbzIwMjJfanAnLCAnaXNvMjAyMl9qcF8xJywgJ2lzbzIwMjJfanBfMicsICdpc28yMDIyX2pwXzIwMDQnLAorICAgICdpc28yMDIyX2pwXzMnLCAnaXNvMjAyMl9qcF9leHQnLCAnaXNvMjAyMl9rcicsCitdCiAKIGNsYXNzIFRlc3RfTXVsdGlieXRlQ29kZWModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfbnVsbGNvZGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5kZWNvZGUoJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsICdnYjE4MDMwJyksIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKCdnYjE4MDMwJyksICcnKQorICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZShlbmMpLCB1JycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsIGVuYyksIHUnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmVuY29kZShlbmMpLCAnJykKIAogICAgIGRlZiB0ZXN0X3N0cl9kZWNvZGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZSgnZ2IxODAzMCcpLCAnYWJjZCcpCisgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZShlbmMpLCAnYWJjZCcpCiAKICAgICBkZWYgdGVzdF9lcnJvcmNhbGxiYWNrX2xvbmdpbmRleChzZWxmKToKICAgICAgICAgZGVjID0gY29kZWNzLmdldGRlY29kZXIoJ2V1Yy1rcicpCkBAIC0yNSw2ICs0NSwxNCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsZVx4OTJoYW1ceDkzc3BhbScsICd0ZXN0LmNqa3Rlc3QnKQogCisgICAgZGVmIHRlc3RfY29kaW5nc3BlYyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGVuYyBpbiBBTExfQ0pLRU5DT0RJTkdTOgorICAgICAgICAgICAgICAgIHByaW50ID4+IG9wZW4oVEVTVEZOLCAndycpLCAnIyBjb2Rpbmc6JywgZW5jCisgICAgICAgICAgICAgICAgZXhlYyBvcGVuKFRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKIGNsYXNzIFRlc3RfSW5jcmVtZW50YWxFbmNvZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3N0YXRlbGVzcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IDc5ZGY5MDYuLjQ1ODJmYTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIApAQCAtMTY0LDE1ICsxNjQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2Vycm9yPU5vbmUpOgogICAgICAgICAiIiJBc3NlcnQgdGhlIHBhcnNlciBwcmludHMgdGhlIGV4cGVjdGVkIG91dHB1dCBvbiBzdGRvdXQuIiIiCiAgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBlbmNvZGluZyA9IGdldGF0dHIoc2F2ZV9zdGRvdXQsICdlbmNvZGluZycsIE5vbmUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGNtZGxpbmVfYXJncykKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCiAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICAgICAgICAgZXhjZXB0IEludGVyY2VwdGVkRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICB0eXBlKG91dHB1dCkgaXMgdHlwZXMuU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgb3V0cHV0IHRvIGJlIGFuIG9yZGluYXJ5IHN0cmluZywgbm90ICVyIgorICAgICAgICAgICAgICAgICUgdHlwZShvdXRwdXQpKQorCiAgICAgICAgICAgICBpZiBvdXRwdXQgIT0gZXhwZWN0ZWRfb3V0cHV0OgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQ6IFxuJycnXG4iICsgZXhwZWN0ZWRfb3V0cHV0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIicnJ1xuYnV0IGdvdCBcbicnJ1xuIiArIG91dHB1dCArICInJyciKQpAQCAtMTQ1MiwxMCArMTQ2MCwyNiBAQAogICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tZm9vIiwgYWN0aW9uPSJhcHBlbmQiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSdmb28nLAogICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ic3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIgZm9vaW5nIiksCiAgICAgICAgICAgICBdCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIHNldCBDT0xVTU5TIGZvciB0aGUgT3B0aW9uUGFyc2VyIGNvbnN0cnVjdG9yLCBidXQKKyAgICAgICAgIyB3ZSBtdXN0IHJlc3RvcmUgaXRzIG9yaWdpbmFsIHZhbHVlIC0tIG90aGVyd2lzZSwgdGhpcyB0ZXN0CisgICAgICAgICMgc2NyZXdzIHRoaW5ncyB1cCBmb3Igb3RoZXIgdGVzdHMgd2hlbiBpdCdzIHBhcnQgb2YgdGhlIFB5dGhvbgorICAgICAgICAjIHRlc3Qgc3VpdGUuCisgICAgICAgIG9yaWdfY29sdW1ucyA9IG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJykKICAgICAgICAgb3MuZW52aXJvblsnQ09MVU1OUyddID0gc3RyKGNvbHVtbnMpCi0gICAgICAgIHJldHVybiBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIEludGVyY2VwdGluZ09wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgb3JpZ19jb2x1bW5zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ0NPTFVNTlMnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydDT0xVTU5TJ10gPSBvcmlnX2NvbHVtbnMKIAogICAgIGRlZiBhc3NlcnRIZWxwRXF1YWxzKHNlbGYsIGV4cGVjdGVkX291dHB1dCk6CisgICAgICAgIGlmIHR5cGUoZXhwZWN0ZWRfb3V0cHV0KSBpcyB0eXBlcy5Vbmljb2RlVHlwZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5wYXJzZXIuX2dldF9lbmNvZGluZyhzeXMuc3Rkb3V0KQorICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gZXhwZWN0ZWRfb3V0cHV0LmVuY29kZShlbmNvZGluZywgInJlcGxhY2UiKQorCiAgICAgICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2WzpdCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgTWFrZSBvcHRwYXJzZSBiZWxpZXZlIGJhci5weSBpcyBiZWluZyBleGVjdXRlZC4KQEAgLTE0ODYsNiArMTUxMCwyNyBAQAogICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYubWFrZV9wYXJzZXIoNjApCiAgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhfZXhwZWN0ZWRfaGVscF9zaG9ydF9saW5lcykKIAorICAgIGRlZiB0ZXN0X2hlbHBfdW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD11Im9sXHUwMEU5ISIpCisgICAgICAgIGV4cGVjdCA9IHUiIiJcCitPcHRpb25zOgorICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgIC1hICAgICAgICAgIG9sXHUwMEU5IQorIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCisKKyAgICBkZWYgdGVzdF9oZWxwX3VuaWNvZGVfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj11Im9sXHUwMEU5ISIpCisgICAgICAgIGV4cGVjdCA9IHUiIiJcCitvbFx1MDBFOSEKKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCisKICAgICBkZWYgdGVzdF9oZWxwX2Rlc2NyaXB0aW9uX2dyb3VwcyhzZWxmKToKICAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2Rlc2NyaXB0aW9uKAogICAgICAgICAgICAgIlRoaXMgaXMgdGhlIHByb2dyYW0gZGVzY3JpcHRpb24gZm9yICVwcm9nLiAgJXByb2cgaGFzICIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IGZmYzk0MjAuLjk0OTc3NzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMTEsNiArMTEsMTkgQEAKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGVtcG5hbSIsIFJ1bnRpbWVXYXJuaW5nLCBfX25hbWVfXykKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidG1wbmFtIiwgUnVudGltZVdhcm5pbmcsIF9fbmFtZV9fKQogCisjIFRlc3RzIGNyZWF0aW5nIFRFU1RGTgorY2xhc3MgRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgdGVhckRvd24gPSBzZXRVcAorCisgICAgZGVmIHRlc3RfYWNjZXNzKHNlbGYpOgorICAgICAgICBmID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5PX0NSRUFUfG9zLk9fUkRXUikKKyAgICAgICAgb3MuY2xvc2UoZikKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5XX09LKSkKKworCiBjbGFzcyBUZW1wb3JhcnlGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5maWxlcyA9IFtdCkBAIC0zOTMsNiArNDA2LDcgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEZpbGVUZXN0cywKICAgICAgICAgVGVtcG9yYXJ5RmlsZVRlc3RzLAogICAgICAgICBTdGF0QXR0cmlidXRlVGVzdHMsCiAgICAgICAgIEVudmlyb25UZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkgYi9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CmluZGV4IDg4MTA1MTYuLjU4NjhlYTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQpAQCAtNDAsNiArNDAsMTAgQEAKICAgICBkYXRhID0gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQogICAgIHJldHVybiAoZGF0YSwgcmF0ZSwgMTYsIG5jaGFubmVscykKIAorIyB2ZXJzaW9uIG9mIGFzc2VydCB0aGF0IHN0aWxsIHdvcmtzIHdpdGggLU8KK2RlZiBfYXNzZXJ0KGV4cHIsIG1lc3NhZ2U9Tm9uZSk6CisgICAgaWYgbm90IGV4cHI6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1lc3NhZ2Ugb3IgImFzc2VydGlvbiBmYWlsZWQiKQogCiBkZWYgcGxheV9zb3VuZF9maWxlKGRhdGEsIHJhdGUsIHNzaXplLCBuY2hhbm5lbHMpOgogICAgIHRyeToKQEAgLTU3LDkgKzYxLDkgQEAKICAgICBkc3AuZmlsZW5vKCkKIAogICAgICMgTWFrZSBzdXJlIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcyB3b3JrLgotICAgIGFzc2VydCBkc3AuY2xvc2VkIGlzIEZhbHNlLCAiZHNwLmNsb3NlZCBpcyBub3QgRmFsc2UiCi0gICAgYXNzZXJ0IGRzcC5uYW1lID09ICIvZGV2L2RzcCIKLSAgICBhc3NlcnQgZHNwLm1vZGUgPT0gJ3cnLCAiYmFkIGRzcC5tb2RlOiAlciIgJSBkc3AubW9kZQorICAgIF9hc3NlcnQoZHNwLmNsb3NlZCBpcyBGYWxzZSwgImRzcC5jbG9zZWQgaXMgbm90IEZhbHNlIikKKyAgICBfYXNzZXJ0KGRzcC5uYW1lID09ICIvZGV2L2RzcCIpCisgICAgX2Fzc2VydChkc3AubW9kZSA9PSAndycsICJiYWQgZHNwLm1vZGU6ICVyIiAlIGRzcC5tb2RlKQogCiAgICAgIyBBbmQgbWFrZSBzdXJlIHRoZXkncmUgcmVhbGx5IHJlYWQtb25seS4KICAgICBmb3IgYXR0ciBpbiAoJ2Nsb3NlZCcsICduYW1lJywgJ21vZGUnKToKQEAgLTY5LDE0ICs3MywyMyBAQAogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCisgICAgIyBDb21wdXRlIGV4cGVjdGVkIHJ1bm5pbmcgdGltZSBvZiBzb3VuZCBzYW1wbGUgKGluIHNlY29uZHMpLgorICAgIGV4cGVjdGVkX3RpbWUgPSBmbG9hdChsZW4oZGF0YSkpIC8gKHNzaXplLzgpIC8gbmNoYW5uZWxzIC8gcmF0ZQorCiAgICAgIyBzZXQgcGFyYW1ldGVycyBiYXNlZCBvbiAuYXUgZmlsZSBoZWFkZXJzCiAgICAgZHNwLnNldHBhcmFtZXRlcnMoQUZNVF9TMTZfTkUsIG5jaGFubmVscywgcmF0ZSkKKyAgICBwcmludCAoInBsYXlpbmcgdGVzdCBzb3VuZCBmaWxlIChleHBlY3RlZCBydW5uaW5nIHRpbWU6ICUuMmYgc2VjKSIKKyAgICAgICAgICAgJSBleHBlY3RlZF90aW1lKQogICAgIHQxID0gdGltZS50aW1lKCkKLSAgICBwcmludCAicGxheWluZyB0ZXN0IHNvdW5kIGZpbGUuLi4iCiAgICAgZHNwLndyaXRlKGRhdGEpCiAgICAgZHNwLmNsb3NlKCkKICAgICB0MiA9IHRpbWUudGltZSgpCi0gICAgcHJpbnQgImVsYXBzZWQgdGltZTogJS4xZiBzZWMiICUgKHQyLXQxKQorICAgIGVsYXBzZWRfdGltZSA9IHQyIC0gdDEKKworICAgIHBlcmNlbnRfZGlmZiA9IChhYnMoZWxhcHNlZF90aW1lIC0gZXhwZWN0ZWRfdGltZSkgLyBleHBlY3RlZF90aW1lKSAqIDEwMAorICAgIF9hc3NlcnQocGVyY2VudF9kaWZmIDw9IDEwLjAsIFwKKyAgICAgICAgICAgICgiZWxhcHNlZCB0aW1lICglLjJmIHNlYykgPiAxMCUlIG9mZiBvZiBleHBlY3RlZCB0aW1lICglLjJmIHNlYykiCisgICAgICAgICAgICAgJSAoZWxhcHNlZF90aW1lLCBleHBlY3RlZF90aW1lKSkpCiAKIGRlZiB0ZXN0X3NldHBhcmFtZXRlcnMoZHNwKToKICAgICAjIFR3byBjb25maWd1cmF0aW9ucyBmb3IgdGVzdGluZzoKQEAgLTEwMSwxMSArMTE0LDExIEBACiAgICAgIyBzZXRwYXJhbWV0ZXJzKCkgc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoaXMgY29uZmlndXJhdGlvbiBpbgogICAgICMgZWl0aGVyIHN0cmljdCBvciBub24tc3RyaWN0IG1vZGUuCiAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgRmFsc2UpCi0gICAgYXNzZXJ0IHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksIFwKLSAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZyArIHJlc3VsdCkKKyAgICBfYXNzZXJ0KHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnLCByZXN1bHQpKQogICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCi0gICAgYXNzZXJ0IHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksIFwKLSAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZyArIHJlc3VsdCkKKyAgICBfYXNzZXJ0KHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnLCByZXN1bHQpKQogCiBkZWYgdGVzdF9iYWRfc2V0cGFyYW1ldGVycyhkc3ApOgogCkBAIC0xMjMsOCArMTM2LDggQEAKICAgICAgICAgICAgICAgICAgIF06CiAgICAgICAgIChmbXQsIGNoYW5uZWxzLCByYXRlKSA9IGNvbmZpZwogICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBjb25maWcsIFwKLSAgICAgICAgICAgICAgICJzZXRwYXJhbWV0ZXJzOiB1bmV4cGVjdGVkbHkgZ290IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIgorICAgICAgICBfYXNzZXJ0KHJlc3VsdCAhPSBjb25maWcsCisgICAgICAgICAgICAgICAgInNldHBhcmFtZXRlcnM6IHVuZXhwZWN0ZWRseSBnb3QgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24iKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCkBAIC0xNDUsNiArMTU4LDYgQEAKICAgICAgICAgI3Rlc3RfYmFkX3NldHBhcmFtZXRlcnMoZHNwKQogICAgIGZpbmFsbHk6CiAgICAgICAgIGRzcC5jbG9zZSgpCi0gICAgICAgIGFzc2VydCBkc3AuY2xvc2VkIGlzIFRydWUsICJkc3AuY2xvc2VkIGlzIG5vdCBUcnVlIgorICAgICAgICBfYXNzZXJ0KGRzcC5jbG9zZWQgaXMgVHJ1ZSwgImRzcC5jbG9zZWQgaXMgbm90IFRydWUiKQogCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjkyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKaW5kZXggMmE0MzUzYS4uZDExMDBlYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKQEAgLTU4LDYgKzU4LDEzIEBACiAgICAgICAgIHMgPSBUZW1wbGF0ZSgndGltIGhhcyBlYXRlbiAke2NvdW50fSBiYWdzIG9mIGhhbSB0b2RheScpCiAgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgJ3RpbSBoYXMgZWF0ZW4gNyBiYWdzIG9mIGhhbSB0b2RheScpCiAKKyAgICBkZWYgdGVzdF90dXBsZWFyZ3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gYXRlICR7bWVhbH0nKQorICAgICAgICBkID0gZGljdCh3aG89KCd0aW0nLCAnZnJlZCcpLCBtZWFsPSgnaGFtJywgJ2t1bmcgcGFvJykpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgIigndGltJywgJ2ZyZWQnKSBhdGUgKCdoYW0nLCAna3VuZyBwYW8nKSIpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGQpLCAiKCd0aW0nLCAnZnJlZCcpIGF0ZSAoJ2hhbScsICdrdW5nIHBhbycpIikKKwogICAgIGRlZiB0ZXN0X1NhZmVUZW1wbGF0ZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAke3doYXR9IGZvciAke21lYWx9JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuLnB5CmluZGV4IDJiNjg3YWQuLmZiZjVlMDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3Blbi5weQpAQCAtNiw3ICs2LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJlYXBfY2hpbGRyZW4KIGZyb20gb3MgaW1wb3J0IHBvcGVuCiAKICMgVGVzdCB0aGF0IGNvbW1hbmQtbGluZXMgZ2V0IGRvd24gYXMgd2UgZXhwZWN0LgpAQCAtMzUsNSArMzUsNiBAQAogZGVmIG1haW4oKToKICAgICBwcmludCAiVGVzdCBwb3BlbjoiCiAgICAgX3Rlc3RfY29tbWFuZGxpbmUoKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKaW5kZXggNGRiM2NkMS4uMmQ1NGViMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKQEAgLTUsNyArNSw3IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCByZWFwX2NoaWxkcmVuCiAKICMgcG9wZW4yIGNvbnRhaW5zIGl0cyBvd24gdGVzdGluZyByb3V0aW5lCiAjIHdoaWNoIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHRvIHNlZSBpZiBvcGVuIGZpbGVzCkBAIC03NSwzICs3NSw0IEBACiAKIG1haW4oKQogX3Rlc3QoKQorcmVhcF9jaGlsZHJlbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKaW5kZXggYTlhNWU4Zi4uMDY5ODgxOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQpAQCAtMzY1LDMgKzM2NSwyNCBAQAogICA8Yy8+CiAgPC9iPgogPC9hPicnJywgMSkKKworCitkZWYgdGVzdF9wYXJzZV9vbmx5X3htbF9kYXRhKCk6CisgICAgIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMjk2NDMzCisgICAgIworICAgIHhtbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDI1KQorICAgICMgdGhpcyBvbmUgZG9lc24ndCBjcmFzaAorICAgICN4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDAwMCkKKworICAgIGRlZiBoYW5kbGVyKHRleHQpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24KKworICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcgorCisgICAgdHJ5OgorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCit0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zYXgucHkgYi9MaWIvdGVzdC90ZXN0X3NheC5weQppbmRleCBkZWQ4MWZiLi5hZjRjN2RkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NheC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NheC5weQpAQCAtMSwxNyArMSwxNyBAQAogIyByZWdyZXNzaW9uIHRlc3QgZm9yIFNBWCAyLjAgICAgICAgICAgICAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQogIyAkSWQkCiAKLWZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyLCBDb250ZW50SGFuZGxlciwgXAotICAgICBTQVhFeGNlcHRpb24sIFNBWFJlYWRlck5vdEF2YWlsYWJsZSwgU0FYUGFyc2VFeGNlcHRpb24KK2Zyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIsIENvbnRlbnRIYW5kbGVyLCBcCisgICAgICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgogdHJ5OgogICAgIG1ha2VfcGFyc2VyKCkKIGV4Y2VwdCBTQVhSZWFkZXJOb3RBdmFpbGFibGU6CiAgICAgIyBkb24ndCB0cnkgdG8gdGVzdCB0aGlzIG1vZHVsZSBpZiB3ZSBjYW5ub3QgY3JlYXRlIGEgcGFyc2VyCiAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIm5vIFhNTCBwYXJzZXJzIGF2YWlsYWJsZSIpCi1mcm9tIHhtbGNvcmUuc2F4LnNheHV0aWxzIGltcG9ydCBYTUxHZW5lcmF0b3IsIGVzY2FwZSwgdW5lc2NhcGUsIHF1b3RlYXR0ciwgXAotICAgICBYTUxGaWx0ZXJCYXNlCi1mcm9tIHhtbGNvcmUuc2F4LmV4cGF0cmVhZGVyIGltcG9ydCBjcmVhdGVfcGFyc2VyCi1mcm9tIHhtbGNvcmUuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCitmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IFhNTEdlbmVyYXRvciwgZXNjYXBlLCB1bmVzY2FwZSwgcXVvdGVhdHRyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEZpbHRlckJhc2UKK2Zyb20geG1sLnNheC5leHBhdHJlYWRlciBpbXBvcnQgY3JlYXRlX3BhcnNlcgorZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyYm9zZSwgVGVzdEZhaWxlZCwgZmluZGZpbGUKIGltcG9ydCBvcwpAQCAtMzYsMTcgKzM2LDE3IEBACiAgICAgICAgICMgQ3JlYXRpbmcgcGFyc2VycyBzZXZlcmFsIHRpbWVzIGluIGEgcm93IHNob3VsZCBzdWNjZWVkLgogICAgICAgICAjIFRlc3RpbmcgdGhpcyBiZWNhdXNlIHRoZXJlIGhhdmUgYmVlbiBmYWlsdXJlcyBvZiB0aGlzIGtpbmQKICAgICAgICAgIyBiZWZvcmUuCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgZXhjZXB0OgogICAgICAgICByZXR1cm4gMApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgdHJ5OgogICAgICAgICAjIENyZWF0aW5nIGEgcGFyc2VyIHNob3VsZCBzdWNjZWVkIC0gaXQgc2hvdWxkIGZhbGwgYmFjawogICAgICAgICAjIHRvIHRoZSBleHBhdHJlYWRlcgotICAgICAgICBwID0gbWFrZV9wYXJzZXIoWyd4bWxjb3JlLnBhcnNlcnMubm9fc3VjaF9wYXJzZXInXSkKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKFsneG1sLnBhcnNlcnMubm9fc3VjaF9wYXJzZXInXSkKICAgICBleGNlcHQ6CiAgICAgICAgIHJldHVybiAwCiAgICAgZWxzZToKQEAgLTE3NSwxMSArMTc1LDE0IEBACiAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQogICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiJ1wiIn0pCiAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQorICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiXG5cclx0In0pCisgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQogICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgIGdlbi5lbmREb2N1bWVudCgpCiAKLSAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgXAotICAgICAgICAgICArICI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT48ZSBhPVwiJyZxdW90O1wiPjwvZT48L2RvYz4iCisgICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgKCI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJiMxMDsmIzEzOyYjOTtcIj48L2U+PC9kb2M+IikKIAogZGVmIHRlc3RfeG1sZ2VuX2lnbm9yYWJsZSgpOgogICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKQEAgLTY2OCw2ICs2NzEsNTUgQEAKICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gIm5zOmF0dHIiCiAKIAorIyBEdXJpbmcgdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiAyLjUsIGFuIGF0dGVtcHQgdG8gbW92ZSB0aGUgInhtbCIKKyMgcGFja2FnZSBpbXBsZW1lbnRhdGlvbiB0byBhIG5ldyBwYWNrYWdlICgieG1sY29yZSIpIHByb3ZlZCBwYWluZnVsLgorIyBUaGUgZ29hbCBvZiB0aGlzIGNoYW5nZSB3YXMgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGJlIGFibGUgdG8KKyMgb2J0YWluIGFuZCByZWx5IG9uIGJlaGF2aW9yIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisjIG9mIHRoZSBYTUwgc3VwcG9ydCB3aXRob3V0IG5lZWRpbmcgdG8gYmUgY29uY2VybmVkIGFib3V0IHRoZQorIyBhdmFpbGFiaWxpdHkgb2YgdGhlIFB5WE1MIGltcGxlbWVudGF0aW9uLgorIworIyBXaGlsZSB0aGUgZXhpc3RpbmcgaW1wb3J0IGhhY2tlcnkgaW4gTGliL3htbC9fX2luaXRfXy5weSBjYW4gY2F1c2UKKyMgUHlYTUwncyBfeG1scHVzIHBhY2thZ2UgdG8gc3VwcGxhbnQgdGhlICJ4bWwiIHBhY2thZ2UsIHRoYXQgb25seQorIyB3b3JrcyBiZWNhdXNlIGVpdGhlciBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAieG1sIiBwYWNrYWdlIG5hbWUgZm9yCisjIGltcG9ydHMuCisjCisjIFRoZSBtb3ZlIHJlc3VsdGVkIGluIGEgbnVtYmVyIG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorIyB0aGUgaW1wb3J0IG1hY2hpbmVyeSdzICJwYWNrYWdlIGNvbnRleHQiIGlzIGJhc2VkIG9uIHRoZSBuYW1lIHRoYXQncworIyBiZWluZyBpbXBvcnRlZCByYXRoZXIgdGhhbiB0aGUgX19uYW1lX18gb2YgdGhlIGFjdHVhbCBwYWNrYWdlCisjIGNvbnRhaW5tZW50OyBpdCB3YXNuJ3QgcG9zc2libGUgZm9yIHRoZSAieG1sIiBwYWNrYWdlIHRvIGJlIHJlcGxhY2VkCisjIGJ5IGEgc2ltcGxlIG1vZHVsZSB0aGF0IGluZGlyZWN0ZWQgaW1wb3J0cyB0byB0aGUgInhtbGNvcmUiIHBhY2thZ2UuCisjCisjIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGV4ZXJjaXNlZCBidWdzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHRoYXQKKyMgYXR0ZW1wdC4gIEtlZXBpbmcgdGhlc2UgdGVzdHMgYXJvdW5kIHdpbGwgaGVscCBkZXRlY3QgcHJvYmxlbXMgd2l0aAorIyBvdGhlciBhdHRlbXB0cyB0byBwcm92aWRlIHJlbGlhYmxlIGFjY2VzcyB0byB0aGUgc3RhbmRhcmQgbGlicmFyeSdzCisjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgc3VwcG9ydC4KKworZGVmIHRlc3Rfc2ZfMTUxMTQ5NygpOgorICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTE0OTcKKyAgICBpbXBvcnQgc3lzCisgICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKKyAgICBmb3IgbW9kbmFtZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgIGlmIG1vZG5hbWUuc3RhcnRzd2l0aCgieG1sLiIpOgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgorICAgICAgICBtb2R1bGUgPSB4bWwuc2F4LmV4cGF0cmVhZGVyCisgICAgICAgIHJldHVybiBtb2R1bGUuX19uYW1lX18gPT0gInhtbC5zYXguZXhwYXRyZWFkZXIiCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQorCitkZWYgdGVzdF9zZl8xNTEzNjExKCk6CisgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMzYxMQorICAgIHNpbyA9IFN0cmluZ0lPKCJpbnZhbGlkIikKKyAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCisgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBTQVhQYXJzZUV4Y2VwdGlvbgorICAgIHRyeToKKyAgICAgICAgcGFyc2VyLnBhcnNlKHNpbykKKyAgICBleGNlcHQgU0FYUGFyc2VFeGNlcHRpb246CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKICMgPT09PT0gTWFpbiBwcm9ncmFtCiAKIGRlZiBtYWtlX3Rlc3Rfb3V0cHV0KCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5IGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQppbmRleCBmMzcyNTRjLi4yMzk3NDVjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKQEAgLTI5OSw2ICsyOTksMTcgQEAKIGVsc2U6CiAgICAgcmFpc2UgVGVzdEZhaWxlZAogCisjIHRlc3QgZm9yIGJ1ZyAjMTUwMTkzNDogaW5jb3JyZWN0IExPQUQvU1RPUkVfR0xPQkFMIGdlbmVyYXRpb24KK2dsb2JhbF94ID0gMQorZGVmIGYoKToKKyAgICBnbG9iYWxfeCArPSAxCit0cnk6CisgICAgZigpCitleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAnc2NvcGUgb2YgZ2xvYmFsX3ggbm90IGNvcnJlY3RseSBkZXRlcm1pbmVkJworCiBwcmludCAiMTQuIGNvbXBsZXggZGVmaW5pdGlvbnMiCiAKIGRlZiBtYWtlUmV0dXJuZXIoKmxzdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NlbGVjdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CmluZGV4IGVhZWM1MmIuLmQzNDEzMjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CkBAIC0xLDUgKzEsNSBAQAogIyBUZXN0aW5nIHNlbGVjdCBtb2R1bGUKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJlYXBfY2hpbGRyZW4KIGltcG9ydCBzZWxlY3QKIGltcG9ydCBvcwogCkBAIC02NSw1ICs2NSw2IEBACiAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICBwcmludCAnVW5leHBlY3RlZCByZXR1cm4gdmFsdWVzIGZyb20gc2VsZWN0KCk6JywgcmZkLCB3ZmQsIHhmZAogICAgIHAuY2xvc2UoKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQppbmRleCA4ZThiMDJmLi4yOGEyMWE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CkBAIC0xLDQgKzEsNiBAQAoraW1wb3J0IGh0bWxlbnRpdHlkZWZzCiBpbXBvcnQgcHByaW50CitpbXBvcnQgcmUKIGltcG9ydCBzZ21sbGliCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CkBAIC02NCw2ICs2NiwzNyBAQAogICAgICAgICBzZWxmLnNldGxpdGVyYWwoKQogCiAKK2NsYXNzIEhUTUxFbnRpdHlDb2xsZWN0b3IoRXZlbnRDb2xsZWN0b3IpOgorCisgICAgZW50aXR5X29yX2NoYXJyZWYgPSByZS5jb21waWxlKCcoPzomKFthLXpBLVpdWy0uYS16QS1aMC05XSopJworICAgICAgICAnfCYjKHhbMC05YS16QS1aXSt8WzAtOV0rKSkoOz8pJykKKworICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY2hhcnJlZiIsICJjb252ZXJ0IiwgbmFtZSkpCisgICAgICAgIGlmIG5hbWVbMF0gIT0gIngiOgorICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKQorCisgICAgZGVmIGNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY29kZXBvaW50IiwgImNvbnZlcnQiLCBjb2RlcG9pbnQpKQorICAgICAgICBFdmVudENvbGxlY3Rvci5jb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpCisKKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgImNvbnZlcnQiLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfZW50aXR5cmVmKHNlbGYsIG5hbWUpCisKKyAgICAjIFRoZXNlIHRvIHJlY29yZCB0aGF0IHRoZXkgd2VyZSBjYWxsZWQsIHRoZW4gcGFzcyB0aGUgY2FsbCBhbG9uZworICAgICMgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gdGhhdCBpdCdzIGFjdGlvbnMgY2FuIGJlCisgICAgIyByZWNvcmRlZC4KKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKQorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpCisKKwogY2xhc3MgU0dNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGNvbGxlY3RvciA9IEV2ZW50Q29sbGVjdG9yCkBAIC0yMTgsNyArMjUxLDkgQEAKICAgICAgICAgIiIiU3Vic3RpdHV0aW9uIG9mIGVudGl0aWVzIGFuZCBjaGFycmVmcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCiAgICAgICAgICMgU0YgYnVnICMxNDUyMjQ2CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9Jmx0OyBjPSZsdDsmZ3Q7IGQ9Jmx0LSZndDsgZT0nJmx0OyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY9IiZ4eHg7IiBnPScmIzMyOyYjMzM7JyBoPScmIzUwMDsnIGk9J3g/YT1iJmM9ZDsnPiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZj0iJnh4eDsiIGc9JyYjMzI7JiMzMzsnIGg9JyYjNTAwOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0neD9hPWImYz1kOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaj0nJmFtcDsjNDI7JyBrPScmIzM4OyM0MjsnPiIiIiwKICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgIjw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsICImbHQtPiIpLApAQCAtMjI2LDEzICsyNjEsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgIiZ4eHg7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsICIgISIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCAiJiM1MDA7IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsICJ4P2E9YiZjPWQ7IiksIF0pXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIng/YT1iJmM9ZDsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJqIiwgIiYjNDI7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiayIsICImIzQyOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV0pCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0X292ZXJyaWRlcyhzZWxmKToKKyAgICAgICAgIyBUaGlzIGNoZWNrcyB0aGF0IHRoZSBjaGFyYWN0ZXIgYW5kIGVudGl0eSByZWZlcmVuY2UKKyAgICAgICAgIyBjb252ZXJzaW9uIGhlbHBlcnMgYXJlIGNhbGxlZCBhdCB0aGUgZG9jdW1lbnRlZCB0aW1lcy4gIE5vCisgICAgICAgICMgYXR0ZW1wdCBpcyBtYWRlIHRvIHJlYWxseSBjaGFuZ2Ugd2hhdCB0aGUgcGFyc2VyIGFjY2VwdHMuCisgICAgICAgICMKKyAgICAgICAgc2VsZi5jb2xsZWN0b3IgPSBIVE1MRW50aXR5Q29sbGVjdG9yCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCgnPGEgdGl0bGU9IiZsZHF1bzt0ZXN0JiN4MjAxZDsiPmZvbzwvYT4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnJmZvb2JhcjsmIzQyOycpLCBbCisgICAgICAgICAgICAoJ2VudGl0eXJlZicsICdjb252ZXJ0JywgJ2xkcXVvJyksCisgICAgICAgICAgICAoJ2NoYXJyZWYnLCAnY29udmVydCcsICd4MjAxZCcpLAorICAgICAgICAgICAgKCdzdGFydHRhZycsICdhJywgWygndGl0bGUnLCAnJmxkcXVvO3Rlc3QmI3gyMDFkOycpXSksCisgICAgICAgICAgICAoJ2RhdGEnLCAnZm9vJyksCisgICAgICAgICAgICAoJ2VuZHRhZycsICdhJyksCisgICAgICAgICAgICAoJ2VudGl0eXJlZicsICdmb29iYXInKSwKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2NvbnZlcnQnLCAnZm9vYmFyJyksCisgICAgICAgICAgICAoJ2NoYXJyZWYnLCAnNDInKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICdjb252ZXJ0JywgJzQyJyksCisgICAgICAgICAgICAoJ2NvZGVwb2ludCcsICdjb252ZXJ0JywgNDIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzX3F1b3RlZF9tYXJrdXAoc2VsZik6CisgICAgICAgICIiIk11bHRpLWxpbmUgYW5kIG1hcmt1cCBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdmb29cbjxicj5iYXInPnRleHQ8L2E+IiIiLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImZvb1xuPGJyPmJhciIpXSksCisgICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKKyAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSB0aXRsZT0nbGVzcyA8IHRoYW4nPnRleHQ8L2E+IiIiLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImxlc3MgPCB0aGFuIildKSwKKyAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAorICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdncmVhdGVyID4gdGhhbic+dGV4dDwvYT4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAiZ3JlYXRlciA+IHRoYW4iKV0pLAorICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCisgICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKIAogICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGEuYj0ndicgYzpkPXYgZS1mPXY+IiIiLCBbCiAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJhLmIiLCAidiIpLCAoImM6ZCIsICJ2IiksICgiZS1mIiwgInYiKV0pLAogICAgICAgICAgICAgXSkKIAorICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVfaXA2X3VybChzZWxmKToKKyAgICAgICAgIyBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODUzNTA2CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCgiPGEgaHJlZj0naHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLyc+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhIGhyZWY9aHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLz4iKSwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICJodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vIildKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiaHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLyIpXSksCisgICAgICAgICAgICBdKQorCiAgICAgZGVmIHRlc3RfaWxsZWdhbF9kZWNsYXJhdGlvbnMoc2VsZik6CiAgICAgICAgIHMgPSAnYWJjPCFzcGFjZXIgdHlwZT0iYmxvY2siIGhlaWdodD0iMjUiPmRlZicKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMocywgWwpAQCAtMzAxLDggKzM4Miw4IEBACiAgICAgIyB0aGF0IG5lZWRzIHRvIGJlIGNhcmVmdWxseSBjb25zaWRlcmVkIGJlZm9yZSBjaGFuZ2luZyBpdC4KIAogICAgIGRlZiBfdGVzdF9zdGFydHRhZ19lbmRfYm91bmRhcnkoc2VsZik6Ci0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9JzwnPiIiIiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldKQotICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBiPSc+Jz4iIiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIj4iKV0pXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhIGI9JzwnPiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKV0pXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhIGI9Jz4nPiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIj4iKV0pXSkKIAogICAgIGRlZiBfdGVzdF9idWZmZXJfYXJ0ZWZhY3RzKHNlbGYpOgogICAgICAgICBvdXRwdXQgPSBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0KQEAgLTMyMiwxNyArNDAzLDE3IEBACiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPiciLCAiPiJdLCBvdXRwdXQpCiAKICAgICAgICAgb3V0cHV0ID0gWygiY29tbWVudCIsICJhYmMiKV0KLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IiwgIiEtLWFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhIiwgIi0tYWJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tIiwgImFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hIiwgImJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjIiwgIi0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMtIiwgIi0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLS0+IiwgIiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwiLCAiIS0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8ISIsICItLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS0iLCAiYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYSIsICJiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMiLCAiLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjLSIsICItPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMtLT4iLCAiIl0sIG91dHB1dCkKIAogICAgIGRlZiBfdGVzdF9zdGFydHRhZ19qdW5rX2NoYXJzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKaW5kZXggNmFiNWEzNS4uZGE3MWZhOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKQEAgLTc0LDYgKzc0LDUzIEBACiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIHRlc3RfY29weXRyZWVfc2ltcGxlKHNlbGYpOgorICAgICAgICBkZWYgd3JpdGVfZGF0YShwYXRoLCBkYXRhKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGRlZiByZWFkX2RhdGEocGF0aCk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAgICAgc3JjX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBkc3RfZGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLm1rZHRlbXAoKSwgJ2Rlc3RpbmF0aW9uJykKKworICAgICAgICB3cml0ZV9kYXRhKG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdC50eHQnKSwgJzEyMycpCisKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicpKQorICAgICAgICB3cml0ZV9kYXRhKG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSwgJzQ1NicpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LnR4dCcpKSkKKyAgICAgICAgICAgIGFjdHVhbCA9IHJlYWRfZGF0YShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgJzEyMycpCisgICAgICAgICAgICBhY3R1YWwgPSByZWFkX2RhdGEob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsICc0NTYnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIHBhdGggaW4gKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBmb3IgcGF0aCBpbiAoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicpLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMocGF0aCkKKworCiAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKICAgICAgICAgZGVmIHRlc3RfZG9udF9jb3B5X2ZpbGVfb250b19saW5rX3RvX2l0c2VsZihzZWxmKToKICAgICAgICAgICAgICMgYnVnIDg1MTEyMy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKaW5kZXggZjdmY2IwNC4uYTYyNjdkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKQEAgLTI1LDcgKzI1LDExIEBACiAgKSAmCiAiIiIgJSB2YXJzKCkKIAorYV9jYWxsZWQgPSBiX2NhbGxlZCA9IEZhbHNlCisKIGRlZiBoYW5kbGVyQSgqYXJncyk6CisgICAgZ2xvYmFsIGFfY2FsbGVkCisgICAgYV9jYWxsZWQgPSBUcnVlCiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgImhhbmRsZXJBIiwgYXJncwogCkBAIC0zMywxMSArMzcsMTQgQEAKICAgICBwYXNzCiAKIGRlZiBoYW5kbGVyQigqYXJncyk6CisgICAgZ2xvYmFsIGJfY2FsbGVkCisgICAgYl9jYWxsZWQgPSBUcnVlCiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgImhhbmRsZXJCIiwgYXJncwogICAgIHJhaXNlIEhhbmRsZXJCQ2FsbGVkLCBhcmdzCiAKLXNpZ25hbC5hbGFybSgyMCkgICAgICAgICAgICAgICAgICAgICAgICAjIEVudGlyZSB0ZXN0IGxhc3RzIGF0IG1vc3QgMjAgc2VjLgorTUFYX0RVUkFUSU9OID0gMjAKK3NpZ25hbC5hbGFybShNQVhfRFVSQVRJT04pICAgIyBFbnRpcmUgdGVzdCBzaG91bGQgbGFzdCBhdCBtb3N0IDIwIHNlYy4KIGh1cCA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaGFuZGxlckEpCiB1c3IxID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgaGFuZGxlckIpCiB1c3IyID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCkBAIC02NSw5ICs3MiwzNSBAQAogZXhjZXB0IFR5cGVFcnJvcjoKICAgICBwYXNzCiAKKyMgU2V0IHVwIGEgY2hpbGQgdG8gc2VuZCBhbiBhbGFybSBzaWduYWwgdG8gdXMgKHRoZSBwYXJlbnQpIGFmdGVyIHdhaXRpbmcKKyMgbG9uZyBlbm91Z2ggdG8gcmVjZWl2ZSB0aGUgYWxhcm0uICBJdCBzZWVtcyB3ZSBtaXNzIHRoZSBhbGFybSBmb3Igc29tZQorIyByZWFzb24uICBUaGlzIHdpbGwgaG9wZWZ1bGx5IHN0b3AgdGhlIGhhbmdzIG9uIFRydTY0L0FscGhhLgorZGVmIGZvcmNlX3Rlc3RfZXhpdCgpOgorICAgICMgU2lnaCwgYm90aCBpbXBvcnRzIHNlZW0gbmVjZXNzYXJ5IHRvIGF2b2lkIGVycm9ycy4KKyAgICBpbXBvcnQgb3MKKyAgICBmb3JrX3BpZCA9IG9zLmZvcmsoKQorICAgIGlmIGZvcmtfcGlkID09IDA6CisgICAgICAgICMgSW4gY2hpbGQKKyAgICAgICAgaW1wb3J0IG9zLCB0aW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV2FpdCA1IHNlY29uZHMgbG9uZ2VyIHRoYW4gdGhlIGV4cGVjdGVkIGFsYXJtIHRvIGdpdmUgZW5vdWdoCisgICAgICAgICAgICAjIHRpbWUgZm9yIHRoZSBub3JtYWwgc2VxdWVuY2Ugb2YgZXZlbnRzIHRvIG9jY3VyLiAgVGhpcyBpcworICAgICAgICAgICAgIyBqdXN0IGEgc3RvcC1nYXAgdG8gcHJldmVudCB0aGUgdGVzdCBmcm9tIGhhbmdpbmcuCisgICAgICAgICAgICB0aW1lLnNsZWVwKE1BWF9EVVJBVElPTiArIDUpCisgICAgICAgICAgICBwcmludCA+PiBzeXMuX19zdGRvdXRfXywgJyAgY2hpbGQgc2hvdWxkIG5vdCBoYXZlIHRvIGtpbGwgcGFyZW50JworICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdBTEFSTSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgIyBJbiBwYXJlbnQgKG9yIGVycm9yKQorICAgIHJldHVybiBmb3JrX3BpZAorCiB0cnk6CiAgICAgb3Muc3lzdGVtKHNjcmlwdCkKIAorICAgICMgVHJ5IHRvIGVuc3VyZSB0aGlzIHRlc3QgZXhpdHMgZXZlbiBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCBhbGFybS4KKyAgICAjIFRydTY0L0FscGhhIHNvbWV0aW1lcyBoYW5ncyBhbmQgaXMgdWx0aW1hdGVseSBraWxsZWQgYnkgdGhlIGJ1aWxkYm90LgorICAgIGZvcmtfcGlkID0gZm9yY2VfdGVzdF9leGl0KCkKICAgICBwcmludCAic3RhcnRpbmcgcGF1c2UoKSBsb29wLi4uIgogCiAgICAgdHJ5OgpAQCAtODgsNiArMTIxLDIyIEBACiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiS2V5Ym9hcmRJbnRlcnJ1cHQgKGFzc3VtZSB0aGUgYWxhcm0oKSB3ZW50IG9mZikiCiAKKyAgICAjIEZvcmNpYmx5IGtpbGwgdGhlIGNoaWxkIHdlIGNyZWF0ZWQgdG8gcGluZyB1cyBpZiB0aGVyZSB3YXMgYSB0ZXN0IGVycm9yLgorICAgIHRyeToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3Qga2lsbCBvdXJzZWxmIGlmIHRoZXJlIHdhcyBhIGZvcmsgZXJyb3IuCisgICAgICAgIGlmIGZvcmtfcGlkID4gMDoKKyAgICAgICAgICAgIG9zLmtpbGwoZm9ya19waWQsIHNpZ25hbC5TSUdLSUxMKQorICAgIGV4Y2VwdDoKKyAgICAgICAgIyBJZiB0aGUgY2hpbGQga2lsbGVkIHVzLCBpdCBoYXMgcHJvYmFibHkgZXhpdGVkLiAgS2lsbGluZyBhCisgICAgICAgICMgbm9uLWV4aXN0YW50IHByb2Nlc3Mgd2lsbCByYWlzZSBhbiBlcnJvciB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0LgorICAgICAgICBwYXNzCisKKyAgICBpZiBub3QgYV9jYWxsZWQ6CisgICAgICAgIHByaW50ICdIYW5kbGVyQSBub3QgY2FsbGVkJworCisgICAgaWYgbm90IGJfY2FsbGVkOgorICAgICAgICBwcmludCAnSGFuZGxlckIgbm90IGNhbGxlZCcKKwogZmluYWxseToKICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIGh1cCkKICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCB1c3IxKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCAwMWI5YjViLi4zNTZiODAxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTEsNiArMTEsNyBAQAogaW1wb3J0IHN5cwogaW1wb3J0IGFycmF5CiBmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CitpbXBvcnQgc2lnbmFsCiAKIFBPUlQgPSA1MDAwNwogSE9TVCA9ICdsb2NhbGhvc3QnCkBAIC0yMSw3ICsyMiw4IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNlbGYuc2Vydi5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzZWxmLnNlcnYuYmluZCgoSE9TVCwgUE9SVCkpCisgICAgICAgIGdsb2JhbCBQT1JUCisgICAgICAgIFBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydiwgSE9TVCwgUE9SVCkKICAgICAgICAgc2VsZi5zZXJ2Lmxpc3RlbigxKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpAQCAtMzMsNyArMzUsOCBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5zZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCiAgICAgICAgIHNlbGYuc2Vydi5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzZWxmLnNlcnYuYmluZCgoSE9TVCwgUE9SVCkpCisgICAgICAgIGdsb2JhbCBQT1JUCisgICAgICAgIFBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydiwgSE9TVCwgUE9SVCkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKQEAgLTQ0Nyw3ICs0NTAsMTIgQEAKICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc29jay5iaW5kKCgiMC4wLjAuMCIsIFBPUlQrMSkpCiAgICAgICAgIG5hbWUgPSBzb2NrLmdldHNvY2tuYW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lLCAoIjAuMC4wLjAiLCBQT1JUKzEpKQorICAgICAgICAjIFhYWChubm9yd2l0eik6IGh0dHA6Ly90aW55dXJsLmNvbS9vczVqeiBzZWVtcyB0byBpbmRpY2F0ZQorICAgICAgICAjIGl0IHJlYXNvbmFibGUgdG8gZ2V0IHRoZSBob3N0J3MgYWRkciBpbiBhZGRpdGlvbiB0byAwLjAuMC4wLgorICAgICAgICAjIEF0IGxlYXN0IGZvciBlQ29zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIFMvMzkwIHRvIHBhc3MuCisgICAgICAgIG15X2lwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWVbMF0gaW4gKCIwLjAuMC4wIiwgbXlfaXBfYWRkciksICclcyBpbnZhbGlkJyAlIG5hbWVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZVsxXSwgUE9SVCsxKQogCiAgICAgZGVmIHRlc3RHZXRTb2NrT3B0KHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgZ2V0c29ja29wdCgpCkBAIC01NzUsNiArNTgzLDIxIEBACiAgICAgZGVmIF90ZXN0UmVjdkZyb20oc2VsZik6CiAgICAgICAgIHNlbGYuY2xpLnNlbmR0byhNU0csIDAsIChIT1NULCBQT1JUKSkKIAorY2xhc3MgVENQQ2xvc2VyVGVzdChUaHJlYWRlZFRDUFNvY2tldFRlc3QpOgorCisgICAgZGVmIHRlc3RDbG9zZShzZWxmKToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgICAgICBzZCA9IHNlbGYuY2xpCisgICAgICAgIHJlYWQsIHdyaXRlLCBlcnIgPSBzZWxlY3Quc2VsZWN0KFtzZF0sIFtdLCBbXSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWQsIFtzZF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2QucmVjdigxKSwgJycpCisKKyAgICBkZWYgX3Rlc3RDbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgUE9SVCkpCisgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCiBjbGFzcyBCYXNpY1NvY2tldFBhaXJUZXN0KFNvY2tldFBhaXJUZXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CkBAIC03OTUsNiArODE4LDM3IEBACiAgICAgICAgIGlmIG5vdCBvazoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiYWNjZXB0KCkgcmV0dXJuZWQgc3VjY2VzcyB3aGVuIHdlIGRpZCBub3QgZXhwZWN0IGl0IikKIAorICAgIGRlZiB0ZXN0SW50ZXJydXB0ZWRUaW1lb3V0KHNlbGYpOgorICAgICAgICAjIFhYWCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgdGVzdCBvbiBNU1dpbmRvd3Mgb3IgYW55IG90aGVyCisgICAgICAgICMgcGxhZm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzaWduYWwuYWxhcm0oKSBvciBvcy5raWxsKCksIHRob3VnaAorICAgICAgICAjIHRoZSBidWcgc2hvdWxkIGhhdmUgZXhpc3RlZCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzaWduYWwsICJhbGFybSIpOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgIyBjYW4gb25seSB0ZXN0IG9uICpuaXgKKyAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoNS4wKSAgICMgbXVzdCBiZSBsb25nZXIgdGhhbiBhbGFybQorICAgICAgICBjbGFzcyBBbGFybShFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgYWxhcm1faGFuZGxlcihzaWduYWwsIGZyYW1lKToKKyAgICAgICAgICAgIHJhaXNlIEFsYXJtCisgICAgICAgIG9sZF9hbGFybSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSgyKSAgICAjIFBPU0lYIGFsbG93cyBhbGFybSB0byBiZSB1cCB0byAxIHNlY29uZCBlYXJseQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvbyA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHRpbWVvdXQgaW5zdGVhZCBvZiBBbGFybSIpCisgICAgICAgICAgICBleGNlcHQgQWxhcm06CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IG90aGVyIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIEFsYXJtIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJub3RoaW5nIGNhdWdodCIpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMCkgICAgICAgICAjIHNodXQgb2ZmIGFsYXJtCisgICAgICAgIGV4Y2VwdCBBbGFybToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZ290IEFsYXJtIGluIHdyb25nIHBsYWNlIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgbm8gYWxhcm0gY2FuIGJlIHBlbmRpbmcuICBTYWZlIHRvIHJlc3RvcmUgb2xkIGhhbmRsZXIuCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBvbGRfYWxhcm0pCisKIGNsYXNzIFVEUFRpbWVvdXRUZXN0KFNvY2tldFRDUFRlc3QpOgogCiAgICAgZGVmIHRlc3RVRFBUaW1lb3V0KHNlbGYpOgpAQCAtODgzLDggKzkzNyw4IEBACiAgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoYnVmKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUFRpbWVvdXRUZXN0LCBUZXN0RXhjZXB0aW9ucywKLSAgICAgICAgICAgICBCdWZmZXJJT1Rlc3RdCisgICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUENsb3NlclRlc3QsIFRDUFRpbWVvdXRUZXN0LAorICAgICAgICAgICAgIFRlc3RFeGNlcHRpb25zLCBCdWZmZXJJT1Rlc3RdCiAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdtYWMnOgogICAgICAgICB0ZXN0cy5leHRlbmQoWyBCYXNpY1VEUFRlc3QsIFVEUFRpbWVvdXRUZXN0IF0pCiAKQEAgLTg5OSw3ICs5NTMsMTAgQEAKICAgICAgICAgdGVzdHMuYXBwZW5kKEJhc2ljU29ja2V0UGFpclRlc3QpCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdsaW51eDInOgogICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UpCisKKyAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQppbmRleCAxMDkxMzgzLi4zYzljOWYwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CkBAIC0zLDYgKzMsNyBAQAogaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubwogCiAjIE9wdGlvbmFsbHkgdGVzdCBTU0wgc3VwcG9ydC4gIFRoaXMgcmVxdWlyZXMgdGhlICduZXR3b3JrJyByZXNvdXJjZSBhcyBnaXZlbgogIyBvbiB0aGUgcmVncnRlc3QgY29tbWFuZCBsaW5lLgpAQCAtMzMsNiArMzQsMTMgQEAKIGRlZiB0ZXN0X3RpbWVvdXQoKToKICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQogCisgICAgZGVmIGVycm9yX21zZyhleHRyYV9tc2cpOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiJcCisgICAgV0FSTklORzogIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byAlciAlcywgaW4KKyAgICB0ZXN0X3RpbWVvdXQuICBUaGF0IG1heSBiZSBsZWdpdGltYXRlLCBidXQgaXMgbm90IHRoZSBvdXRjb21lIHdlIGhvcGVkCisgICAgZm9yLiAgSWYgdGhpcyBtZXNzYWdlIGlzIHNlZW4gb2Z0ZW4sIHRlc3RfdGltZW91dCBzaG91bGQgYmUgY2hhbmdlZCB0bworICAgIHVzZSBhIG1vcmUgcmVsaWFibGUgYWRkcmVzcy4iIiIgJSAoQUREUiwgZXh0cmFfbXNnKQorCiAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgIHByaW50ICJ0ZXN0X3RpbWVvdXQgLi4uIgogCkBAIC00OCwxMiArNTYsMTQgQEAKICAgICB0cnk6CiAgICAgICAgIHMuY29ubmVjdChBRERSKQogICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKLSAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIiIiXAotICAgIFdBUk5JTkc6ICBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gJXIgdGltZWQgb3V0LCBpbgotICAgIHRlc3RfdGltZW91dC4gIFRoYXQgbWF5IGJlIGxlZ2l0aW1hdGUsIGJ1dCBpcyBub3QgdGhlIG91dGNvbWUgd2UgaG9wZWQKLSAgICBmb3IuICBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBvZnRlbiwgdGVzdF90aW1lb3V0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCi0gICAgdXNlIGEgbW9yZSByZWxpYWJsZSBhZGRyZXNzLiIiIiAlIChBRERSLCkKKyAgICAgICAgZXJyb3JfbXNnKCd0aW1lZCBvdXQnKQogICAgICAgICByZXR1cm4KKyAgICBleGNlcHQgc29ja2V0LmVycm9yLCBleGM6ICAjIEluIGNhc2UgY29ubmVjdGlvbiBpcyByZWZ1c2VkLgorICAgICAgICBpZiBleGMuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICBlcnJvcl9tc2coJ3dhcyByZWZ1c2VkJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKIAogICAgIHNzID0gc29ja2V0LnNzbChzKQogICAgICMgUmVhZCBwYXJ0IG9mIHJldHVybiB3ZWxjb21lIGJhbm5lciB0d2ljZS4KQEAgLTcxLDcgKzgxLDcgQEAKICAgICAgICAgcmV0dXJuCiAKICAgICAjIFNvbWUgcmFuZG9tIHBvcnQgdG8gY29ubmVjdCB0by4KLSAgICBQT1JUID0gOTkzNAorICAgIFBPUlQgPSBbOTkzNF0KIAogICAgIGxpc3RlbmVyX3JlYWR5ID0gdGhyZWFkaW5nLkV2ZW50KCkKICAgICBsaXN0ZW5lcl9nb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKQEAgLTgyLDcgKzkyLDcgQEAKICAgICAjIGtub3cgdGhlIHNvY2tldCBpcyBnb25lLgogICAgIGRlZiBsaXN0ZW5lcigpOgogICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCi0gICAgICAgIHMuYmluZCgoJycsIFBPUlQpKQorICAgICAgICBQT1JUWzBdID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzLCAnJywgUE9SVFswXSkKICAgICAgICAgcy5saXN0ZW4oNSkKICAgICAgICAgbGlzdGVuZXJfcmVhZHkuc2V0KCkKICAgICAgICAgcy5hY2NlcHQoKQpAQCAtOTIsNyArMTAyLDcgQEAKICAgICBkZWYgY29ubmVjdG9yKCk6CiAgICAgICAgIGxpc3RlbmVyX3JlYWR5LndhaXQoKQogICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCi0gICAgICAgIHMuY29ubmVjdCgoJ2xvY2FsaG9zdCcsIFBPUlQpKQorICAgICAgICBzLmNvbm5lY3QoKCdsb2NhbGhvc3QnLCBQT1JUWzBdKSkKICAgICAgICAgbGlzdGVuZXJfZ29uZS53YWl0KCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3NsX3NvY2sgPSBzb2NrZXQuc3NsKHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CmluZGV4IDEyNDViYTUuLmRkNDUzMmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CkBAIC0xLDExICsxLDEzIEBACiAjIFRlc3Qgc3VpdGUgZm9yIFNvY2tldFNlcnZlci5weQogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgdmVyaWZ5LCBURVNURk4sIFRlc3RTa2lwcGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAodmVyYm9zZSwgdmVyaWZ5LCBURVNURk4sIFRlc3RTa2lwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXBfY2hpbGRyZW4pCiB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQogCiBmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgKgogaW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgdGltZQogaW1wb3J0IHRocmVhZGluZwpAQCAtNzcsNiArNzksMTEgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogY3JlYXRpbmcgc2VydmVyIgogICAgICAgICBzdnIgPSBzdnJjbHMoc2VsZi5fX2FkZHIsIHNlbGYuX19oZGxyY2xzKQorICAgICAgICAjIHB1bGwgdGhlIGFkZHJlc3Mgb3V0IG9mIHRoZSBzZXJ2ZXIgaW4gY2FzZSBpdCBjaGFuZ2VkCisgICAgICAgICMgdGhpcyBjYW4gaGFwcGVuIGlmIGFub3RoZXIgcHJvY2VzcyBpcyB1c2luZyB0aGUgcG9ydAorICAgICAgICBhZGRyID0gZ2V0YXR0cihzdnIsICdzZXJ2ZXJfYWRkcmVzcycpCisgICAgICAgIGlmIGFkZHI6CisgICAgICAgICAgICBzZWxmLl9fYWRkciA9IGFkZHIKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogc2VydmluZyB0aHJlZSB0aW1lcyIKICAgICAgICAgc3ZyLnNlcnZlX2FfZmV3KCkKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogZG9uZSIKQEAgLTEzNiw3ICsxNDMsMjUgQEAKICAgICAgICAgdC5qb2luKCkKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgImRvbmUiCiAKLXRjcHNlcnZlcnMgPSBbVENQU2VydmVyLCBUaHJlYWRpbmdUQ1BTZXJ2ZXJdCitjbGFzcyBGb3JnaXZpbmdUQ1BTZXJ2ZXIoVENQU2VydmVyKToKKyAgICAjIHByZXZlbnQgZXJyb3JzIGlmIGFub3RoZXIgcHJvY2VzcyBpcyB1c2luZyB0aGUgcG9ydCB3ZSB3YW50CisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICBob3N0LCBkZWZhdWx0X3BvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzCisgICAgICAgICMgdGhpcyBjb2RlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0CisgICAgICAgICMgdGhlIHBvcnRzIHdlcmUgY2hhbmdlZCB0byBwcm90ZWN0IHRoZSBpbm5vY2VudAorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGZvciBwb3J0IGluIFtkZWZhdWx0X3BvcnQsIDM0MzQsIDg3OTgsIDIzODMzXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9hZGRyZXNzID0gaG9zdCwgcG9ydAorICAgICAgICAgICAgICAgIFRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICAgICAgICAgIGlmIGVyciAhPSBlcnJuby5FQUREUklOVVNFOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sIFwKKyAgICAgICAgICAgICAgICAgICAgJyAgV0FSTklORzogZmFpbGVkIHRvIGxpc3RlbiBvbiBwb3J0ICVkLCB0cnlpbmcgYW5vdGhlcicgJSBwb3J0CisKK3RjcHNlcnZlcnMgPSBbRm9yZ2l2aW5nVENQU2VydmVyLCBUaHJlYWRpbmdUQ1BTZXJ2ZXJdCiBpZiBoYXNhdHRyKG9zLCAnZm9yaycpIGFuZCBvcy5uYW1lIG5vdCBpbiAoJ29zMicsKToKICAgICB0Y3BzZXJ2ZXJzLmFwcGVuZChGb3JraW5nVENQU2VydmVyKQogdWRwc2VydmVycyA9IFtVRFBTZXJ2ZXIsIFRocmVhZGluZ1VEUFNlcnZlcl0KQEAgLTE3NSw2ICsyMDAsNyBAQAogICAgICAgICB0ZXN0YWxsKCkKICAgICBmaW5hbGx5OgogICAgICAgICBjbGVhbnVwKCkKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCBhYTQ1OGU2Li42NmZkNjY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtMTUsOSArMTUsMTEgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBQWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcgPSAwCiAgICAgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgPSAxCisgICAgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSA9IDIKIGVsc2U6Ci0gICAgUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HID0gX3N0cnVjdC5fUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HCi0gICAgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgPSBfc3RydWN0Ll9QWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORworICAgIFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyA9IGdldGF0dHIoX3N0cnVjdCwgJ19QWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcnLCAwKQorICAgIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HID0gZ2V0YXR0cihfc3RydWN0LCAnX1BZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HJywgMCkKKyAgICBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFID0gZ2V0YXR0cihfc3RydWN0LCAnX1BZX1NUUlVDVF9GTE9BVF9DT0VSQ0UnLCAwKQogCiBkZWYgc3RyaW5nX3JldmVyc2Uocyk6CiAgICAgcmV0dXJuICIiLmpvaW4ocmV2ZXJzZWQocykpCkBAIC00NiwzMyArNDgsNDAgQEAKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZGlkIG5vdCByYWlzZSBlcnJvciIgJSAoCiAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQogCi1kZWYgZGVwcmVjYXRlZF9lcnIoZnVuYywgKmFyZ3MpOgotICAgICMgVGhlIGB3YXJuaW5nc2AgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhbiBhZHZlcnRpc2VkIHdheSB0byByZXN0b3JlCi0gICAgIyBpdHMgZmlsdGVyIGxpc3QuICBDaGVhdC4KLSAgICBzYXZlX3dhcm5pbmdzX2ZpbHRlcnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCi0gICAgIyBHcnJyLCB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gd2FybiBldmVyeSB0aW1lLiAgV2l0aG91dCByZW1vdmluZwotICAgICMgdGhlIHdhcm5pbmdyZWdpc3RyeSwgcnVubmluZyB0ZXN0X3RhcmZpbGUgdGhlbiB0ZXN0X3N0cnVjdCB3b3VsZCBmYWlsCi0gICAgIyBvbiA2NC1iaXQgcGxhdGZvcm1zLgotICAgIGdsb2JhbHMgPSBmdW5jLmZ1bmNfZ2xvYmFscwotICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzOgotICAgICAgICBkZWwgZ2xvYmFsc1snX193YXJuaW5ncmVnaXN0cnlfXyddCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgciIiIl5zdHJ1Y3QuKiIiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiIuKmZvcm1hdCByZXF1aXJlcy4qIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICB0cnk6CitkZWYgd2l0aF93YXJuaW5nX3Jlc3RvcmUoZnVuYyk6CisgICAgZGVmIF93aXRoX3dhcm5pbmdfcmVzdG9yZSgqYXJncywgKiprdyk6CisgICAgICAgICMgVGhlIGB3YXJuaW5nc2AgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhbiBhZHZlcnRpc2VkIHdheSB0byByZXN0b3JlCisgICAgICAgICMgaXRzIGZpbHRlciBsaXN0LiAgQ2hlYXQuCisgICAgICAgIHNhdmVfd2FybmluZ3NfZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICAgICAgIyBHcnJyLCB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gd2FybiBldmVyeSB0aW1lLiAgV2l0aG91dCByZW1vdmluZworICAgICAgICAjIHRoZSB3YXJuaW5ncmVnaXN0cnksIHJ1bm5pbmcgdGVzdF90YXJmaWxlIHRoZW4gdGVzdF9zdHJ1Y3Qgd291bGQgZmFpbAorICAgICAgICAjIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCisgICAgICAgIGdsb2JhbHMgPSBmdW5jLmZ1bmNfZ2xvYmFscworICAgICAgICBpZiAnX193YXJuaW5ncmVnaXN0cnlfXycgaW4gZ2xvYmFsczoKKyAgICAgICAgICAgIGRlbCBnbG9iYWxzWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgciIiIl5zdHJ1Y3QuKiIiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCByIiIiLipmb3JtYXQgcmVxdWlyZXMuKiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmdW5jKCphcmdzKQotICAgICAgICBleGNlcHQgKHN0cnVjdC5lcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKLSAgICAgICAgICAgIGlmIG5vdCBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORzoKLSAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBleHBlY3RlZCB0byByYWlzZSBzdHJ1Y3QuZXJyb3IiICUgKAotICAgICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZGlkIG5vdCByYWlzZSBlcnJvciIgJSAoCisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlX3dhcm5pbmdzX2ZpbHRlcnNbOl0KKyAgICByZXR1cm4gX3dpdGhfd2FybmluZ19yZXN0b3JlCisKK2RlZiBkZXByZWNhdGVkX2VycihmdW5jLCAqYXJncyk6CisgICAgdHJ5OgorICAgICAgICBmdW5jKCphcmdzKQorICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKKyAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZXhwZWN0ZWQgdG8gcmFpc2Ugc3RydWN0LmVycm9yIiAlICgKICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlX3dhcm5pbmdzX2ZpbHRlcnNbOl0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBkaWQgbm90IHJhaXNlIGVycm9yIiAlICgKKyAgICAgICAgICAgIGZ1bmMuX19uYW1lX18sIGFyZ3MpCitkZXByZWNhdGVkX2VyciA9IHdpdGhfd2FybmluZ19yZXN0b3JlKGRlcHJlY2F0ZWRfZXJyKQorCiAKIHNpbXBsZV9lcnIoc3RydWN0LmNhbGNzaXplLCAnWicpCiAKQEAgLTQ3NSw2ICs0ODQsOSBAQAogCiB0ZXN0XzcwNTgzNigpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTRiBidWcgMTIyOTM4MC4gTm8gc3RydWN0LnBhY2sgZXhjZXB0aW9uIGZvciBzb21lIG91dCBvZiByYW5nZSBpbnRlZ2VycworCiBkZWYgdGVzdF8xMjI5MzgwKCk6CiAgICAgaW1wb3J0IHN5cwogICAgIGZvciBlbmRpYW4gaW4gKCcnLCAnPicsICc8Jyk6CkBAIC00OTEsNiArNTAzLDM3IEBACiBpZiBQWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkc6CiAgICAgdGVzdF8xMjI5MzgwKCkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNGIGJ1ZyAxNTMwNTU5LiBzdHJ1Y3QucGFjayByYWlzZXMgVHlwZUVycm9yIHdoZXJlIGl0IHVzZWQgdG8gY29udmVydC4KKworZGVmIGNoZWNrX2Zsb2F0X2NvZXJjZShmb3JtYXQsIG51bWJlcik6CisgICAgaWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSA9PSAyOgorICAgICAgICAjIFRlc3QgZm9yIHByZS0yLjUgc3RydWN0IG1vZHVsZQorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjayhmb3JtYXQsIG51bWJlcikKKyAgICAgICAgZmxvb3JlZCA9IHN0cnVjdC51bnBhY2soZm9ybWF0LCBwYWNrZWQpWzBdCisgICAgICAgIGlmIGZsb29yZWQgIT0gaW50KG51bWJlcik6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJkaWQgbm90IGNvcnJlY2x5IGNvZXJjZSBmbG9hdCB0byBpbnQiKQorICAgICAgICByZXR1cm4KKyAgICB0cnk6CisgICAgICAgIGZ1bmMoKmFyZ3MpCisgICAgZXhjZXB0IChzdHJ1Y3QuZXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgIGlmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0U6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCBEZXByZWNhdGlvbldhcm5pbmcgZm9yIGZsb2F0IGNvZXJjZSIpCisgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKKyAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0U6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCB0byByYWlzZSBzdHJ1Y3QuZXJyb3IgZm9yIGZsb2F0IGNvZXJjZSIpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZGlkIG5vdCByYWlzZSBlcnJvciBmb3IgZmxvYXQgY29lcmNlIikKKworY2hlY2tfZmxvYXRfY29lcmNlID0gd2l0aF93YXJuaW5nX3Jlc3RvcmUoZGVwcmVjYXRlZF9lcnIpCisKK2RlZiB0ZXN0XzE1MzA1NTkoKToKKyAgICBmb3IgZW5kaWFuIGluICgnJywgJz4nLCAnPCcpOgorICAgICAgICBmb3IgZm10IGluICgnQicsICdIJywgJ0knLCAnTCcsICdiJywgJ2gnLCAnaScsICdsJyk6CisgICAgICAgICAgICBjaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjApCisgICAgICAgICAgICBjaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjUpCisKK3Rlc3RfMTUzMDU1OSgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQYWNraW5nIGFuZCB1bnBhY2tpbmcgdG8vZnJvbSBidWZmZXJzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGVkZjViZDAuLjhjOGFjNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTI3LDYgKzI3LDE4IEBACiAgICAgcmV0dXJuIHJlLnN1YihyIlxbXGQrIHJlZnNcXVxyP1xuPyQiLCAiIiwgc3RkZXJyKQogCiBjbGFzcyBQcm9jZXNzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB3ZSBoYXZlIHNvIHRoaXMgdGVzdAorICAgICAgICAjIGRvZXNuJ3QgY3Jhc2ggb24gc29tZSBidWlsZGJvdHMgKEFscGhhcyBpbiBwYXJ0aWN1bGFyKS4KKyAgICAgICAgaWYgaGFzYXR0cih0ZXN0X3N1cHBvcnQsICJyZWFwX2NoaWxkcmVuIik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gd2UgaGF2ZSBzbyB0aGlzIHRlc3QKKyAgICAgICAgIyBkb2Vzbid0IGNyYXNoIG9uIHNvbWUgYnVpbGRib3RzIChBbHBoYXMgaW4gcGFydGljdWxhcikuCisgICAgICAgIGlmIGhhc2F0dHIodGVzdF9zdXBwb3J0LCAicmVhcF9jaGlsZHJlbiIpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCiAgICAgZGVmIG1rc3RlbXAoc2VsZik6CiAgICAgICAgICIiIndyYXBwZXIgZm9yIG1rc3RlbXAsIGNhbGxpbmcgbWt0ZW1wIGlmIG1rc3RlbXAgaXMgbm90IGF2YWlsYWJsZSIiIgogICAgICAgICBpZiBoYXNhdHRyKHRlbXBmaWxlLCAibWtzdGVtcCIpOgpAQCAtNTYsNyArNjgsNyBAQAogICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdKQogICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXJybm8sIDQ3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnJldHVybmNvZGUsIDQ3KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBDYWxsZWRQcm9jZXNzRXJyb3IiKQogCkBAIC0zODQsNyArMzk2LDggQEAKIAogICAgIGRlZiB0ZXN0X25vX2xlYWtpbmcoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHdlIGxlYWsgbm8gcmVzb3VyY2VzCi0gICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJzdWJwcm9jZXNzIikgYW5kIG5vdCBtc3dpbmRvd3M6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHRlc3Rfc3VwcG9ydCwgImlzX3Jlc291cmNlX2VuYWJsZWQiKSBcCisgICAgICAgICAgICAgICBvciB0ZXN0X3N1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgic3VicHJvY2VzcyIpIGFuZCBub3QgbXN3aW5kb3dzOgogICAgICAgICAgICAgbWF4X2hhbmRsZXMgPSAxMDI2ICMgdG9vIG11Y2ggZm9yIG1vc3QgVU5JWCBzeXN0ZW1zCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtYXhfaGFuZGxlcyA9IDY1CkBAIC00NjMsMTAgKzQ3NiwzNiBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIE9TRXJyb3IiKQogCisgICAgICAgIGRlZiBfc3VwcHJlc3NfY29yZV9maWxlcyhzZWxmKToKKyAgICAgICAgICAgICIiIlRyeSB0byBwcmV2ZW50IGNvcmUgZmlsZXMgZnJvbSBiZWluZyBjcmVhdGVkLgorICAgICAgICAgICAgUmV0dXJucyBwcmV2aW91cyB1bGltaXQgaWYgc3VjY2Vzc2Z1bCwgZWxzZSBOb25lLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgICAgICAgICAgb2xkX2xpbWl0ID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFKQorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgKDAsMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9sZF9saW1pdAorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZGVmIF91bnN1cHByZXNzX2NvcmVfZmlsZXMoc2VsZiwgb2xkX2xpbWl0KToKKyAgICAgICAgICAgICIiIlJldHVybiBjb3JlIGZpbGUgYmVoYXZpb3IgdG8gZGVmYXVsdC4iIiIKKyAgICAgICAgICAgIGlmIG9sZF9saW1pdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCByZXNvdXJjZQorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgb2xkX2xpbWl0KQorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIGRlZiB0ZXN0X3J1bl9hYm9ydChzZWxmKToKICAgICAgICAgICAgICMgcmV0dXJuY29kZSBoYW5kbGVzIHNpZ25hbCB0ZXJtaW5hdGlvbgotICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbXBvcnQgb3M7IG9zLmFib3J0KCkiXSkKKyAgICAgICAgICAgIG9sZF9saW1pdCA9IHNlbGYuX3N1cHByZXNzX2NvcmVfZmlsZXMoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCBvczsgb3MuYWJvcnQoKSJdKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN1cHByZXNzX2NvcmVfZmlsZXMob2xkX2xpbWl0KQogICAgICAgICAgICAgcC53YWl0KCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXAucmV0dXJuY29kZSwgc2lnbmFsLlNJR0FCUlQpCiAKQEAgLTU5OSw2ICs2MzgsOCBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQcm9jZXNzVGVzdENhc2UpCisgICAgaWYgaGFzYXR0cih0ZXN0X3N1cHBvcnQsICJyZWFwX2NoaWxkcmVuIik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IDJkMDhmNGQuLmE5ZDVkYWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTg5LDYgKzg5LDI0IEBACiAgICAgICAgICAgICBtc2cgPSAiVXNlIG9mIHRoZSBgJXMnIHJlc291cmNlIG5vdCBlbmFibGVkIiAlIHJlc291cmNlCiAgICAgICAgIHJhaXNlIFJlc291cmNlRGVuaWVkKG1zZykKIAorZGVmIGJpbmRfcG9ydChzb2NrLCBob3N0PScnLCBwcmVmZXJyZWRfcG9ydD01NDMyMSk6CisgICAgIiIiVHJ5IHRvIGJpbmQgdGhlIHNvY2sgdG8gYSBwb3J0LiAgSWYgd2UgYXJlIHJ1bm5pbmcgbXVsdGlwbGUKKyAgICB0ZXN0cyBhbmQgd2UgZG9uJ3QgdHJ5IG11bHRpcGxlIHBvcnRzLCB0aGUgdGVzdCBjYW4gZmFpbHMuICBUaGlzCisgICAgbWFrZXMgdGhlIHRlc3QgbW9yZSByb2J1c3QuIiIiCisKKyAgICBpbXBvcnQgc29ja2V0LCBlcnJubworICAgICMgc29tZSByYW5kb20gcG9ydHMgdGhhdCBob3BlZnVsbHkgbm8gb25lIGlzIGxpc3RlbmluZyBvbi4KKyAgICBmb3IgcG9ydCBpbiBbcHJlZmVycmVkX3BvcnQsIDk5MDcsIDEwMjQzLCAzMjk5OV06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgcG9ydCkpCisgICAgICAgICAgICByZXR1cm4gcG9ydAorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICAgICAgaWYgZXJyICE9IGVycm5vLkVBRERSSU5VU0U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sIFwKKyAgICAgICAgICAgICAgICAnICBXQVJOSU5HOiBmYWlsZWQgdG8gbGlzdGVuIG9uIHBvcnQgJWQsIHRyeWluZyBhbm90aGVyJyAlIHBvcnQKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAndW5hYmxlIHRvIGZpbmQgcG9ydCB0byBsaXN0ZW4gb24nCisKIEZVWlogPSAxZS02CiAKIGRlZiBmY21wKHgsIHkpOiAjIGZ1enp5IGNvbXBhcmlzb24gZnVuY3Rpb24KQEAgLTI5Niw2ICszMTQsMTIgQEAKIF8xRyA9IDEwMjQgKiBfMU0KIF8yRyA9IDIgKiBfMUcKIAorIyBIYWNrIHRvIGdldCBhdCB0aGUgbWF4aW11bSB2YWx1ZSBhbiBpbnRlcm5hbCBpbmRleCBjYW4gdGFrZS4KK2NsYXNzIF9EdW1teToKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICByZXR1cm4gagorTUFYX1B5X3NzaXplX3QgPSBfRHVtbXkoKVs6XQorCiBkZWYgc2V0X21lbWxpbWl0KGxpbWl0KToKICAgICBpbXBvcnQgcmUKICAgICBnbG9iYWwgbWF4X21lbXVzZQpAQCAtMzEwLDcgKzMzNCw5IEBACiAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIG1lbW9yeSBsaW1pdCAlcicgJSAobGltaXQsKSkKICAgICBtZW1saW1pdCA9IGludChmbG9hdChtLmdyb3VwKDEpKSAqIHNpemVzW20uZ3JvdXAoMykubG93ZXIoKV0pCi0gICAgaWYgbWVtbGltaXQgPCAyLjUqXzFHOgorICAgIGlmIG1lbWxpbWl0ID4gTUFYX1B5X3NzaXplX3Q6CisgICAgICAgIG1lbWxpbWl0ID0gTUFYX1B5X3NzaXplX3QKKyAgICBpZiBtZW1saW1pdCA8IF8yRyAtIDE6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01lbW9yeSBsaW1pdCAlciB0b28gbG93IHRvIGJlIHVzZWZ1bCcgJSAobGltaXQsKSkKICAgICBtYXhfbWVtdXNlID0gbWVtbGltaXQKIApAQCAtMzUzLDYgKzM3OSwxNyBAQAogICAgICAgICByZXR1cm4gd3JhcHBlcgogICAgIHJldHVybiBkZWNvcmF0b3IKIAorZGVmIGJpZ2FkZHJzcGFjZXRlc3QoZik6CisgICAgIiIiRGVjb3JhdG9yIGZvciB0ZXN0cyB0aGF0IGZpbGwgdGhlIGFkZHJlc3Mgc3BhY2UuIiIiCisgICAgZGVmIHdyYXBwZXIoc2VsZik6CisgICAgICAgIGlmIG1heF9tZW11c2UgPCBNQVhfUHlfc3NpemVfdDoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU2tpcHBpbmcgJXMgYmVjYXVzZSBvZiBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbnRcbiIgJSAoZi5fX25hbWVfXywpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGYoc2VsZikKKyAgICByZXR1cm4gd3JhcHBlcgorCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgUHJlbGltaW5hcnkgUHlVTklUIGludGVncmF0aW9uLgogCkBAIC00MzUsMyArNDcyLDQ2IEBACiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ2RvY3Rlc3QgKCVzKSAuLi4gJWQgdGVzdHMgd2l0aCB6ZXJvIGZhaWx1cmVzJyAlIChtb2R1bGUuX19uYW1lX18sIHQpCiAgICAgcmV0dXJuIGYsIHQKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRocmVhZGluZyBzdXBwb3J0IHRvIHByZXZlbnQgcmVwb3J0aW5nIHJlZmxlYWtzIHdoZW4gcnVubmluZyByZWdydGVzdC5weSAtUgorCitkZWYgdGhyZWFkaW5nX3NldHVwKCk6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIHJldHVybiBsZW4odGhyZWFkaW5nLl9hY3RpdmUpLCBsZW4odGhyZWFkaW5nLl9saW1ibykKKworZGVmIHRocmVhZGluZ19jbGVhbnVwKG51bV9hY3RpdmUsIG51bV9saW1ibyk6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIGltcG9ydCB0aW1lCisKKyAgICBfTUFYX0NPVU5UID0gMTAKKyAgICBjb3VudCA9IDAKKyAgICB3aGlsZSBsZW4odGhyZWFkaW5nLl9hY3RpdmUpICE9IG51bV9hY3RpdmUgYW5kIGNvdW50IDwgX01BWF9DT1VOVDoKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgIGNvdW50ID0gMAorICAgIHdoaWxlIGxlbih0aHJlYWRpbmcuX2xpbWJvKSAhPSBudW1fbGltYm8gYW5kIGNvdW50IDwgX01BWF9DT1VOVDoKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworZGVmIHJlYXBfY2hpbGRyZW4oKToKKyAgICAiIiJVc2UgdGhpcyBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIHRlc3RfbWFpbigpIHdoZW5ldmVyIHN1Yi1wcm9jZXNzZXMKKyAgICBhcmUgc3RhcnRlZC4gIFRoaXMgd2lsbCBoZWxwIGVuc3VyZSB0aGF0IG5vIGV4dHJhIGNoaWxkcmVuICh6b21iaWVzKQorICAgIHN0aWNrIGFyb3VuZCB0byBob2cgcmVzb3VyY2VzIGFuZCBjcmVhdGUgcHJvYmxlbXMgd2hlbiBsb29raW5nCisgICAgZm9yIHJlZmxlYWtzLgorICAgICIiIgorCisgICAgIyBSZWFwIGFsbCBvdXIgZGVhZCBjaGlsZCBwcm9jZXNzZXMgc28gd2UgZG9uJ3QgbGVhdmUgem9tYmllcyBhcm91bmQuCisgICAgIyBUaGVzZSBob2cgcmVzb3VyY2VzIGFuZCBtaWdodCBiZSBjYXVzaW5nIHNvbWUgb2YgdGhlIGJ1aWxkYm90cyB0byBkaWUuCisgICAgaW1wb3J0IG9zCisgICAgaWYgaGFzYXR0cihvcywgJ3dhaXRwaWQnKToKKyAgICAgICAgYW55X3Byb2Nlc3MgPSAtMQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBXaW5kb3dzLiAgVGhhdCdzIG9rLgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChhbnlfcHJvY2Vzcywgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCBhZTJhMWM4Li5mMWYxNTI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMjM3LDYgKzIzNyw5MCBAQAogICAgICAgICAgICAgaXMgc3lzLl9nZXRmcmFtZSgpLmZfY29kZQogICAgICAgICApCiAKKyAgICAjIHN5cy5fY3VycmVudF9mcmFtZXMoKSBpcyBhIENQeXRob24tb25seSBnaW1taWNrLgorICAgIGRlZiB0ZXN0X2N1cnJlbnRfZnJhbWVzKHNlbGYpOgorICAgICAgICBoYXZlX3RocmVhZHMgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaGF2ZV90aHJlYWRzID0gRmFsc2UKKworICAgICAgICBpZiBoYXZlX3RocmVhZHM6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhfdGhyZWFkcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhvdXRfdGhyZWFkcygpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIGluIGEgV0lUSF9USFJFQURTIGJ1aWxkLgorICAgIGRlZiBjdXJyZW50X2ZyYW1lc193aXRoX3RocmVhZHMoc2VsZik6CisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcsIHRocmVhZAorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisKKyAgICAgICAgIyBTcGF3biBhIHRocmVhZCB0aGF0IGJsb2NrcyBhdCBhIGtub3duIHBsYWNlLiAgVGhlbiB0aGUgbWFpbgorICAgICAgICAjIHRocmVhZCBkb2VzIHN5cy5fY3VycmVudF9mcmFtZXMoKSwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlIGZyYW1lcworICAgICAgICAjIHJldHVybmVkIG1ha2Ugc2Vuc2UuCisgICAgICAgIGVudGVyZWRfZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGxlYXZlX2cgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB0aHJlYWRfaW5mbyA9IFtdICAjIHRoZSB0aHJlYWQncyBpZAorCisgICAgICAgIGRlZiBmMTIzKCk6CisgICAgICAgICAgICBnNDU2KCkKKworICAgICAgICBkZWYgZzQ1NigpOgorICAgICAgICAgICAgdGhyZWFkX2luZm8uYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKKyAgICAgICAgICAgIGVudGVyZWRfZy5zZXQoKQorICAgICAgICAgICAgbGVhdmVfZy53YWl0KCkKKworICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZjEyMykKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGVudGVyZWRfZy53YWl0KCkKKworICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIHQgaGFzIGZpbmlzaGVkIGl0cyBlbnRlcmVkX2cuc2V0KCksIGFsdGhvdWdoIGl0J3MKKyAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGd1ZXNzIHdoZXRoZXIgaXQncyBzdGlsbCBvbiB0aGF0IGxpbmUgb3IgaGFzIG1vdmVkIG9uCisgICAgICAgICMgdG8gaXRzIGxlYXZlX2cud2FpdCgpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0aHJlYWRfaW5mbyksIDEpCisgICAgICAgIHRocmVhZF9pZCA9IHRocmVhZF9pbmZvWzBdCisKKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorCisgICAgICAgIG1haW5faWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1haW5faWQgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRocmVhZF9pZCBpbiBkKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIG1haW4tdGhyZWFkIGZyYW1lIGlzIF90aGlzXyBmcmFtZS4KKyAgICAgICAgZnJhbWUgPSBkLnBvcChtYWluX2lkKQorICAgICAgICBzZWxmLmFzc2VydF8oZnJhbWUgaXMgc3lzLl9nZXRmcmFtZSgpKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIHRocmVhZCBmcmFtZSBpcyBibG9ja2VkIGluIGc0NTYsIGNhbGxlZAorICAgICAgICAjIGZyb20gZjEyMy4gIFRoaXMgaXMgYSBsaXR0ZSB0cmlja3ksIHNpbmNlIHZhcmlvdXMgYml0cyBvZgorICAgICAgICAjIHRocmVhZGluZy5weSBhcmUgYWxzbyBpbiB0aGUgdGhyZWFkJ3MgY2FsbCBzdGFjay4KKyAgICAgICAgZnJhbWUgPSBkLnBvcCh0aHJlYWRfaWQpCisgICAgICAgIHN0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soZnJhbWUpCisgICAgICAgIGZvciBpLCAoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIHNvdXJjZWxpbmUpIGluIGVudW1lcmF0ZShzdGFjayk6CisgICAgICAgICAgICBpZiBmdW5jbmFtZSA9PSAiZjEyMyI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IGZpbmQgZjEyMygpIG9uIHRocmVhZCdzIGNhbGwgc3RhY2siKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cmNlbGluZSwgImc0NTYoKSIpCisKKyAgICAgICAgIyBBbmQgdGhlIG5leHQgcmVjb3JkIG11c3QgYmUgZm9yIGc0NTYoKS4KKyAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIHNvdXJjZWxpbmUgPSBzdGFja1tpKzFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuY25hbWUsICJnNDU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNvdXJjZWxpbmUgaW4gWyJsZWF2ZV9nLndhaXQoKSIsICJlbnRlcmVkX2cuc2V0KCkiXSkKKworICAgICAgICAjIFJlYXAgdGhlIHNwYXduZWQgdGhyZWFkLgorICAgICAgICBsZWF2ZV9nLnNldCgpCisgICAgICAgIHQuam9pbigpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIHdoZW4gdGhyZWFkIHN1cHBvcnQgZG9lc24ndCBleGlzdC4KKyAgICBkZWYgY3VycmVudF9mcmFtZXNfd2l0aG91dF90aHJlYWRzKHNlbGYpOgorICAgICAgICAjIE5vdCBtdWNoIGhhcHBlbnMgaGVyZTogIHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCwgd2l0aCBhcnRpZmljaWFsCisgICAgICAgICMgInRocmVhZCBpZCIgMC4KKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKDAgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRbMF0gaXMgc3lzLl9nZXRmcmFtZSgpKQorCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmFwaV92ZXJzaW9uLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuYXJndiwgbGlzdCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RjbC5weSBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CmluZGV4IGUzZmJmOTguLmZhMTcwZWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CkBAIC0xMzAsMTAgKzEzMCw4IEBACiAgICAgICAgIGltcG9ydCBvcwogICAgICAgICBvbGRfZGlzcGxheSA9IE5vbmUKICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBpZiAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpIG9yCi0gICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2RhcndpbicpIG9yCi0gICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2N5Z3dpbicpKToKLSAgICAgICAgICAgIHJldHVybiAjIG5vIGZhaWx1cmUgcG9zc2libGUgb24gd2luZG93cz8KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCd3aW4nLCAnZGFyd2luJywgJ2N5Z3dpbicpKToKKyAgICAgICAgICAgIHJldHVybiAgIyBubyBmYWlsdXJlIHBvc3NpYmxlIG9uIHdpbmRvd3M/CiAgICAgICAgIGlmICdESVNQTEFZJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgb2xkX2Rpc3BsYXkgPSBvcy5lbnZpcm9uWydESVNQTEFZJ10KICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWydESVNQTEFZJ10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkgYi9MaWIvdGVzdC90ZXN0X3RleHR3cmFwLnB5CmluZGV4IDY4ZTRkNmQuLjUwMGVjZWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZXh0d3JhcC5weQpAQCAtNDYwLDM4ICs0NjAsNDIgQEAKICMgb2YgSW5kZW50VGVzdENhc2UhCiBjbGFzcyBEZWRlbnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKKyAgICBkZWYgYXNzZXJ0VW5jaGFuZ2VkKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJhc3NlcnQgdGhhdCBkZWRlbnQoKSBoYXMgbm8gZWZmZWN0IG9uICd0ZXh0JyIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXh0LCBkZWRlbnQodGV4dCkpCisKICAgICBkZWYgdGVzdF9kZWRlbnRfbm9tYXJnaW4oc2VsZik6CiAgICAgICAgICMgTm8gbGluZXMgaW5kZW50ZWQuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5Ib3cgYXJlIHlvdT9cbk9oIGdvb2QsIEknbSBnbGFkLiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQogCiAgICAgICAgICMgU2ltaWxhciwgd2l0aCBhIGJsYW5rIGxpbmUuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5cbkJvbyEiCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKIAogICAgICAgICAjIFNvbWUgbGluZXMgaW5kZW50ZWQsIGJ1dCBvdmVyYWxsIG1hcmdpbiBpcyBzdGlsbCB6ZXJvLgogICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuICBUaGlzIGlzIGluZGVudGVkLiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQogCiAgICAgICAgICMgQWdhaW4sIGFkZCBhIGJsYW5rIGxpbmUuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5cbiAgQm9vIVxuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCiAKICAgICBkZWYgdGVzdF9kZWRlbnRfZXZlbihzZWxmKToKICAgICAgICAgIyBBbGwgbGluZXMgaW5kZW50ZWQgYnkgdHdvIHNwYWNlcy4KICAgICAgICAgdGV4dCA9ICIgIEhlbGxvIHRoZXJlLlxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLiIKICAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuSG93IGFyZSB5YT9cbk9oIGdvb2QuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICAgICAgIyBTYW1lLCB3aXRoIGJsYW5rIGxpbmVzLgogICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG5cbiAgSG93IGFyZSB5YT9cbiAgT2ggZ29vZC5cbiIKICAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC5cbiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCiAgICAgICAgICMgTm93IGluZGVudCBvbmUgb2YgdGhlIGJsYW5rIGxpbmVzLgogICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG4gIFxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLlxuIgogICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLlxuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICBkZWYgdGVzdF9kZWRlbnRfdW5ldmVuKHNlbGYpOgogICAgICAgICAjIExpbmVzIGluZGVudGVkIHVuZXZlbmx5LgpAQCAtNTA1LDE4ICs1MDksNTMgQEAKICAgICB3aGlsZSAxOgogICAgICAgICByZXR1cm4gZm9vCiAnJycKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCiAgICAgICAgICMgVW5ldmVuIGluZGVudGF0aW9uIHdpdGggYSBibGFuayBsaW5lLgogICAgICAgICB0ZXh0ID0gIiAgRm9vXG4gICAgQmFyXG5cbiAgIEJhelxuIgogICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAogICAgICAgICAjIFVuZXZlbiBpbmRlbnRhdGlvbiB3aXRoIGEgd2hpdGVzcGFjZS1vbmx5IGxpbmUuCiAgICAgICAgIHRleHQgPSAiICBGb29cbiAgICBCYXJcbiBcbiAgIEJhelxuIgogICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAorICAgICMgZGVkZW50KCkgc2hvdWxkIG5vdCBtYW5nbGUgaW50ZXJuYWwgdGFicworICAgIGRlZiB0ZXN0X2RlZGVudF9wcmVzZXJ2ZV9pbnRlcm5hbF90YWJzKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiAgaGVsbG9cdHRoZXJlXG4gIGhvdyBhcmVcdHlvdT8iCisgICAgICAgIGV4cGVjdCA9ICJoZWxsb1x0dGhlcmVcbmhvdyBhcmVcdHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgaXQgcHJlc2VydmVzIHRhYnMgd2hlbiBpdCdzIG5vdCBtYWtpbmcgYW55CisgICAgICAgICMgY2hhbmdlcyBhdCBhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQoZXhwZWN0KSkKKworICAgICMgZGVkZW50KCkgc2hvdWxkIG5vdCBtYW5nbGUgdGFicyBpbiB0aGUgbWFyZ2luIChpLmUuCisgICAgIyB0YWJzIGFuZCBzcGFjZXMgYm90aCBjb3VudCBhcyBtYXJnaW4sIGJ1dCBhcmUgKm5vdCoKKyAgICAjIGNvbnNpZGVyZWQgZXF1aXZhbGVudCkKKyAgICBkZWYgdGVzdF9kZWRlbnRfcHJlc2VydmVfbWFyZ2luX3RhYnMoc2VsZik6CisgICAgICAgIHRleHQgPSAiICBoZWxsbyB0aGVyZVxuXHRob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCisKKyAgICAgICAgIyBzYW1lIGVmZmVjdCBldmVuIGlmIHdlIGhhdmUgOCBzcGFjZXMKKyAgICAgICAgdGV4dCA9ICIgICAgICAgIGhlbGxvIHRoZXJlXG5cdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIGRlZGVudCgpIG9ubHkgcmVtb3ZlcyB3aGl0ZXNwYWNlIHRoYXQgY2FuIGJlIHVuaWZvcm1seSByZW1vdmVkIQorICAgICAgICB0ZXh0ID0gIlx0aGVsbG8gdGhlcmVcblx0aG93IGFyZSB5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG8gdGhlcmVcbmhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0aGVsbG8gdGhlcmVcbiAgXHRob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgIHRleHQgPSAiICBcdCAgaGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0aGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgZXhwZWN0ID0gImhlbGxvIHRoZXJlXG4gIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWQucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQppbmRleCBlYTM0NWI2Li5jNGMyMWZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQpAQCAtMTE1LDMgKzExNSw0NiBAQAogICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHRhc2syLCAoaSwpKQogZG9uZS5hY3F1aXJlKCkKIHByaW50ICdhbGwgdGFza3MgZG9uZScKKworIyBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplCitwcmludCAnXG4qKiogQ2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUgKioqJworaWYgdGhyZWFkLnN0YWNrX3NpemUoKSAhPSAwOgorICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbml0aWFsIHN0YWNrX3NpemUgbm90IDAiCisKK3RocmVhZC5zdGFja19zaXplKDApCitpZiB0aHJlYWQuc3RhY2tfc2l6ZSgpICE9IDA6CisgICAgcmFpc2UgVmFsdWVFcnJvciwgInN0YWNrX3NpemUgbm90IHJlc2V0IHRvIGRlZmF1bHQiCisKK2Zyb20gb3MgaW1wb3J0IG5hbWUgYXMgb3NfbmFtZQoraWYgb3NfbmFtZSBpbiAoIm50IiwgIm9zMiIsICJwb3NpeCIpOgorCisgICAgdHNzX3N1cHBvcnRlZCA9IDEKKyAgICB0cnk6CisgICAgICAgIHRocmVhZC5zdGFja19zaXplKDQwOTYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50ICdjYXVnaHQgZXhwZWN0ZWQgVmFsdWVFcnJvciBzZXR0aW5nIHN0YWNrX3NpemUoNDA5NiknCisgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKKyAgICAgICAgdHNzX3N1cHBvcnRlZCA9IDAKKyAgICAgICAgcHJpbnQgJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnCisKKyAgICBpZiB0c3Nfc3VwcG9ydGVkOgorICAgICAgICBmYWlsZWQgPSBsYW1iZGEgcywgZTogcyAhPSBlCisgICAgICAgIGZhaWxfbXNnID0gInN0YWNrX3NpemUoJWQpIGZhaWxlZCAtIHNob3VsZCBzdWNjZWVkIgorICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwLCAwKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFja19zaXplKHRzcykKKyAgICAgICAgICAgIGlmIGZhaWxlZCh0aHJlYWQuc3RhY2tfc2l6ZSgpLCB0c3MpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIGZhaWxfbXNnICUgdHNzCisgICAgICAgICAgICBwcmludCAnc3VjY2Vzc2Z1bGx5IHNldCBzdGFja19zaXplKCVkKScgJSB0c3MKKworICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwKToKKyAgICAgICAgICAgIHByaW50ICd0cnlpbmcgc3RhY2tfc2l6ZSA9ICVkJyAlIHRzcworICAgICAgICAgICAgbmV4dF9pZGVudCA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG51bXRhc2tzKToKKyAgICAgICAgICAgICAgICBuZXd0YXNrKCkKKworICAgICAgICAgICAgcHJpbnQgJ3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZScKKyAgICAgICAgICAgIGRvbmUuYWNxdWlyZSgpCisgICAgICAgICAgICBwcmludCAnYWxsIHRhc2tzIGRvbmUnCisKKyAgICAgICAgIyByZXNldCBzdGFjayBzaXplIHRvIGRlZmF1bHQKKyAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKaW5kZXggMDY0MmQyNS4uNjAyYWQyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKQEAgLTMwLDExICszMCwxMCBAQAogICAgIGlmIHZlcmJvc2U6CiAgICAgICAgIHByaW50ICJ0ZXN0aW5nIGltcG9ydCBoYW5nZXJzIC4uLiIsCiAKLSAgICBmcm9tIHRlc3QgaW1wb3J0IHRocmVhZGVkX2ltcG9ydF9oYW5nZXJzCi0KKyAgICBpbXBvcnQgdGVzdC50aHJlYWRlZF9pbXBvcnRfaGFuZ2VycwogICAgIHRyeToKLSAgICAgICAgaWYgdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCh0aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnMpCisgICAgICAgIGlmIHRlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCh0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9ycykKICAgICAgICAgZWxpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIk9LLiIKICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5CmluZGV4IDQ1OWJhM2EuLjk3NDMzM2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkKQEAgLTIyLDcgKzIyLDcgQEAKIAogaW1wb3J0IHRocmVhZCAjIElmIHRoaXMgZmFpbHMsIHdlIGNhbid0IHRlc3QgdGhpcyBtb2R1bGUKIGltcG9ydCB0aHJlYWRpbmcKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIHRocmVhZGluZ19zZXR1cCwgdGhyZWFkaW5nX2NsZWFudXAKIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0cmFjZWJhY2sgaW1wb3J0IHByaW50X2V4YwogaW1wb3J0IHRlbXBmaWxlCkBAIC00OCw2ICs0OCw3IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0aHJlYWRzID0gW10KKyAgICB0aHJlYWRfaW5mbyA9IHRocmVhZGluZ19zZXR1cCgpCiAKICAgICBwcmludCAiQ3JlYXRpbmciCiAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1RIUkVBRFMpOgpAQCAtNzIsNiArNzMsNyBAQAogICAgIGlmIGVycm9yczoKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZChtc2cpCiAKKyAgICB0aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHN5cywgZ2V0b3B0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CmluZGV4IDdlYjk3NTguLjc5MzM1ZWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC04NSw2ICs4NSwzMiBAQAogICAgICAgICAgICAgcHJpbnQgJ2FsbCB0YXNrcyBkb25lJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bXJ1bm5pbmcuZ2V0KCksIDApCiAKKyAgICAjIHJ1biB3aXRoIGEgc21hbGwoaXNoKSB0aHJlYWQgc3RhY2sgc2l6ZSAoMjU2a0IpCisgICAgZGVmIHRlc3RfdmFyaW91c19vcHNfc21hbGxfc3RhY2soc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnd2l0aCAyNTZrQiB0aHJlYWQgc3RhY2sgc2l6ZS4uLicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMjYyMTQ0KQorICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlc3RfdmFyaW91c19vcHMoKQorICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgwKQorCisgICAgIyBydW4gd2l0aCBhIGxhcmdlIHRocmVhZCBzdGFjayBzaXplICgxTUIpCisgICAgZGVmIHRlc3RfdmFyaW91c19vcHNfbGFyZ2Vfc3RhY2soc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnd2l0aCAxTUIgdGhyZWFkIHN0YWNrIHNpemUuLi4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDB4MTAwMDAwKQorICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlc3RfdmFyaW91c19vcHMoKQorICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgwKQorCiAgICAgZGVmIHRlc3RfZm9yZWlnbl90aHJlYWQoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBhICJmb3JlaWduIiB0aHJlYWQgY2FuIHVzZSB0aGUgdGhyZWFkaW5nIG1vZHVsZS4KICAgICAgICAgZGVmIGYobXV0ZXgpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CmluZGV4IDc2OGU3YTAuLmY0YmU3NTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKQEAgLTM5LDkgKzM5LDkgQEAKIAogICAgIGRlZiB0ZXN0X3N0cmZ0aW1lX2JvdW5kc19jaGVja2luZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBzdHJmdGltZSgpIGNoZWNrcyB0aGUgYm91bmRzIG9mIHRoZSB2YXJpb3VzIHBhcnRzCi0gICAgICAgICNvZiB0aGUgdGltZSB0dXBsZS4KKyAgICAgICAgI29mIHRoZSB0aW1lIHR1cGxlICgwIGlzIHZhbGlkIGZvciAqYWxsKiB2YWx1ZXMpLgogCi0gICAgICAgICMgQ2hlY2sgeWVhcgorICAgICAgICAjIENoZWNrIHllYXIgWzE5MDAsIG1heChpbnQpXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTg5OSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQogICAgICAgICBpZiB0aW1lLmFjY2VwdDJkeWVhcjoKQEAgLTQ5LDI3ICs0OSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgbW9udGgKKyAgICAgICAgIyBDaGVjayBtb250aCBbMSwgMTJdICsgemVybyBzdXBwb3J0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIC0xLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxMywgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGRheSBvZiBtb250aAorICAgICAgICAjIENoZWNrIGRheSBvZiBtb250aCBbMSwgMzFdICsgemVybyBzdXBwb3J0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIC0xLCAwLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAzMiwgMCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGhvdXIKKyAgICAgICAgIyBDaGVjayBob3VyIFswLCAyM10KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIC0xLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAyNCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIG1pbnV0ZQorICAgICAgICAjIENoZWNrIG1pbnV0ZSBbMCwgNTldCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAtMSwgMCwgMCwgMSwgLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgNjAsIDAsIDAsIDEsIC0xKSkKLSAgICAgICAgIyBDaGVjayBzZWNvbmQKKyAgICAgICAgIyBDaGVjayBzZWNvbmQgWzAsIDYxXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgLTEsIDAsIDEsIC0xKSkKICAgICAgICAgIyBDOTkgb25seSByZXF1aXJlcyBhbGxvd2luZyBmb3Igb25lIGxlYXAgc2Vjb25kLCBidXQgUHl0aG9uJ3MgZG9jcyBzYXkKQEAgLTgyLDE3ICs4MiwyNSBAQAogICAgICAgICAjICBtb2R1bG8uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAtMiwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGRheSBvZiB0aGUgeWVhcgorICAgICAgICAjIENoZWNrIGRheSBvZiB0aGUgeWVhciBbMSwgMzY2XSArIHplcm8gc3VwcG9ydAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAtMSwgLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMzY3LCAtMSkpCi0gICAgICAgICMgQ2hlY2sgZGF5bGlnaHQgc2F2aW5ncyBmbGFnCisgICAgICAgICMgQ2hlY2sgZGF5bGlnaHQgc2F2aW5ncyBmbGFnIFstMSwgMV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0yKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDIpKQogCisgICAgZGVmIHRlc3RfZGVmYXVsdF92YWx1ZXNfZm9yX3plcm8oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdXNpbmcgYWxsIHplcm9zIHVzZXMgdGhlIHByb3BlciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIyBObyB0ZXN0IGZvciBkYXlsaWdodCBzYXZpbmdzIHNpbmNlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY2hhbmdlIG91dHB1dAorICAgICAgICAjIGJhc2VkIG9uIGl0cyB2YWx1ZS4KKyAgICAgICAgZXhwZWN0ZWQgPSAiMjAwMCAwMSAwMSAwMCAwMCAwMCAxIDAwMSIKKyAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZSgiJVkgJW0gJWQgJUggJU0gJVMgJXcgJWoiLCAoMCwpKjkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpCisKICAgICBkZWYgdGVzdF9zdHJwdGltZShzZWxmKToKICAgICAgICAgdHQgPSB0aW1lLmdtdGltZShzZWxmLnQpCiAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLApAQCAtMTkzLDEzICsyMDEsMTcgQEAKICAgICAgICAgdGltZS5jdGltZShOb25lKQogCiAgICAgZGVmIHRlc3RfZ210aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgotICAgICAgICB0MCA9IHRpbWUubWt0aW1lKHRpbWUuZ210aW1lKCkpCi0gICAgICAgIHQxID0gdGltZS5ta3RpbWUodGltZS5nbXRpbWUoTm9uZSkpCisgICAgICAgIGd0MCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgZ3QxID0gdGltZS5nbXRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShndDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUoZ3QxKQogICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQogCiAgICAgZGVmIHRlc3RfbG9jYWx0aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgotICAgICAgICB0MCA9IHRpbWUubWt0aW1lKHRpbWUubG9jYWx0aW1lKCkpCi0gICAgICAgIHQxID0gdGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoTm9uZSkpCisgICAgICAgIGx0MCA9IHRpbWUubG9jYWx0aW1lKCkKKyAgICAgICAgbHQxID0gdGltZS5sb2NhbHRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShsdDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUobHQxKQogICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKaW5kZXggNDMwOWU4Yy4uMmIzMmI5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQpAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgnd3d3LnB5dGhvbi5vcmcnLCA4MCkKKyAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgnd3d3LnB5dGhvbi5vcmcuJywgODApCiAgICAgICAgIHNlbGYuYWRkcl9sb2NhbCAgPSAoJzEyNy4wLjAuMScsIDI1MzM5KQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKaW5kZXggNGY5NDZmNy4uMDhhZWM4ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CkBAIC0yNDQsOCArMjQ0LDggQEAKICAgICAgICAgc2VsZi5ydW5fdGVzdChvbmVfaW5zdHJfbGluZSkKICAgICBkZWYgdGVzdF8wNF9ub19wb3BfYmxvY2tzKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF9ibG9ja3MpCi0jIyAgICBkZWYgdGVzdF8wNV9ub19wb3BfdG9wcyhzZWxmKToKLSMjICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQorICAgIGRlZiB0ZXN0XzA1X25vX3BvcF90b3BzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQogICAgIGRlZiB0ZXN0XzA2X2NhbGwoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3QoY2FsbCkKICAgICBkZWYgdGVzdF8wN19yYWlzZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggMWI1OWY5OC4uYjNjNWE1MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTMxLDggKzMxLDkgQEAKICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQogICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pICMgdGhpcmQgbGluZSBoYXMgY2FyZXQKICAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJyZXR1cm4geCEiKQorICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAorICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIiEiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQogCiAgICAgZGVmIHRlc3Rfbm9jYXJldChzZWxmKToKICAgICAgICAgaWYgaXNfanl0aG9uOgpAQCAtNDcsOCArNDgsOSBAQAogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRhdGlvbkVycm9yKQogICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uc3RyaXAoKSA9PSAicHJpbnQgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKQorICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIjIiKSA9PSBlcnJbMl0uZmluZCgiXiIpKQogCiAgICAgZGVmIHRlc3RfYnVnNzM3NDczKHNlbGYpOgogICAgICAgICBpbXBvcnQgc3lzLCBvcywgdGVtcGZpbGUsIHRpbWUKQEAgLTEwOSw2ICsxMTEsNDUgQEAKICAgICAgICAgbHN0ID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShlLl9fY2xhc3NfXywgZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFsnS2V5Ym9hcmRJbnRlcnJ1cHRcbiddKQogCisgICAgIyBTdHJpbmcgZXhjZXB0aW9ucyBhcmUgZGVwcmVjYXRlZCwgYnV0IGxlZ2FsLiAgVGhlIHF1aXJreSBmb3JtIHdpdGgKKyAgICAjIHNlcGFyYXRlICJ0eXBlIiBhbmQgInZhbHVlIiB0ZW5kcyB0byBicmVhayB0aGluZ3MsIGJlY2F1c2UKKyAgICAjICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZSkKKyAgICAjIGFuZCBhIHN0cmluZyBjYW5ub3QgYmUgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGlzc3ViY2xhc3MuCisgICAgIworICAgICMgTm90ZSB0aGF0IHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlIGRvIG5vdCBnZXQgc2V0IGlmIGFuCisgICAgIyBleGNlcHRpb24gaXMgY2F1Z2h0LCBzbyB3ZSBzb3J0IG9mIGNoZWF0IGFuZCBqdXN0IGVtdWxhdGUgdGhlbS4KKyAgICAjCisgICAgIyB0ZXN0X3N0cmluZ19leGNlcHRpb24xIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAjCisgICAgIyA+Pj4gcmFpc2UgIlN0cmluZyBFeGNlcHRpb24iCisgICAgIworICAgICMgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMiBpcyBlcXVpdmFsZW50IHRvCisgICAgIworICAgICMgPj4+IHJhaXNlICJTdHJpbmcgRXhjZXB0aW9uIiwgIlN0cmluZyBWYWx1ZSIKKyAgICAjCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4Y2VwdGlvbjEoc2VsZik6CisgICAgICAgIHN0cl90eXBlID0gIlN0cmluZyBFeGNlcHRpb24iCisgICAgICAgIGVyciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoc3RyX3R5cGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBzdHJfdHlwZSArICdcbicpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMihzZWxmKToKKyAgICAgICAgc3RyX3R5cGUgPSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAgICAgc3RyX3ZhbHVlID0gIlN0cmluZyBWYWx1ZSIKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShzdHJfdHlwZSwgc3RyX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyclswXSwgc3RyX3R5cGUgKyAnOiAnICsgc3RyX3ZhbHVlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9leGNlcHRpb25fb25seV9iYWRfX3N0cl9fKHNlbGYpOgorICAgICAgICBjbGFzcyBYKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShYLCBYKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHN0cl92YWx1ZSA9ICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSBYLl9fbmFtZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBYLl9fbmFtZV9fICsgJzogJyArIHN0cl92YWx1ZSArICdcbicpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUcmFjZWJhY2tDYXNlcykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKaW5kZXggYzU3NWMwYy4uMmQyOTljMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CkBAIC0yMzMsNiArMjMzLDcgQEAKIHRyeTogYnVmZmVyKCdhc2RmJywgLTEpCiBleGNlcHQgVmFsdWVFcnJvcjogcGFzcwogZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlcignYXNkZicsIC0xKSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvciIKK2NtcChidWZmZXIoImFiYyIpLCBidWZmZXIoImRlZiIpKSAjIHVzZWQgdG8gcmFpc2UgYSB3YXJuaW5nOiB0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEsIDAsIG9yIDEKIAogdHJ5OiBidWZmZXIoTm9uZSkKIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKQEAgLTI3NiwzICsyNzcsMTAgQEAKIHRyeTogYVswOjFdID0gJ2cnCiBleGNlcHQgVHlwZUVycm9yOiBwYXNzCiBlbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyIHNsaWNlIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIKKworIyBhcnJheS5hcnJheSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGEgY2hhciBidWZmZXIsCisjIHNvbWV0aGluZyB3aGljaCBpbnQoKSB1c2VzIGZvciBjb252ZXJzaW9uLgoraW1wb3J0IGFycmF5Cit0cnk6IGludChidWZmZXIoYXJyYXkuYXJyYXkoJ2MnKSkpCitleGNlcHQgVHlwZUVycm9yIDpwYXNzCitlbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiY2hhciBidWZmZXIgKGF0IEMgbGV2ZWwpIG5vdCB3b3JraW5nIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IDAzNGI5ZDAuLjY3MjE4YjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTY3NiwxMSArNjc2LDExIEBACiAgICAgICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQogICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCiAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6ICAjIEdFVAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC1sZW5ndGgiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LXR5cGUiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LUxlbmd0aCIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtVHlwZSIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKICAgICAgICAgICAgIGVsc2U6ICAjIFBPU1QKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1sZW5ndGgiXSwgIjAiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1MZW5ndGgiXSwgIjAiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LVR5cGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCiAgICAgICAgICAgICAjIFhYWCB0aGUgZGV0YWlscyBvZiBIb3N0IGNvdWxkIGJlIGJldHRlciB0ZXN0ZWQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sICJleGFtcGxlLmNvbSIpCkBAIC02OTIsOCArNjkyLDggQEAKICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiSG9zdCIsICJiYXoiKQogICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgImZvbyIpCiAgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LWxlbmd0aCJdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1MZW5ndGgiXSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1UeXBlIl0sICJiYXIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwgImJheiIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siU3BhbSJdLCAiZm9vIikKIApAQCAtODQ3LDcgKzg0Nyw3IEBACiAgICAgICAgICAgICA0MDcsICdQcm94eS1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGF1dGhfaGFuZGxlcikKICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKLSAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiUHJveHktYXV0aG9yaXphdGlvbiIsCisgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGF1dGhfaGFuZGxlciwgIlByb3h5LUF1dGhvcml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbTozMTI4L3Byb3RlY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJveHkuZXhhbXBsZS5jb206MzEyOCIsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKaW5kZXggZGMzZDM2ZC4uMDBjZjIwMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vd3d3LnNhZGZsa2pzYXNhZGYuY29tLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLmludmFsaWQvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC4vIikKIAogCiBjbGFzcyBPdGhlck5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xNjAsOCArMTYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybGxpYjIkIikKICAgICAgICAgdXJscyA9IFsKICAgICAgICAgICAgICMgVGhhbmtzIHRvIEZyZWQgZm9yIGZpbmRpbmcgdGhlc2UhCi0gICAgICAgICAgICAnZ29waGVyOi8vZ29waGVyLmxpYi5uY3N1LmVkdS8xMS9saWJyYXJ5L3N0YWNrcy9BbGV4JywKLSAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIudnQuZWR1OjEwMDEwLzEwLzMzJywKKyAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIubGliLm5jc3UuZWR1Li8xMS9saWJyYXJ5L3N0YWNrcy9BbGV4JywKKyAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIudnQuZWR1LjoxMDAxMC8xMC8zMycsCiAgICAgICAgICAgICBdCiAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQogCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogICAgICAgICAgICAgICAgICMgWFhYIGJ1Zywgc2hvdWxkIHJhaXNlIFVSTEVycm9yCiAgICAgICAgICAgICAgICAgIygnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgdXJsbGliMi5VUkxFcnJvcikKLSAgICAgICAgICAgICAgICAoJ2ZpbGU6Ly9ub25zZW5zZW5hbWUvZXRjL3Bhc3N3ZCcsIE5vbmUsIChPU0Vycm9yLCBzb2NrZXQuZXJyb3IpKQorICAgICAgICAgICAgICAgICgnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgKEVudmlyb25tZW50RXJyb3IsIHNvY2tldC5lcnJvcikpCiAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0yMzksNyArMjM5LDkgQEAKICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgc29ja2V0LmVycm9yLCBPU0Vycm9yKSwgZXJyOgogICAgICAgICAgICAgICAgIGRlYnVnKGVycikKICAgICAgICAgICAgICAgICBpZiBleHBlY3RlZF9lcnI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGVyciwgZXhwZWN0ZWRfZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gKCJEaWRuJ3QgZ2V0IGV4cGVjdGVkIGVycm9yKHMpICVzIGZvciAlcyAlcywgZ290ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfZXJyLCB1cmwsIHJlcSwgZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpLCBtc2cpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGJ1ZiA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCkBAIC0yNTksNyArMjYxLDYgQEAKICAgICAgICAgcmV0dXJuIGhhbmRsZXJzCiAKIAotCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVSTFRpbWVvdXRUZXN0LCB1cmxvcGVuTmV0d29ya1Rlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQppbmRleCA4MDc2MWRmLi45MTA1YWZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly93d3cuc2FkZmxranNhc2FkZi5jb20vIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5pbnZhbGlkLyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC4vIikKIAogY2xhc3MgdXJscmV0cmlldmVOZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3RzIHVybGxpYi51cmxyZXRyaWV2ZSB1c2luZyB0aGUgbmV0d29yay4iIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXVpZC5weSBiL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF91dWlkLnB5CkBAIC0wLDAgKzEsNDM0IEBACitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1dWlkCisKK2RlZiBpbXBvcnRhYmxlKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIFRlc3RVVUlEKFRlc3RDYXNlKToKKyAgICBsYXN0X25vZGUgPSBOb25lCisgICAgc291cmNlMm5vZGUgPSB7fQorCisgICAgZGVmIHRlc3RfVVVJRChzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGFzY2VuZGluZyA9IFtdCisgICAgICAgIGZvciAoc3RyaW5nLCBjdXJseSwgaGV4LCBieXRlcywgZmllbGRzLCBpbnRlZ2VyLCB1cm4sCisgICAgICAgICAgICAgdGltZSwgY2xvY2tfc2VxLCB2YXJpYW50LCB2ZXJzaW9uKSBpbiBbCisgICAgICAgICAgICAoJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgJ3swMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB9JywKKyAgICAgICAgICAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLAorICAgICAgICAgICAgICdcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCcsCisgICAgICAgICAgICAgKDAsIDAsIDAsIDAsIDAsIDApLAorICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgMCwgMCwgdXVpZC5SRVNFUlZFRF9OQ1MsIE5vbmUpLAorICAgICAgICAgICAgKCcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgICd7MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmfScsCisgICAgICAgICAgICAgJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAnXDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG5ceDBiXHgwY1x4MGRceDBlXHgwZicsCisgICAgICAgICAgICAgKDB4MDAwMTAyMDNMLCAweDA0MDUsIDB4MDYwNywgOCwgOSwgMHgwYTBiMGMwZDBlMGZMKSwKKyAgICAgICAgICAgICAweDAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAweDYwNzA0MDUwMDAxMDIwM0wsIDB4ODA5LCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgJ3swMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2R9JywKKyAgICAgICAgICAgICAnMDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgICdceDAyXHhkOVx4ZTZceGQ1XHg5NFx4NjdceDM4XHgyZVx4OGZceDliXHg5M1x4MDBceGE2XHg0YVx4YzNceGNkJywKKyAgICAgICAgICAgICAoMHgwMmQ5ZTZkNUwsIDB4OTQ2NywgMHgzODJlLCAweDhmLCAweDliLCAweDkzMDBhNjRhYzNjZEwpLAorICAgICAgICAgICAgIDB4MDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2RMLAorICAgICAgICAgICAgICd1cm46dXVpZDowMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgIDB4ODJlOTQ2NzAyZDllNmQ1TCwgMHhmOWIsIHV1aWQuUkZDXzQxMjIsIDMpLAorICAgICAgICAgICAgKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgICd7MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4fScsCisgICAgICAgICAgICAgJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4JywKKyAgICAgICAgICAgICAnXHgxMlx4MzRceDU2XHg3OCcqNCwKKyAgICAgICAgICAgICAoMHgxMjM0NTY3OCwgMHgxMjM0LCAweDU2NzgsIDB4MTIsIDB4MzQsIDB4NTY3ODEyMzQ1Njc4KSwKKyAgICAgICAgICAgICAweDEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4LAorICAgICAgICAgICAgICd1cm46dXVpZDoxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgIDB4Njc4MTIzNDEyMzQ1Njc4TCwgMHgxMjM0LCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTA5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDEwXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTA5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODEwTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDExXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMUwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODExTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTI5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDEyXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMkwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTI5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODEyTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTQ5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDE0XHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxNEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTQ5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODE0TCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgJ3s3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDJ9JywKKyAgICAgICAgICAgICAnN2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgICdceDdkXHg0NFx4NDhceDQwXHg5ZFx4YzBceDExXHhkMVx4YjJceDQ1XHg1Zlx4ZmRceGNlXHg3NFx4ZmFceGQyJywKKyAgICAgICAgICAgICAoMHg3ZDQ0NDg0MEwsIDB4OWRjMCwgMHgxMWQxLCAweGIyLCAweDQ1LCAweDVmZmRjZTc0ZmFkMkwpLAorICAgICAgICAgICAgIDB4N2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDJMLAorICAgICAgICAgICAgICd1cm46dXVpZDo3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgIDB4MWQxOWRjMDdkNDQ0ODQwTCwgMHgzMjQ1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAne2U5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5Zn0nLAorICAgICAgICAgICAgICdlOTAyODkzYTlkMjIzYzdlYTdiOGQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgJ1x4ZTlceDAyXHg4OVx4M2FceDlkXHgyMlx4M2NceDdlXHhhN1x4YjhceGQ2XHhlM1x4MTNceGI3XHgxZFx4OWYnLAorICAgICAgICAgICAgICgweGU5MDI4OTNhTCwgMHg5ZDIyLCAweDNjN2UsIDB4YTcsIDB4YjgsIDB4ZDZlMzEzYjcxZDlmTCksCisgICAgICAgICAgICAgMHhlOTAyODkzYTlkMjIzYzdlYTdiOGQ2ZTMxM2I3MWQ5ZkwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOmU5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgMHhjN2U5ZDIyZTkwMjg5M2FMLCAweDI3YjgsIHV1aWQuUkZDXzQxMjIsIDMpLAorICAgICAgICAgICAgKCdlYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgICd7ZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmfScsCisgICAgICAgICAgICAgJ2ViNDI0MDI2NmY1NDRlZjhhNGQwYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAnXHhlYlx4NDJceDQwXHgyNlx4NmZceDU0XHg0ZVx4ZjhceGE0XHhkMFx4YmJceDY1XHg4YVx4MWZceGM2XHhjZicsCisgICAgICAgICAgICAgKDB4ZWI0MjQwMjZMLCAweDZmNTQsIDB4NGVmOCwgMHhhNCwgMHhkMCwgMHhiYjY1OGExZmM2Y2ZMKSwKKyAgICAgICAgICAgICAweGViNDI0MDI2NmY1NDRlZjhhNGQwYmI2NThhMWZjNmNmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAweGVmODZmNTRlYjQyNDAyNkwsIDB4MjRkMCwgdXVpZC5SRkNfNDEyMiwgNCksCisgICAgICAgICAgICAoJ2Y4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgJ3tmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjZ9JywKKyAgICAgICAgICAgICAnZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgICdceGY4XHgxZFx4NGZceGFlXHg3ZFx4ZWNceDExXHhkMFx4YTdceDY1XHgwMFx4YTBceGM5XHgxZVx4NmJceGY2JywKKyAgICAgICAgICAgICAoMHhmODFkNGZhZUwsIDB4N2RlYywgMHgxMWQwLCAweGE3LCAweDY1LCAweDAwYTBjOTFlNmJmNkwpLAorICAgICAgICAgICAgIDB4ZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjZMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgIDB4MWQwN2RlY2Y4MWQ0ZmFlTCwgMHgyNzY1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAne2ZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYX0nLAorICAgICAgICAgICAgICdmZmZlZmRmY2ZmZmVmZmZlZmZmZWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgJ1x4ZmZceGZlXHhmZFx4ZmNceGZmXHhmZVx4ZmZceGZlXHhmZlx4ZmVceGZmXHhmZVx4ZmRceGZjXHhmYlx4ZmEnLAorICAgICAgICAgICAgICgweGZmZmVmZGZjTCwgMHhmZmZlLCAweGZmZmUsIDB4ZmYsIDB4ZmUsIDB4ZmZmZWZkZmNmYmZhTCksCisgICAgICAgICAgICAgMHhmZmZlZmRmY2ZmZmVmZmZlZmZmZWZmZmVmZGZjZmJmYUwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOmZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgMHhmZmVmZmZlZmZmZWZkZmNMLCAweDNmZmUsIHV1aWQuUkVTRVJWRURfRlVUVVJFLCBOb25lKSwKKyAgICAgICAgICAgICgnZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAne2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZn0nLAorICAgICAgICAgICAgICdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicsCisgICAgICAgICAgICAgJ1x4ZmYnKjE2LAorICAgICAgICAgICAgICgweGZmZmZmZmZmTCwgMHhmZmZmTCwgMHhmZmZmTCwgMHhmZiwgMHhmZiwgMHhmZmZmZmZmZmZmZmZMKSwKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZiwgdXVpZC5SRVNFUlZFRF9GVVRVUkUsIE5vbmUpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWl2YWxlbnRzID0gW10KKyAgICAgICAgICAgICMgQ29uc3RydWN0IGVhY2ggVVVJRCBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzLgorICAgICAgICAgICAgZm9yIHUgaW4gW3V1aWQuVVVJRChzdHJpbmcpLCB1dWlkLlVVSUQoY3VybHkpLCB1dWlkLlVVSUQoaGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICB1dWlkLlVVSUQoYnl0ZXM9Ynl0ZXMpLCB1dWlkLlVVSUQoZmllbGRzPWZpZWxkcyksCisgICAgICAgICAgICAgICAgICAgICAgdXVpZC5VVUlEKGludD1pbnRlZ2VyKSwgdXVpZC5VVUlEKHVybildOgorICAgICAgICAgICAgICAgICMgVGVzdCBhbGwgY29udmVyc2lvbnMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIFVVSUQgb2JqZWN0LgorICAgICAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgc3RyaW5nKQorICAgICAgICAgICAgICAgIGVxdWFsKGludCh1KSwgaW50ZWdlcikKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmJ5dGVzLCBieXRlcykKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmZpZWxkcywgZmllbGRzKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZV9sb3csIGZpZWxkc1swXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWVfbWlkLCBmaWVsZHNbMV0pCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lX2hpX3ZlcnNpb24sIGZpZWxkc1syXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcV9oaV92YXJpYW50LCBmaWVsZHNbM10pCisgICAgICAgICAgICAgICAgZXF1YWwodS5jbG9ja19zZXFfbG93LCBmaWVsZHNbNF0pCisgICAgICAgICAgICAgICAgZXF1YWwodS5ub2RlLCBmaWVsZHNbNV0pCisgICAgICAgICAgICAgICAgZXF1YWwodS5oZXgsIGhleCkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmludCwgaW50ZWdlcikKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnVybiwgdXJuKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZSwgdGltZSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcSwgY2xvY2tfc2VxKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdmFyaWFudCkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIHZlcnNpb24pCisgICAgICAgICAgICAgICAgZXF1aXZhbGVudHMuYXBwZW5kKHUpCisKKyAgICAgICAgICAgICMgRGlmZmVyZW50IGNvbnN0cnVjdGlvbiBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIFVVSUQuCisgICAgICAgICAgICBmb3IgdSBpbiBlcXVpdmFsZW50czoKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiBlcXVpdmFsZW50czoKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwodSwgdikKKyAgICAgICAgICAgIGFzY2VuZGluZy5hcHBlbmQodSkKKworICAgICAgICAjIFRlc3QgY29tcGFyaXNvbiBvZiBVVUlEcy4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFzY2VuZGluZykpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKGFzY2VuZGluZykpOgorICAgICAgICAgICAgICAgIGVxdWFsKGNtcChpLCBqKSwgY21wKGFzY2VuZGluZ1tpXSwgYXNjZW5kaW5nW2pdKSkKKworICAgICAgICAjIFRlc3Qgc29ydGluZyBvZiBVVUlEcyAoYWJvdmUgbGlzdCBpcyBpbiBhc2NlbmRpbmcgb3JkZXIpLgorICAgICAgICByZXNvcnRlZCA9IGFzY2VuZGluZ1s6XQorICAgICAgICByZXNvcnRlZC5yZXZlcnNlKCkKKyAgICAgICAgcmVzb3J0ZWQuc29ydCgpCisgICAgICAgIGVxdWFsKGFzY2VuZGluZywgcmVzb3J0ZWQpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICBiYWR2YWx1ZSA9IGxhbWJkYSBmOiBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmKQorICAgICAgICBiYWR0eXBlID0gbGFtYmRhIGY6IHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZikKKworICAgICAgICAjIEJhZGx5IGZvcm1lZCBoZXggc3RyaW5ncy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnYWJjJykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3JykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODknKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OHoyMzQ1Njc4JykpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgYnl0ZXMuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPSdhYmMnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J1wwJyoxNSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPSdcMCcqMTcpKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGZpZWxkcy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsIDIsIDMsIDQsIDUpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCAyLCAzLCA0LCA1LCA2LCA3KSkpCisKKyAgICAgICAgIyBGaWVsZCB2YWx1ZXMgb3V0IG9mIHJhbmdlLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KC0xLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMHgxMDAwMDAwMDBMLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgLTEsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAweDEwMDAwTCwgMCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIC0xLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMHgxMDAwMEwsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAtMSwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDB4MTAwTCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDAsIC0xLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMHgxMDBMLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMCwgLTEpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAwLCAweDEwMDAwMDAwMDAwMDBMKSkpCisKKyAgICAgICAgIyBWZXJzaW9uIG51bWJlciBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249MCkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249NikpCisKKyAgICAgICAgIyBJbnRlZ2VyIHZhbHVlIG91dCBvZiByYW5nZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PS0xKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PTE8PDEyOEwpKQorCisgICAgICAgICMgTXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgaGV4LCBieXRlcywgZmllbGRzLCBpbnQuCisgICAgICAgIGgsIGIsIGYsIGkgPSAnMDAnKjE2LCAnXDAnKjE2LCAoMCwgMCwgMCwgMCwgMCwgMCksIDAKKyAgICAgICAgdXVpZC5VVUlEKGgpCisgICAgICAgIHV1aWQuVVVJRChoZXg9aCkKKyAgICAgICAgdXVpZC5VVUlEKGJ5dGVzPWIpCisgICAgICAgIHV1aWQuVVVJRChmaWVsZHM9ZikKKyAgICAgICAgdXVpZC5VVUlEKGludD1pKQorCisgICAgICAgICMgV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAocG9zaXRpb25hbCkuCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBmKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBmLCBpKSkKKworICAgICAgICAjIER1cGxpY2F0ZSBhcmd1bWVudHMgKG5hbWVkKS4KKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaGV4PWgsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPWIsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaGV4PWgsIGZpZWxkcz1mLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKworICAgICAgICAjIER1cGxpY2F0ZSBhcmd1bWVudHMgKHBvc2l0aW9uYWwgYW5kIG5hbWVkKS4KKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaGV4PWgsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGJ5dGVzPWIsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaGV4PWgsIGZpZWxkcz1mLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKworICAgICAgICAjIEltbXV0YWJpbGl0eS4KKyAgICAgICAgdSA9IHV1aWQuVVVJRChoKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnaGV4JywgaCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdieXRlcycsIGIpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnZmllbGRzJywgZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdpbnQnLCBpKSkKKworICAgIGRlZiBjaGVja19ub2RlKHNlbGYsIG5vZGUsIHNvdXJjZSk6CisgICAgICAgIGluZGl2aWR1YWxfZ3JvdXBfYml0ID0gKG5vZGUgPj4gNDBMKSAmIDEKKyAgICAgICAgdW5pdmVyc2FsX2xvY2FsX2JpdCA9IChub2RlID4+IDQwTCkgJiAyCisgICAgICAgIG1lc3NhZ2UgPSAiJTAxMnggZG9lc24ndCBsb29rIGxpa2UgYSByZWFsIE1BQyBhZGRyZXNzIiAlIG5vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRpdmlkdWFsX2dyb3VwX2JpdCwgMCwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml2ZXJzYWxfbG9jYWxfYml0LCAwLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5vZGUsIDAsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobm9kZSwgMHhmZmZmZmZmZmZmZmZMLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSBub2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8obm9kZSA8ICgxTCA8PCA0OCksIG1lc3NhZ2UpCisKKyAgICAgICAgVGVzdFVVSUQuc291cmNlMm5vZGVbc291cmNlXSA9IG5vZGUKKyAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlOgorICAgICAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlICE9IG5vZGU6CisgICAgICAgICAgICAgICAgbXNnID0gImRpZmZlcmVudCBzb3VyY2VzIGRpc2FncmVlIG9uIG5vZGU6XG4iCisgICAgICAgICAgICAgICAgZm9yIHMsIG4gaW4gVGVzdFVVSUQuc291cmNlMm5vZGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICAgIGZyb20gc291cmNlICVyLCBub2RlIHdhcyAlMDEyeFxuIiAlIChzLCBuKQorICAgICAgICAgICAgICAgICMgVGhlcmUncyBhY3R1YWxseSBubyByZWFzb24gdG8gZXhwZWN0IHRoZSBNQUMgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgIyB0byBhZ3JlZSBhY3Jvc3MgdmFyaW91cyBtZXRob2RzIC0tIGUuZy4sIGEgYm94IG1heSBoYXZlCisgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMsIGFuZCBkaWZmZXJlbnQgd2F5cyBvZiBnZXR0aW5nCisgICAgICAgICAgICAgICAgIyBhIE1BQyBhZGRyZXNzIG1heSBmYXZvciBkaWZmZXJlbnQgSFcuCisgICAgICAgICAgICAgICAgIyNzZWxmLmZhaWwobXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVGVzdFVVSUQubGFzdF9ub2RlID0gbm9kZQorCisgICAgZGVmIHRlc3RfaWZjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisiIiIgICAgV0FSTklORzogdXVpZC5faWZjb25maWdfZ2V0bm9kZSBpcyB1bnJlbGlhYmxlIG9uIG1hbnkgcGxhdGZvcm1zLgorICAgICAgICBJdCBpcyBkaXNhYmxlZCB1bnRpbCB0aGUgY29kZSBhbmQvb3IgdGVzdCBjYW4gYmUgZml4ZWQgcHJvcGVybHkuIiIiCisgICAgICAgIHJldHVybgorCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBub2RlID0gdXVpZC5faWZjb25maWdfZ2V0bm9kZSgpCisgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaWZjb25maWcnKQorCisgICAgZGVmIHRlc3RfaXBjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIG5vZGUgPSB1dWlkLl9pcGNvbmZpZ19nZXRub2RlKCkKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUsICdpcGNvbmZpZycpCisKKyAgICBkZWYgdGVzdF9uZXRiaW9zX2dldG5vZGUoc2VsZik6CisgICAgICAgIGlmIGltcG9ydGFibGUoJ3dpbjMyd25ldCcpIGFuZCBpbXBvcnRhYmxlKCduZXRiaW9zJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fbmV0Ymlvc19nZXRub2RlKCksICduZXRiaW9zJykKKworICAgIGRlZiB0ZXN0X3JhbmRvbV9nZXRub2RlKHNlbGYpOgorICAgICAgICBub2RlID0gdXVpZC5fcmFuZG9tX2dldG5vZGUoKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSBub2RlKQorICAgICAgICBzZWxmLmFzc2VydF8obm9kZSA8ICgxTCA8PDQ4KSkKKworICAgIGRlZiB0ZXN0X3VuaXhkbGxfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisiIiIgICAgV0FSTklORzogdXVpZC5fdW5peGRsbF9nZXRub2RlIGlzIHVucmVsaWFibGUgb24gbWFueSBwbGF0Zm9ybXMuCisgICAgICAgIEl0IGlzIGRpc2FibGVkIHVudGlsIHRoZSBjb2RlIGFuZC9vciB0ZXN0IGNhbiBiZSBmaXhlZCBwcm9wZXJseS4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIGltcG9ydGFibGUoJ2N0eXBlcycpIGFuZCBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fdW5peGRsbF9nZXRub2RlKCksICd1bml4ZGxsJykKKworICAgIGRlZiB0ZXN0X3dpbmRsbF9nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnY3R5cGVzJykgYW5kIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZSh1dWlkLl93aW5kbGxfZ2V0bm9kZSgpLCAnd2luZGxsJykKKworICAgIGRlZiB0ZXN0X2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAorIiIiICAgIFdBUk5JTkc6IHV1aWQuZ2V0bm9kZSBpcyB1bnJlbGlhYmxlIG9uIG1hbnkgcGxhdGZvcm1zLgorICAgICAgICBJdCBpcyBkaXNhYmxlZCB1bnRpbCB0aGUgY29kZSBhbmQvb3IgdGVzdCBjYW4gYmUgZml4ZWQgcHJvcGVybHkuIiIiCisgICAgICAgIHJldHVybgorCisgICAgICAgIG5vZGUxID0gdXVpZC5nZXRub2RlKCkKKyAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUxLCAiZ2V0bm9kZTEiKQorCisgICAgICAgICMgVGVzdCBpdCBhZ2FpbiB0byBlbnN1cmUgY29uc2lzdGVuY3kuCisgICAgICAgIG5vZGUyID0gdXVpZC5nZXRub2RlKCkKKyAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUyLCAiZ2V0bm9kZTIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9kZTEsIG5vZGUyKQorCisgICAgZGVmIHRlc3RfdXVpZDEoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgTWFrZSBzdXJlIHV1aWQ0KCkgZ2VuZXJhdGVzIFVVSURzIHRoYXQgYXJlIGFjdHVhbGx5IHZlcnNpb24gMS4KKyAgICAgICAgZm9yIHUgaW4gW3V1aWQudXVpZDEoKSBmb3IgaSBpbiByYW5nZSgxMCldOgorICAgICAgICAgICAgZXF1YWwodS52YXJpYW50LCB1dWlkLlJGQ180MTIyKQorICAgICAgICAgICAgZXF1YWwodS52ZXJzaW9uLCAxKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBub2RlIElEIGFwcGVhcnMgaW4gdGhlIFVVSUQuCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDApCisgICAgICAgIGVxdWFsKHUubm9kZSwgMCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4ZmZmZmZmZmZmZmZmKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4ZmZmZmZmZmZmZmZmKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBjbG9jayBzZXF1ZW5jZSBhcHBlYXJzIGluIHRoZSBVVUlELgorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYywgMCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfCB1LmNsb2NrX3NlcV9sb3csIDApCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4MTIzNDU2Nzg5YWJjLCAweDEyMzQpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKCgodS5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2YpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1LmNsb2NrX3NlcV9sb3csIDB4MTIzNCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMsIDB4M2ZmZikKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2xvY2tfc2VxX2xvdywgMHgzZmZmKQorCisgICAgZGVmIHRlc3RfdXVpZDMoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgVGVzdCBzb21lIGtub3duIHZlcnNpb24tMyBVVUlEcy4KKyAgICAgICAgZm9yIHUsIHYgaW4gWyh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9VUkwsICdodHRwOi8vcHl0aG9uLm9yZy8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAnOWZlOGU4YzQtYWFhOC0zMmE5LWE1NWMtNDUzNWE4OGI3NDhkJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9PSUQsICcxLjMuNi4xJyksCisgICAgICAgICAgICAgICAgICAgICAgJ2RkMWExY2VmLTEzZDUtMzY4YS1hZDgyLWVjYTcxYWNkNGNkMScpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfWDUwMCwgJ2M9Y2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNjU4ZDMwMDItZGI2Yi0zMDQwLWExZDEtOGRkZDdkMTg5YTRkJyksCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDMpCisgICAgICAgICAgICBlcXVhbCh1LCB1dWlkLlVVSUQodikpCisgICAgICAgICAgICBlcXVhbChzdHIodSksIHYpCisKKyAgICBkZWYgdGVzdF91dWlkNChzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdXVpZDQoKSBnZW5lcmF0ZXMgVVVJRHMgdGhhdCBhcmUgYWN0dWFsbHkgdmVyc2lvbiA0LgorICAgICAgICBmb3IgdSBpbiBbdXVpZC51dWlkNCgpIGZvciBpIGluIHJhbmdlKDEwKV06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDQpCisKKyAgICBkZWYgdGVzdF91dWlkNShzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBUZXN0IHNvbWUga25vd24gdmVyc2lvbi01IFVVSURzLgorICAgICAgICBmb3IgdSwgdiBpbiBbKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICAgICAgICAgICc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgJ2h0dHA6Ly9weXRob24ub3JnLycpLAorICAgICAgICAgICAgICAgICAgICAgICc0YzU2NWYwZC0zZjVhLTU4OTAtYjQxYi0yMGNmNDc3MDFjNWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX09JRCwgJzEuMy42LjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnMTQ0N2ZhNjEtNTI3Ny01ZmVmLWE5YjMtZmJjNmU0NGY0YWYzJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9YNTAwLCAnYz1jYScpLAorICAgICAgICAgICAgICAgICAgICAgICdjYzk1N2RkMS1hOTcyLTUzNDktOThjZC04NzQxOTAwMDI3OTgnKSwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgNSkKKyAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKKyAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0VVVJRCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YWl0My5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkKaW5kZXggZjZhNDFhNi4uOWRlNjRiMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YWl0My5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5CkBAIC0yLDggKzIsOSBAQAogIiIiCiAKIGltcG9ydCBvcworaW1wb3J0IHRpbWUKIGZyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuCiAKIHRyeToKICAgICBvcy5mb3JrCkBAIC0xNywxNiArMTgsMjEgQEAKIAogY2xhc3MgV2FpdDNUZXN0KEZvcmtXYWl0KToKICAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0MygwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXQzKCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDMob3MuV05PSEFORykKICAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCisKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydXNhZ2UpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoV2FpdDNUZXN0KQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5IGIvTGliL3Rlc3QvdGVzdF93YWl0NC5weQppbmRleCAwMjdlNWMzLi45ZjdmYzE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKQEAgLTIsOCArMiw5IEBACiAiIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgdGltZQogZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIAogdHJ5OgogICAgIG9zLmZvcmsKQEAgLTE3LDEzICsxOCwyMCBAQAogCiBjbGFzcyBXYWl0NFRlc3QoRm9ya1dhaXQpOgogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6Ci0gICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDQoY3BpZCwgMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0NCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChXYWl0NFRlc3QpCisgICAgcmVhcF9jaGlsZHJlbigpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CmluZGV4IDVkMDUxYTUuLmE3Y2NiNmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQpAQCAtODEsNiArODEsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cubWVzc2FnZSwgdGV4dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuY2F0ZWdvcnksICdVc2VyV2FybmluZycpCiAKKyAgICBkZWYgdGVzdF9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIFVzZXMgdGhlIHByaXZhdGUgX3NldG9wdGlvbigpIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHBhcnNpbmcKKyAgICAgICAgIyBvZiBjb21tYW5kLWxpbmUgd2FybmluZyBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2FybmluZ3MuX09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5fc2V0b3B0aW9uLCAnMToyOjM6NDo1OjYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3YXJuaW5ncy5fT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLl9zZXRvcHRpb24sICdib2d1czo6V2FybmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdhcm5pbmdzLl9PcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuX3NldG9wdGlvbiwgJ2lnbm9yZToyOjo0Oi01JykKKyAgICAgICAgd2FybmluZ3MuX3NldG9wdGlvbignZXJyb3I6Oldhcm5pbmc6OjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgd2FybmluZ3Mud2FybiwgJ2NvbnZlcnQgdG8gZXJyb3InKQorCisKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICAjIE9ic2N1cmUgaGFjayBzbyB0aGF0IHRoaXMgdGVzdCBwYXNzZXMgYWZ0ZXIgcmVsb2FkcyBvciByZXBlYXRlZCBjYWxscwogICAgICMgdG8gdGVzdF9tYWluIChyZWdydGVzdCAtUikuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnJlZy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CmluZGV4IGE5YmM5NjIuLjU4MzBmZDYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CkBAIC0xNTEsMyArMTUxLDYgQEAKIGVsc2U6CiAgICAgcHJpbnQgIlJlbW90ZSByZWdpc3RyeSBjYWxscyBjYW4gYmUgdGVzdGVkIHVzaW5nIiwKICAgICBwcmludCAiJ3Rlc3Rfd2lucmVnLnB5IC0tcmVtb3RlIFxcXFxtYWNoaW5lX25hbWUnIgorICAgICMgcGVyZm9ybSBtaW5pbWFsIENvbm5lY3RSZWdpc3RyeSB0ZXN0IHdoaWNoIGp1c3QgaW52b2tlcyBpdAorICAgIGggPSBDb25uZWN0UmVnaXN0cnkoTm9uZSwgSEtFWV9MT0NBTF9NQUNISU5FKQorICAgIGguQ2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYzI3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKQEAgLTAsMCArMSw2MTUgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyAgICAjIEJhY2t3YXJkIGNvbXBhdCBmb3IgMi4xCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0U3VpdGUsIFRlc3RDYXNlLCBtYWtlU3VpdGUKK2Zyb20gd3NnaXJlZi51dGlsIGltcG9ydCBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzCitmcm9tIHdzZ2lyZWYuaGVhZGVycyBpbXBvcnQgSGVhZGVycworZnJvbSB3c2dpcmVmLmhhbmRsZXJzIGltcG9ydCBCYXNlSGFuZGxlciwgQmFzZUNHSUhhbmRsZXIKK2Zyb20gd3NnaXJlZiBpbXBvcnQgdXRpbAorZnJvbSB3c2dpcmVmLnZhbGlkYXRlIGltcG9ydCB2YWxpZGF0b3IKK2Zyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBXU0dJU2VydmVyLCBXU0dJUmVxdWVzdEhhbmRsZXIsIGRlbW9fYXBwCitmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgbWFrZV9zZXJ2ZXIKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgQmFzZVNlcnZlcgoraW1wb3J0IHJlLCBzeXMKKworCitjbGFzcyBNb2NrU2VydmVyKFdTR0lTZXJ2ZXIpOgorICAgICIiIk5vbi1zb2NrZXQgSFRUUCBzZXJ2ZXIiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcyk6CisgICAgICAgIEJhc2VTZXJ2ZXIuX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpCisgICAgICAgIHNlbGYuc2VydmVyX2JpbmQoKQorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zZXJ2ZXJfYWRkcmVzcworICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gaG9zdAorICAgICAgICBzZWxmLnNlcnZlcl9wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorCisKK2NsYXNzIE1vY2tIYW5kbGVyKFdTR0lSZXF1ZXN0SGFuZGxlcik6CisgICAgIiIiTm9uLXNvY2tldCBIVFRQIGhhbmRsZXIiIiIKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNlbGYucmVxdWVzdAorICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKKworCisKKworZGVmIGhlbGxvX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICBzdGFydF9yZXNwb25zZSgiMjAwIE9LIiwgWworICAgICAgICAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSwKKyAgICAgICAgKCdEYXRlJywnTW9uLCAwNSBKdW4gMjAwNiAxODo0OTo1NCBHTVQnKQorICAgIF0pCisgICAgcmV0dXJuIFsiSGVsbG8sIHdvcmxkISJdCisKK2RlZiBydW5fYW1vY2soYXBwPWhlbGxvX2FwcCwgZGF0YT0iR0VUIC8gSFRUUC8xLjBcblxuIik6CisgICAgc2VydmVyID0gbWFrZV9zZXJ2ZXIoIiIsIDgwLCBhcHAsIE1vY2tTZXJ2ZXIsIE1vY2tIYW5kbGVyKQorICAgIGlucCwgb3V0LCBlcnIsIG9sZGVyciA9IFN0cmluZ0lPKGRhdGEpLCBTdHJpbmdJTygpLCBTdHJpbmdJTygpLCBzeXMuc3RkZXJyCisgICAgc3lzLnN0ZGVyciA9IGVycgorCisgICAgdHJ5OgorICAgICAgICBzZXJ2ZXIuZmluaXNoX3JlcXVlc3QoKGlucCxvdXQpLCAoIjEyNy4wLjAuMSIsODg4OCkpCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnN0ZGVyciA9IG9sZGVycgorCisgICAgcmV0dXJuIG91dC5nZXR2YWx1ZSgpLCBlcnIuZ2V0dmFsdWUoKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiBjb21wYXJlX2dlbmVyaWNfaXRlcihtYWtlX2l0LG1hdGNoKToKKyAgICAiIiJVdGlsaXR5IHRvIGNvbXBhcmUgYSBnZW5lcmljIDIuMS8yLjIrIGl0ZXJhdG9yIHdpdGggYW4gaXRlcmFibGUKKworICAgIElmIHJ1bm5pbmcgdW5kZXIgUHl0aG9uIDIuMissIHRoaXMgdGVzdHMgdGhlIGl0ZXJhdG9yIHVzaW5nIGl0ZXIoKS9uZXh0KCksCisgICAgYXMgd2VsbCBhcyBfX2dldGl0ZW1fXy4gICdtYWtlX2l0JyBtdXN0IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgZnJlc2gKKyAgICBpdGVyYXRvciB0byBiZSB0ZXN0ZWQgKHNpbmNlIHRoaXMgbWF5IHRlc3QgdGhlIGl0ZXJhdG9yIHR3aWNlKS4iIiIKKworICAgIGl0ID0gbWFrZV9pdCgpCisgICAgbiA9IDAKKyAgICBmb3IgaXRlbSBpbiBtYXRjaDoKKyAgICAgICAgaWYgbm90IGl0W25dPT1pdGVtOiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICBuKz0xCisgICAgdHJ5OgorICAgICAgICBpdFtuXQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRvbyBtYW55IGl0ZW1zIGZyb20gX19nZXRpdGVtX18iLGl0KQorCisgICAgdHJ5OgorICAgICAgICBpdGVyLCBTdG9wSXRlcmF0aW9uCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgICMgT25seSB0ZXN0IGl0ZXIgbW9kZSB1bmRlciAyLjIrCisgICAgICAgIGl0ID0gbWFrZV9pdCgpCisgICAgICAgIGlmIG5vdCBpdGVyKGl0KSBpcyBpdDogcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgZm9yIGl0ZW0gaW4gbWF0Y2g6CisgICAgICAgICAgICBpZiBub3QgaXQubmV4dCgpPT1pdGVtOiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVG9vIG1hbnkgaXRlbXMgZnJvbSAubmV4dCgpIixpdCkKKworCisKKworCisKK2NsYXNzIEludGVncmF0aW9uVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX2hlbGxvKHNlbGYsIG91dCwgaGFzX2xlbmd0aD1UcnVlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsCisgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJTZXJ2ZXI6IFdTR0lTZXJ2ZXIvMC4xIFB5dGhvbi8iK3N5cy52ZXJzaW9uLnNwbGl0KClbMF0rIlxyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJEYXRlOiBNb24sIDA1IEp1biAyMDA2IDE4OjQ5OjU0IEdNVFxyXG4iICsKKyAgICAgICAgICAgIChoYXNfbGVuZ3RoIGFuZCAgIkNvbnRlbnQtTGVuZ3RoOiAxM1xyXG4iIG9yICIiKSArCisgICAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAgICJIZWxsbywgd29ybGQhIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wbGFpbl9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2soKQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCkKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRlZF9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2sodmFsaWRhdG9yKGhlbGxvX2FwcCkpCisgICAgICAgICMgdGhlIG1pZGRsZXdhcmUgZG9lc24ndCBzdXBwb3J0IGxlbigpLCBzbyBjb250ZW50LWxlbmd0aCBpc24ndCB0aGVyZQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCwgaGFzX2xlbmd0aD1GYWxzZSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV92YWxpZGF0aW9uX2Vycm9yKHNlbGYpOgorICAgICAgICBkZWYgYmFkX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSkKKyAgICAgICAgICAgIHJldHVybiBbIkhlbGxvLCB3b3JsZCEiXQorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoYmFkX2FwcCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhvdXQuZW5kc3dpdGgoCisgICAgICAgICAgICAiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuICBQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4iCisgICAgICAgICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBlcnIuc3BsaXRsaW5lcygpWy0yXSwKKyAgICAgICAgICAgICJBc3NlcnRpb25FcnJvcjogSGVhZGVycyAoKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpKSBtdXN0IgorICAgICAgICAgICAgIiBiZSBvZiB0eXBlIGxpc3Q6IDx0eXBlICd0dXBsZSc+IgorICAgICAgICApCisKKworCisKKworCitjbGFzcyBVdGlsaXR5VGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrU2hpZnQoc2VsZixzbl9pbixwaV9pbixwYXJ0LHNuX291dCxwaV9vdXQpOgorICAgICAgICBlbnYgPSB7J1NDUklQVF9OQU1FJzpzbl9pbiwnUEFUSF9JTkZPJzpwaV9pbn0KKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLnNoaWZ0X3BhdGhfaW5mbyhlbnYpLHBhcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydQQVRIX0lORk8nXSxwaV9vdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydTQ1JJUFRfTkFNRSddLHNuX291dCkKKyAgICAgICAgcmV0dXJuIGVudgorCisgICAgZGVmIGNoZWNrRGVmYXVsdChzZWxmLCBrZXksIHZhbHVlLCBhbHQ9Tm9uZSk6CisgICAgICAgICMgQ2hlY2sgZGVmYXVsdGluZyB3aGVuIGVtcHR5CisgICAgICAgIGVudiA9IHt9CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsU3RyaW5nSU8pOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZW52W2tleV0sU3RyaW5nSU8pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba2V5XSx2YWx1ZSkKKworICAgICAgICAjIENoZWNrIGV4aXN0aW5nIHZhbHVlCisgICAgICAgIGVudiA9IHtrZXk6YWx0fQorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZW52W2tleV0gaXMgYWx0KQorCisgICAgZGVmIGNoZWNrQ3Jvc3NEZWZhdWx0KHNlbGYsa2V5LHZhbHVlLCoqa3cpOgorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3dba2V5XSx2YWx1ZSkKKworICAgIGRlZiBjaGVja0FwcFVSSShzZWxmLHVyaSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuYXBwbGljYXRpb25fdXJpKGt3KSx1cmkpCisKKyAgICBkZWYgY2hlY2tSZXFVUkkoc2VsZix1cmkscXVlcnk9MSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwucmVxdWVzdF91cmkoa3cscXVlcnkpLHVyaSkKKworCisKKworCisKKyAgICBkZWYgY2hlY2tGVyhzZWxmLHRleHQsc2l6ZSxtYXRjaCk6CisKKyAgICAgICAgZGVmIG1ha2VfaXQodGV4dD10ZXh0LHNpemU9c2l6ZSk6CisgICAgICAgICAgICByZXR1cm4gdXRpbC5GaWxlV3JhcHBlcihTdHJpbmdJTyh0ZXh0KSxzaXplKQorCisgICAgICAgIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpCisKKyAgICAgICAgaXQgPSBtYWtlX2l0KCkKKyAgICAgICAgc2VsZi5mYWlsSWYoaXQuZmlsZWxpa2UuY2xvc2VkKQorCisgICAgICAgIGZvciBpdGVtIGluIGl0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuZmFpbElmKGl0LmZpbGVsaWtlLmNsb3NlZCkKKworICAgICAgICBpdC5jbG9zZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdC5maWxlbGlrZS5jbG9zZWQpCisKKworICAgIGRlZiB0ZXN0U2ltcGxlU2hpZnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsJy8nLCAnJywgJy8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcnLCcveCcsICd4JywgJy94JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnLycsJycsIE5vbmUsICcvJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EnLCcveC95JywgJ3gnLCAnL2EveCcsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EnLCcveC8nLCAgJ3gnLCAnL2EveCcsICcvJykKKworCisgICAgZGVmIHRlc3ROb3JtYWxpemVkU2hpZnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4uL3knLCAnLi4nLCAnL2EnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsICcvLi4veScsICcuLicsICcnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy95JywgJ3knLCAnL2EvYi95JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvL3kvJywgJ3knLCAnL2EvYi95JywgJy8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veScsICd5JywgJy9hL2IveScsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veS8nLCAneScsICcvYS9iL3knLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLy8uLy4uLy95Ly4vLycsICcuLicsICcvYScsICcveS8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy8vJywgJycsICcvYS9iLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4vLycsICcnLCAnL2EvYi8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy94Ly8nLCAneCcsICcvYS9iL3gnLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLicsIE5vbmUsICcvYS9iJywgJycpCisKKworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFsKKyAgICAgICAgICAgICgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BPUlQnLCAnODAnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKSwKKyAgICAgICAgICAgICgnSFRUUF9IT1NUJywnMTI3LjAuMC4xJyksCisgICAgICAgICAgICAoJ1JFUVVFU1RfTUVUSE9EJywnR0VUJyksCisgICAgICAgICAgICAoJ1NDUklQVF9OQU1FJywnJyksCisgICAgICAgICAgICAoJ1BBVEhfSU5GTycsJy8nKSwKKyAgICAgICAgICAgICgnd3NnaS52ZXJzaW9uJywgKDEsMCkpLAorICAgICAgICAgICAgKCd3c2dpLnJ1bl9vbmNlJywgMCksCisgICAgICAgICAgICAoJ3dzZ2kubXVsdGl0aHJlYWQnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5tdWx0aXByb2Nlc3MnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5pbnB1dCcsIFN0cmluZ0lPKCIiKSksCisgICAgICAgICAgICAoJ3dzZ2kuZXJyb3JzJywgU3RyaW5nSU8oKSksCisgICAgICAgICAgICAoJ3dzZ2kudXJsX3NjaGVtZScsJ2h0dHAnKSwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tEZWZhdWx0KGtleSx2YWx1ZSkKKworCisgICAgZGVmIHRlc3RDcm9zc0RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdIVFRQX0hPU1QnLCJmb28uYmFyIixTRVJWRVJfTkFNRT0iZm9vLmJhciIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0ib24iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwcyIsSFRUUFM9IjEiKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwcyIsSFRUUFM9InllcyIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHAiLEhUVFBTPSJmb28iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdTRVJWRVJfUE9SVCcsIjgwIixIVFRQUz0iZm9vIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnU0VSVkVSX1BPUlQnLCI0NDMiLEhUVFBTPSJvbiIpCisKKworICAgIGRlZiB0ZXN0R3Vlc3NTY2hlbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoe30pLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6ImZvbyJ9KSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJvbiJ9KSwgImh0dHBzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoieWVzIn0pLCAiaHR0cHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiIxIn0pLCAiaHR0cHMiKQorCisKKworCisKKyAgICBkZWYgdGVzdEFwcFVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovL3NwYW0uZXhhbXBsZS5jb206MjA3MS8iLAorICAgICAgICAgICAgSFRUUF9IT1NUPSJzcGFtLmV4YW1wbGUuY29tOjIwNzEiLCBTRVJWRVJfUE9SVD0iMjA3MSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly9zcGFtLmV4YW1wbGUuY29tLyIsCisgICAgICAgICAgICBTRVJWRVJfTkFNRT0ic3BhbS5leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIiwKKyAgICAgICAgICAgIEhUVFBfSE9TVD0iMTI3LjAuMC4xIiwgU0VSVkVSX05BTUU9InNwYW0uZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwczovLzEyNy4wLjAuMS8iLCBIVFRQUz0ib24iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xOjgwMDAvIiwgU0VSVkVSX1BPUlQ9IjgwMDAiLAorICAgICAgICAgICAgSFRUUF9IT1NUPU5vbmUpCisKKyAgICBkZWYgdGVzdFJlcVVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtIiwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtP3NheT1uaSIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIsUVVFUllfU1RSSU5HPSJzYXk9bmkiKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0iLCAwLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0ic2F5PW5pIikKKworICAgIGRlZiB0ZXN0RmlsZVdyYXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tGVygieHl6Iio1MCwgMTIwLCBbInh5eiIqNDAsInh5eiIqMTBdKQorCisgICAgZGVmIHRlc3RIb3BCeUhvcChzZWxmKToKKyAgICAgICAgZm9yIGhvcCBpbiAoCisgICAgICAgICAgICAiQ29ubmVjdGlvbiBLZWVwLUFsaXZlIFByb3h5LUF1dGhlbnRpY2F0ZSBQcm94eS1BdXRob3JpemF0aW9uICIKKyAgICAgICAgICAgICJURSBUcmFpbGVycyBUcmFuc2Zlci1FbmNvZGluZyBVcGdyYWRlIgorICAgICAgICApLnNwbGl0KCk6CisgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisKKyAgICAgICAgIyBOb3QgY29tcHJlaGVuc2l2ZSwganVzdCBhIGZldyByYW5kb20gaGVhZGVyIG5hbWVzCisgICAgICAgIGZvciBob3AgaW4gKAorICAgICAgICAgICAgIkFjY2VwdCBDYWNoZS1Db250cm9sIERhdGUgUHJhZ21hIFRyYWlsZXIgVmlhIFdhcm5pbmciCisgICAgICAgICkuc3BsaXQoKToKKyAgICAgICAgICAgIGZvciBhbHQgaW4gaG9wLCBob3AudGl0bGUoKSwgaG9wLnVwcGVyKCksIGhvcC5sb3dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQorCitjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE1hcHBpbmdJbnRlcmZhY2Uoc2VsZik6CisgICAgICAgIHRlc3QgPSBbKCd4JywneScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihIZWFkZXJzKFtdKSksMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oSGVhZGVycyh0ZXN0WzpdKSksMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLmtleXMoKSwgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS52YWx1ZXMoKSwgWyd5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS5pdGVtcygpLCB0ZXN0KQorICAgICAgICBzZWxmLmZhaWxJZihIZWFkZXJzKHRlc3QpLml0ZW1zKCkgaXMgdGVzdCkgICMgbXVzdCBiZSBjb3B5IQorCisgICAgICAgIGg9SGVhZGVycyhbXSkKKyAgICAgICAgZGVsIGhbJ2ZvbyddICAgIyBzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yCisKKyAgICAgICAgaFsnRm9vJ10gPSAnYmFyJworICAgICAgICBmb3IgbSBpbiBoLmhhc19rZXksIGguX19jb250YWluc19fLCBoLmdldCwgaC5nZXRfYWxsLCBoLl9fZ2V0aXRlbV9fOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ2ZvbycpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZvbycpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZPTycpKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYobSgnYmFyJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwnYmFyJykKKyAgICAgICAgaFsnZm9vJ10gPSAnYmF6JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ0ZPTyddLCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0X2FsbCgnZm9vJyksWydiYXonXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJmb28iLCJ3aGVlIiksICJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnNldGRlZmF1bHQoImZvbyIsIndoZWUiKSwgImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zZXRkZWZhdWx0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJmb28iXSwiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJ6b28iXSwid2hlZSIpCisKKyAgICBkZWYgdGVzdFJlcXVpcmVMaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEhlYWRlcnMsICJmb28iKQorCisKKyAgICBkZWYgdGVzdEV4dHJhcyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcnMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdcclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2ZvbycsJ2JhcicsYmF6PSJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwgJ2JhcjsgYmF6PSJzcGFtIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdmb286IGJhcjsgYmF6PSJzcGFtIlxyXG5cclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ0ZvbycsJ2JhcicsY2hlZXNlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXRfYWxsKCdmb28nKSwKKyAgICAgICAgICAgIFsnYmFyOyBiYXo9InNwYW0iJywgJ2JhcjsgY2hlZXNlJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaCksCisgICAgICAgICAgICAnZm9vOiBiYXI7IGJhej0ic3BhbSJcclxuJworICAgICAgICAgICAgJ0ZvbzogYmFyOyBjaGVlc2VcclxuJworICAgICAgICAgICAgJ1xyXG4nCisgICAgICAgICkKKworCitjbGFzcyBFcnJvckhhbmRsZXIoQmFzZUNHSUhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwqKmt3KToKKyAgICAgICAgc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgQmFzZUNHSUhhbmRsZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBTdHJpbmdJTygnJyksIFN0cmluZ0lPKCksIFN0cmluZ0lPKCksIGt3LAorICAgICAgICAgICAgbXVsdGl0aHJlYWQ9VHJ1ZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorCitjbGFzcyBUZXN0SGFuZGxlcihFcnJvckhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyLCB3L2Vycm9yIHBhc3N0aHJ1IiIiCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZSAgICMgZm9yIHRlc3RpbmcsIHdlIHdhbnQgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcKKworCisKKworCisKKworCisKKworCitjbGFzcyBIYW5kbGVyVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrRW52aXJvbkF0dHJzKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZm9yIGF0dHIgaW4gWworICAgICAgICAgICAgJ3ZlcnNpb24nLCdtdWx0aXRocmVhZCcsJ211bHRpcHJvY2VzcycsJ3J1bl9vbmNlJywnZmlsZV93cmFwcGVyJworICAgICAgICBdOgorICAgICAgICAgICAgaWYgYXR0cj09J2ZpbGVfd3JhcHBlcicgYW5kIGhhbmRsZXIud3NnaV9maWxlX3dyYXBwZXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKGhhbmRsZXIsJ3dzZ2lfJythdHRyKSxlbnZbJ3dzZ2kuJythdHRyXSkKKworICAgIGRlZiBjaGVja09TRW52aXJvbihzZWxmLGhhbmRsZXIpOgorICAgICAgICBlbXB0eSA9IHt9OyBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVtcHR5KQorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZnJvbSBvcyBpbXBvcnQgZW52aXJvbgorICAgICAgICBmb3Igayx2IGluIGVudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBlbXB0eS5oYXNfa2V5KGspOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52W2tdLHYpCisgICAgICAgIGZvciBrLHYgaW4gZW1wdHkuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbnYuaGFzX2tleShrKSkKKworICAgIGRlZiB0ZXN0RW52aXJvbihzZWxmKToKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFg9IlkiKQorICAgICAgICBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmNoZWNrRW52aXJvbkF0dHJzKGgpCisgICAgICAgIHNlbGYuY2hlY2tPU0Vudmlyb24oaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bIlgiXSwiWSIpCisKKyAgICBkZWYgdGVzdENHSUVudmlyb24oc2VsZik6CisgICAgICAgIGggPSBCYXNlQ0dJSGFuZGxlcihOb25lLE5vbmUsTm9uZSx7fSkKKyAgICAgICAgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgZm9yIGtleSBpbiAnd3NnaS51cmxfc2NoZW1lJywgJ3dzZ2kuaW5wdXQnLCAnd3NnaS5lcnJvcnMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGguZW52aXJvbi5oYXNfa2V5KGtleSkpCisKKyAgICBkZWYgdGVzdFNjaGVtZShzZWxmKToKKyAgICAgICAgaD1UZXN0SGFuZGxlcihIVFRQUz0ib24iKTsgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddLCdodHRwcycpCisgICAgICAgIGg9VGVzdEhhbmRsZXIoKTsgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddLCdodHRwJykKKworCisgICAgZGVmIHRlc3RBYnN0cmFjdE1ldGhvZHMoc2VsZik6CisgICAgICAgIGggPSBCYXNlSGFuZGxlcigpCisgICAgICAgIGZvciBuYW1lIGluIFsKKyAgICAgICAgICAgICdfZmx1c2gnLCdnZXRfc3RkaW4nLCdnZXRfc3RkZXJyJywnYWRkX2NnaV92YXJzJworICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgZ2V0YXR0cihoLG5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBoLl93cml0ZSwgInRlc3QiKQorCisKKyAgICBkZWYgdGVzdENvbnRlbnRMZW5ndGgoc2VsZik6CisgICAgICAgICMgRGVtbyBvbmUgcmVhc29uIGl0ZXJhdGlvbiBpcyBiZXR0ZXIgdGhhbiB3cml0ZSgpLi4uICA7KQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDEoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW2VbJ3dzZ2kudXJsX3NjaGVtZSddXQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDIoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pKGVbJ3dzZ2kudXJsX3NjaGVtZSddKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4odHJpdmlhbF9hcHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiA0XHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisgICAgICAgIGggPSBUZXN0SGFuZGxlcigpCisgICAgICAgIGgucnVuKHRyaXZpYWxfYXBwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisKKworCisKKworCisgICAgZGVmIHRlc3RCYXNpY0Vycm9yT3V0cHV0KHNlbGYpOgorCisgICAgICAgIGRlZiBub25fZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICBzKCcyMDAgT0snLFtdKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgZGVmIGVycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBoYW5kbGVyIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4obm9uX2Vycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogMFxyXG4iCisgICAgICAgICAgICAiXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRlcnIuZ2V0dmFsdWUoKSwiIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4oZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAlc1xyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJWRcclxuIgorICAgICAgICAgICAgIlxyXG4lcyIgJSAoaC5lcnJvcl9zdGF0dXMsbGVuKGguZXJyb3JfYm9keSksaC5lcnJvcl9ib2R5KSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpPD4tMSkKKworICAgIGRlZiB0ZXN0RXJyb3JBZnRlck91dHB1dChzZWxmKToKKyAgICAgICAgTVNHID0gIlNvbWUgb3V0cHV0IGhhcyBiZWVuIHNlbnQiCisgICAgICAgIGRlZiBlcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoIjIwMCBPSyIsW10pKE1TRykKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIHNob3VsZCBiZSBjYXVnaHQgYnkgaGFuZGxlciIpCisKKyAgICAgICAgaCA9IEVycm9ySGFuZGxlcigpCisgICAgICAgIGgucnVuKGVycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIitNU0cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIik8Pi0xKQorCisKKyAgICBkZWYgdGVzdEhlYWRlckZvcm1hdHMoc2VsZik6CisKKyAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBzdGRwYXQgPSAoCisgICAgICAgICAgICByIkhUVFAvJXMgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgIHIiRGF0ZTogXHd7M30sIFsgMDEyM11cZCBcd3szfSBcZHs0fSBcZFxkOlxkXGQ6XGRcZCBHTVRcclxuIgorICAgICAgICAgICAgciIlcyIgciJDb250ZW50LUxlbmd0aDogMFxyXG4iIHIiXHJcbiIKKyAgICAgICAgKQorICAgICAgICBzaG9ydHBhdCA9ICgKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iICJDb250ZW50LUxlbmd0aDogMFxyXG4iICJcclxuIgorICAgICAgICApCisKKyAgICAgICAgZm9yIHNzdyBpbiAiRm9vQmFyLzEuMCIsIE5vbmU6CisgICAgICAgICAgICBzdyA9IHNzdyBhbmQgIlNlcnZlcjogJXNcclxuIiAlIHNzdyBvciAiIgorCisgICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiAiMS4wIiwgIjEuMSI6CisgICAgICAgICAgICAgICAgZm9yIHByb3RvIGluICJIVFRQLzAuOSIsICJIVFRQLzEuMCIsICJIVFRQLzEuMSI6CisKKyAgICAgICAgICAgICAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFNFUlZFUl9QUk9UT0NPTD1wcm90bykKKyAgICAgICAgICAgICAgICAgICAgaC5vcmlnaW5fc2VydmVyID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaC5odHRwX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGguc2VydmVyX3NvZnR3YXJlID0gc3N3CisgICAgICAgICAgICAgICAgICAgIGgucnVuKG5vbl9lcnJvcl9hcHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvcnRwYXQsaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKworICAgICAgICAgICAgICAgICAgICBoID0gVGVzdEhhbmRsZXIoU0VSVkVSX1BST1RPQ09MPXByb3RvKQorICAgICAgICAgICAgICAgICAgICBoLm9yaWdpbl9zZXJ2ZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGguaHR0cF92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBoLnNlcnZlcl9zb2Z0d2FyZSA9IHNzdworICAgICAgICAgICAgICAgICAgICBoLnJ1bihub25fZXJyb3JfYXBwKQorICAgICAgICAgICAgICAgICAgICBpZiBwcm90bz09IkhUVFAvMC45IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwiIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5tYXRjaChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RkcGF0JSh2ZXJzaW9uLHN3KSwgaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworIyBUaGlzIGVwaWxvZ3VlIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBQeXRob24gMi41IHJlZ3J0ZXN0IG1vZHVsZQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3N1aXRlCisgICAgcnVuX3N1aXRlKAorICAgICAgICB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHN5cy5tb2R1bGVzW19fbmFtZV9fXSkKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIHRoZSBhYm92ZSBsaW5lcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKaW5kZXggODYwNTJkNy4uNzhhZGI0MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKQEAgLTEsNCArMSw0IEBACi0jIHhtbGNvcmUuZXRyZWUgdGVzdC4gIFRoaXMgZmlsZSBjb250YWlucyBlbm91Z2ggdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQKKyMgeG1sLmV0cmVlIHRlc3QuICBUaGlzIGZpbGUgY29udGFpbnMgZW5vdWdoIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0CiAjIGFsbCBpbmNsdWRlZCBjb21wb25lbnRzIHdvcmsgYXMgdGhleSBzaG91bGQuICBGb3IgYSBtb3JlIGV4dGVuc2l2ZQogIyB0ZXN0IHN1aXRlLCBzZWUgdGhlIHNlbGZ0ZXN0IHNjcmlwdCBpbiB0aGUgRWxlbWVudFRyZWUgZGlzdHJpYnV0aW9uLgogCkBAIC02LDggKzYsNiBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi1mcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCi0KIFNBTVBMRV9YTUwgPSAiIiIKIDxib2R5PgogICA8dGFnPnRleHQ8L3RhZz4KQEAgLTMyLDkgKzMwLDkgQEAKICAgICAiIiIKICAgICBJbXBvcnQgc2FuaXR5LgogCi0gICAgPj4+IGZyb20geG1sY29yZS5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKLSAgICA+Pj4gZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAgICAgIiIiCiAKIGRlZiBjaGVja19tZXRob2QobWV0aG9kKToKQEAgLTYxLDYgKzU5LDggQEAKICAgICAiIiIKICAgICBUZXN0IGVsZW1lbnQgdHJlZSBpbnRlcmZhY2UuCiAKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKICAgICA+Pj4gZWxlbWVudCA9IEVULkVsZW1lbnQoInRhZyIsIGtleT0idmFsdWUiKQogICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZWxlbWVudCkKIApAQCAtMTA4LDYgKzEwOCw4IEBACiAgICAgIiIiCiAgICAgVGVzdCBmaW5kIG1ldGhvZHMgKGluY2x1ZGluZyB4cGF0aCBzeW50YXgpLgogCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCiAgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKICAgICA+Pj4gZWxlbS5maW5kKCJ0YWciKS50YWcKICAgICAndGFnJwpAQCAtMTc0LDYgKzE3Niw4IEBACiBkZWYgcGFyc2VsaXRlcmFsKCk6CiAgICAgciIiIgogCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCiAgICAgPj4+IGVsZW1lbnQgPSBFVC5YTUwoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCiAgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpLndyaXRlKHN5cy5zdGRvdXQpCiAgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CkBAIC0xOTUsMTggKzE5OSwyMCBAQAogICAgICdib2R5JwogICAgICIiIgogCi1kZWYgY2hlY2tfZW5jb2RpbmcoZW5jb2RpbmcpOgorCitkZWYgY2hlY2tfZW5jb2RpbmcoRVQsIGVuY29kaW5nKToKICAgICAiIiIKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImFzY2lpIikKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoInVzLWFzY2lpIikKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImlzby04ODU5LTEiKQotICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMTUiKQotICAgID4+PiBjaGVja19lbmNvZGluZygiY3A0MzciKQotICAgID4+PiBjaGVja19lbmNvZGluZygibWFjLXJvbWFuIikKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJhc2NpaSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAidXMtYXNjaWkiKQorICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImlzby04ODU5LTEiKQorICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImlzby04ODU5LTE1IikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJjcDQzNyIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAibWFjLXJvbWFuIikKICAgICAiIiIKLSAgICBFVC5YTUwoCi0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSclcyc/Pjx4bWwgLz4iICUgZW5jb2RpbmcKLSAgICAgICAgKQorICAgIEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nJXMnPz48eG1sIC8+IiAlIGVuY29kaW5nKQorCiAKICMKICMgeGluY2x1ZGUgdGVzdHMgKHNhbXBsZXMgZnJvbSBhcHBlbmRpeCBDIG9mIHRoZSB4aW5jbHVkZSBzcGVjaWZpY2F0aW9uKQpAQCAtMjgyLDE0ICsyODgsMTYgQEAKICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgIHJhaXNlIElPRXJyb3IoInJlc291cmNlIG5vdCBmb3VuZCIpCiAgICAgaWYgcGFyc2UgPT0gInhtbCI6Ci0gICAgICAgIHJldHVybiBFVC5YTUwoZGF0YSkKKyAgICAgICAgZnJvbSB4bWwuZXRyZWUuRWxlbWVudFRyZWUgaW1wb3J0IFhNTAorICAgICAgICByZXR1cm4gWE1MKGRhdGEpCiAgICAgcmV0dXJuIGRhdGEKIAogZGVmIHhpbmNsdWRlKCk6CiAgICAgciIiIgogICAgIEJhc2ljIGluY2x1c2lvbiBleGFtcGxlIChYSW5jbHVkZSBDLjEpCiAKLSAgICA+Pj4gZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCiAKICAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkMxLnhtbCIpCiAgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CmluZGV4IDU4N2VhOTkuLjU2ZTdmZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQpAQCAtMSwxMCArMSwxMCBAQAotIyB4bWxjb3JlLmV0cmVlIHRlc3QgZm9yIGNFbGVtZW50VHJlZQorIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCiAKIGltcG9ydCBkb2N0ZXN0LCBzeXMKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBjRWxlbWVudFRyZWUgYXMgRVQKK2Zyb20geG1sLmV0cmVlIGltcG9ydCBjRWxlbWVudFRyZWUgYXMgRVQKIAogU0FNUExFX1hNTCA9ICIiIgogPGJvZHk+CkBAIC0zMCw3ICszMCw3IEBACiAgICAgIiIiCiAgICAgSW1wb3J0IHNhbml0eS4KIAotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IGNFbGVtZW50VHJlZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgY0VsZW1lbnRUcmVlCiAgICAgIiIiCiAKIGRlZiBjaGVja19tZXRob2QobWV0aG9kKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQppbmRleCAwMjQxMzQ4Li41NDY4NGYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CkBAIC00LDcgKzQsNyBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHpsaWIgPSBOb25lCiAKLWltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QKK2ltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QsIHN5cywgc2h1dGlsCiAKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCkBAIC0yOCwxNCArMjgsNzAgQEAKICAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikKICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIikKICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQogICAgICAgICB6aXBmcC5jbG9zZSgpCiAKICAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQogICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgc2VsZi5kYXRhKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpLCBzZWxmLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgic3RyZmlsZSIpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgIyBQcmludCB0aGUgWklQIGRpcmVjdG9yeQorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gZnAKKworICAgICAgICAgICAgemlwZnAucHJpbnRkaXIoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgIGRpcmVjdG9yeSA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdGaWxlIE5hbWUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydF8oJ01vZGlmaWVkJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdTaXplJyBpbiBsaW5lc1swXSkKKworICAgICAgICBmbiwgZGF0ZSwgdGltZSwgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZm4sICdhbm90aGVyLm5hbWUnKQorICAgICAgICAjIFhYWDogdGltZXN0YW1wIGlzIG5vdCB0ZXN0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2l6ZSwgc3RyKGxlbihzZWxmLmRhdGEpKSkKKworICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAorICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorCisgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKKyAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgIG5hbWVzID0gWyBpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorICAgICAgICBmb3IgaSBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIGNoZWNrIGdldGluZm8KKyAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiLCAic3RyZmlsZSIpOgorICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8obm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLmZpbGVuYW1lLCBubSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgdGVzdHppcCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICB6aXBmcC50ZXN0emlwKCkKKworCiAgICAgICAgIHppcGZwLmNsb3NlKCkKIAorCisKKwogICAgIGRlZiB0ZXN0U3RvcmVkKHNlbGYpOgogICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKICAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCkBAIC01OSw2ICsxMTUsMTk3IEBACiAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCiAgICAgICAgIG9zLnJlbW92ZShURVNURk4yKQogCitjbGFzcyBUZXN0WmlwNjRJblNtYWxsRmlsZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhlc2UgdGVzdHMgdGVzdCB0aGUgWklQNjQgZnVuY3Rpb25hbGl0eSB3aXRob3V0IHVzaW5nIGxhcmdlIGZpbGVzLAorICAgICMgc2VlIHRlc3RfemlwZmlsZTY0IGZvciBwcm9wZXIgdGVzdHMuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX2xpbWl0ID0gemlwZmlsZS5aSVA2NF9MSU1JVAorICAgICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gNQorCisgICAgICAgIGxpbmVfZ2VuID0gKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSBmb3IgaSBpbiByYW5nZSgwLCAxMDAwKSkKKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKGxpbmVfZ2VuKQorCisgICAgICAgICMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICAgICAgICBmcCA9IG9wZW4oVEVTVEZOLCAid2IiKQorICAgICAgICBmcC53cml0ZShzZWxmLmRhdGEpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiBsYXJnZUZpbGVFeGNlcHRpb25UZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5MYXJnZVppcEZpbGUsCisgICAgICAgICAgICAgICAgemlwZnAud3JpdGUsIFRFU1RGTiwgImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiBsYXJnZUZpbGVFeGNlcHRpb25UZXN0MihzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuTGFyZ2VaaXBGaWxlLAorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiwgc2VsZi5kYXRhKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdExhcmdlRmlsZUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLmxhcmdlRmlsZUV4Y2VwdGlvblRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICAgICAgc2VsZi5sYXJnZUZpbGVFeGNlcHRpb25UZXN0MihmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgemlwVGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uLCBhbGxvd1ppcDY0PVRydWUpCisgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpCisgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorICAgICAgICB6aXBmcC53cml0ZXN0cigic3RyZmlsZSIsIHNlbGYuZGF0YSkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKFRFU1RGTiksIHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiKSwgc2VsZi5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoInN0cmZpbGUiKSwgc2VsZi5kYXRhKQorCisgICAgICAgICMgUHJpbnQgdGhlIFpJUCBkaXJlY3RvcnkKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZwCisKKyAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKKworICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCisgICAgICAgIGxpbmVzID0gZGlyZWN0b3J5LnNwbGl0bGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obGluZXMpLCA0KSAjIE51bWJlciBvZiBmaWxlcyArIGhlYWRlcgorCisgICAgICAgIHNlbGYuYXNzZXJ0XygnRmlsZSBOYW1lJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdNb2RpZmllZCcgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0XygnU2l6ZScgaW4gbGluZXNbMF0pCisKKyAgICAgICAgZm4sIGRhdGUsIHRpbWUsIHNpemUgPSBsaW5lc1sxXS5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZuLCAnYW5vdGhlci5uYW1lJykKKyAgICAgICAgIyBYWFg6IHRpbWVzdGFtcCBpcyBub3QgdGVzdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNpemUsIHN0cihsZW4oc2VsZi5kYXRhKSkpCisKKyAgICAgICAgIyBDaGVjayB0aGUgbmFtZWxpc3QKKyAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKworICAgICAgICAjIENoZWNrIGluZm9saXN0CisgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQorICAgICAgICBuYW1lcyA9IFsgaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvcyBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKyAgICAgICAgZm9yIGkgaW4gaW5mb3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCisKKyAgICAgICAgIyBjaGVjayBnZXRpbmZvCisgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKG5tKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5maWxlbmFtZSwgbm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRlc3R6aXAgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgemlwZnAudGVzdHppcCgpCisKKworICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFN0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisKKyAgICBpZiB6bGliOgorICAgICAgICBkZWYgdGVzdERlZmxhdGVkKHNlbGYpOgorICAgICAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICAgICAgc2VsZi56aXBUZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgZGVmIHRlc3RBYnNvbHV0ZUFyY25hbWVzKHNlbGYpOgorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCwgYWxsb3daaXA2ND1UcnVlKQorICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICIvYWJzb2x1dGUiKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAubmFtZWxpc3QoKSwgWyJhYnNvbHV0ZSJdKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IHNlbGYuX2xpbWl0CisgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisgICAgICAgIG9zLnJlbW92ZShURVNURk4yKQorCitjbGFzcyBQeVppcEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RXcml0ZVB5ZmlsZShzZWxmKToKKyAgICAgICAgemlwZnAgID0gemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpCisgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5weWMnKSBvciBmbi5lbmRzd2l0aCgnLnB5bycpOgorICAgICAgICAgICAgZm4gPSBmbls6LTFdCisKKyAgICAgICAgemlwZnAud3JpdGVweShmbikKKworICAgICAgICBibiA9IG9zLnBhdGguYmFzZW5hbWUoZm4pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisKKyAgICAgICAgemlwZnAgID0gemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpCisgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5weWMnKSBvciBmbi5lbmRzd2l0aCgnLnB5bycpOgorICAgICAgICAgICAgZm4gPSBmbls6LTFdCisKKyAgICAgICAgemlwZnAud3JpdGVweShmbiwgInRlc3RwYWNrYWdlIikKKworICAgICAgICBibiA9ICIlcy8lcyIlKCJ0ZXN0cGFja2FnZSIsIG9zLnBhdGguYmFzZW5hbWUoZm4pKQorICAgICAgICBzZWxmLmFzc2VydF8oYm4gbm90IGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0V3JpdGVQeXRob25QYWNrYWdlKHNlbGYpOgorICAgICAgICBpbXBvcnQgZW1haWwKKyAgICAgICAgcGFja2FnZWRpciA9IG9zLnBhdGguZGlybmFtZShlbWFpbC5fX2ZpbGVfXykKKworICAgICAgICB6aXBmcCAgPSB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikKKyAgICAgICAgemlwZnAud3JpdGVweShwYWNrYWdlZGlyKQorCisgICAgICAgICMgQ2hlY2sgZm9yIGEgY291cGxlIG9mIG1vZHVsZXMgYXQgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgaGllYXJhcmNoeQorICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdlbWFpbC9fX2luaXRfXy5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9fX2luaXRfXy5weWMnIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oJ2VtYWlsL21pbWUvdGV4dC5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9taW1lL3RleHQucHljJyBpbiBuYW1lcykKKworICAgIGRlZiB0ZXN0V3JpdGVQeXRob25EaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTjIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDEucHkiKSwgInciKQorICAgICAgICAgICAgZnAud3JpdGUoInByaW50IDQyXG4iKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKFRFU1RGTjIsICJtb2QyLnB5IiksICJ3IikKKyAgICAgICAgICAgIGZwLndyaXRlKCJwcmludCA0MiAqIDQyXG4iKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKFRFU1RGTjIsICJtb2QyLnR4dCIpLCAidyIpCisgICAgICAgICAgICBmcC53cml0ZSgiYmxhIGJsYSBibGFcbiIpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgICAgIHppcGZwICA9IHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKQorICAgICAgICAgICAgemlwZnAud3JpdGVweShURVNURk4yKQorCisgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnbW9kMS5weWMnIGluIG5hbWVzIG9yICdtb2QxLnB5bycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oJ21vZDIucHljJyBpbiBuYW1lcyBvciAnbW9kMi5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdtb2QyLnR4dCcgbm90IGluIG5hbWVzKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTjIpCisKKworCiBjbGFzcyBPdGhlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdENsb3NlRXJyb25lb3VzRmlsZShzZWxmKToKICAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIFppcEZpbGUgY29uc3RydWN0b3IgY2xvc2VzIHRoZSBmaWxlIG9iamVjdApAQCAtMTAzLDcgKzM1MCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi50ZXN0emlwKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUsIE90aGVyVGVzdHMpCisgICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUsIFRlc3RaaXA2NEluU21hbGxGaWxlcywgT3RoZXJUZXN0cywgUHlaaXBGaWxlVGVzdHMpCisgICAgI3J1bl91bml0dGVzdChUZXN0WmlwNjRJblNtYWxsRmlsZXMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlNjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5Y2YzOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5CkBAIC0wLDAgKzEsMTAxIEBACisjIFRlc3RzIG9mIHRoZSBmdWxsIFpJUDY0IGZ1bmN0aW9uYWxpdHkgb2YgemlwZmlsZQorIyBUaGUgdGVzdF9zdXBwb3J0LnJlcXVpcmVzIGNhbGwgaXMgdGhlIG9ubHkgcmVhc29uIGZvciBrZWVwaW5nIHRoaXMgc2VwYXJhdGUKKyMgZnJvbSB0ZXN0X3ppcGZpbGUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisjIFhYWChubm9yd2l0eik6IGRpc2FibGUgdGhpcyB0ZXN0IGJ5IGxvb2tpbmcgZm9yIGV4dHJhIGxhcmdmaWxlIHJlc291cmNlCisjIHdoaWNoIGRvZXNuJ3QgZXhpc3QuICBUaGlzIHRlc3QgdGFrZXMgb3ZlciAzMCBtaW51dGVzIHRvIHJ1biBpbiBnZW5lcmFsCisjIGFuZCByZXF1aXJlcyBtb3JlIGRpc2sgc3BhY2UgdGhhbiBtb3N0IG9mIHRoZSBidWlsZGJvdHMuCit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoCisgICAgICAgICdleHRyYWxhcmdlZmlsZScsCisgICAgICAgICd0ZXN0IHJlcXVpcmVzIGxvYWRzIG9mIGRpc2stc3BhY2UgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lIHRvIHJ1bicKKyAgICApCisKKyMgV2UgY2FuIHRlc3QgcGFydCBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgemxpYi4KK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK2ltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3lzCisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CisKK1RFU1RGTjIgPSBURVNURk4gKyAiMiIKKworIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgY2FuIHBhc3MgYmVmb3JlIHdlIHByaW50IGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCitfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA1ICogNjAKKworY2xhc3MgVGVzdHNXaXRoU291cmNlRmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSB0ZXN0IGRhdGEuCisgICAgICAgICMgeHJhbmdlKCkgaXMgaW1wb3J0YW50IGhlcmUgLS0gZG9uJ3Qgd2FudCB0byBjcmVhdGUgaW1tb3J0YWwgc3BhY2UKKyAgICAgICAgIyBmb3IgYSBtaWxsaW9uIGludHMuCisgICAgICAgIGxpbmVfZ2VuID0gKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSBmb3IgaSBpbiB4cmFuZ2UoMTAwMDAwMCkpCisgICAgICAgIHNlbGYuZGF0YSA9ICdcbicuam9pbihsaW5lX2dlbikKKworICAgICAgICAjIEFuZCB3cml0ZSBpdCB0byBhIGZpbGUuCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICJ3YiIpCisgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHppcFRlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUuCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQ9VHJ1ZSkKKworICAgICAgICAjIEl0IHdpbGwgY29udGFpbiBlbm91Z2ggY29waWVzIG9mIHNlbGYuZGF0YSB0byByZWFjaCBhYm91dCA2R0Igb2YKKyAgICAgICAgIyByYXcgZGF0YSB0byBzdG9yZS4KKyAgICAgICAgZmlsZWNvdW50ID0gNioxMDI0KiozIC8vIGxlbihzZWxmLmRhdGEpCisKKyAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShmaWxlY291bnQpOgorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInRlc3RmbiVkIiAlIG51bSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICAgICcgIHppcFRlc3Qgc3RpbGwgd3JpdGluZyAlZCBvZiAlZCwgYmUgcGF0aWVudC4uLicgJQorICAgICAgICAgICAgICAgICAgIChudW0sIGZpbGVjb3VudCkpCisgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGZpbGVjb3VudCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoInRlc3RmbiVkIiAlIG51bSksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgICMgUHJpbnQgc3RpbGwgd29ya2luZyBtZXNzYWdlIHNpbmNlIHRoaXMgdGVzdCBjYW4gYmUgcmVhbGx5IHNsb3cKKyAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sICgKKyAgICAgICAgICAgICAgICAgICAnICB6aXBUZXN0IHN0aWxsIHJlYWRpbmcgJWQgb2YgJWQsIGJlIHBhdGllbnQuLi4nICUKKyAgICAgICAgICAgICAgICAgICAobnVtLCBmaWxlY291bnQpKQorICAgICAgICAgICAgICAgIHN5cy5fX3N0ZG91dF9fLmZsdXNoKCkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RTdG9yZWQoc2VsZik6CisgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgIyBnaWdhYnl0ZXMgb2YgZGlzayBzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgorICAgICAgICBmb3IgZiBpbiBUZW1wb3JhcnlGaWxlKCksIFRFU1RGTjI6CisgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgaWYgemxpYjoKKyAgICAgICAgZGVmIHRlc3REZWZsYXRlZChzZWxmKToKKyAgICAgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgICAgICMgZ2lnYWJ5dGVzIG9mIGRpc2sgc3BhY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KKyAgICAgICAgICAgIGZvciBmIGluIFRlbXBvcmFyeUZpbGUoKSwgVEVTVEZOMjoKKyAgICAgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBURVNURk4sIFRFU1RGTjI6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCBjY2JjOGZkLi40NDQwOTQyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0zMDIsNjMgKzMwMiw2NSBAQAogICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby5mbHVzaCgpLCAiIikgIyBSZXR1cm5zIG5vdGhpbmcKIAotICAgIGRlZiB0ZXN0X2NvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKLSAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKLSAgICAgICAgZGF0YTEgPSBIQU1MRVRfU0NFTkUuc3dhcGNhc2UoKQotICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCi0gICAgICAgIGJ1ZnMwID0gW10KLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICBpZiBoYXNhdHRyKHpsaWIuY29tcHJlc3NvYmooKSwgImNvcHkiKToKKyAgICAgICAgZGVmIHRlc3RfY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgICAgIGRhdGEwID0gSEFNTEVUX1NDRU5FCisgICAgICAgICAgICBkYXRhMSA9IEhBTUxFVF9TQ0VORS5zd2FwY2FzZSgpCisgICAgICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgICAgICBidWZzMCA9IFtdCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQogCi0gICAgICAgIGMxID0gYzAuY29weSgpCi0gICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KKyAgICAgICAgICAgIGMxID0gYzAuY29weSgpCisgICAgICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCiAKLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmZsdXNoKCkpCi0gICAgICAgIHMwID0gJycuam9pbihidWZzMCkKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5jb21wcmVzcyhkYXRhMCkpCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuZmx1c2goKSkKKyAgICAgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKIAotICAgICAgICBidWZzMS5hcHBlbmQoYzEuY29tcHJlc3MoZGF0YTEpKQotICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKLSAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorICAgICAgICAgICAgYnVmczEuYXBwZW5kKGMxLmNvbXByZXNzKGRhdGExKSkKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5mbHVzaCgpKQorICAgICAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHMwKSxkYXRhMCtkYXRhMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQogCi0gICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgotICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKLSAgICAgICAgYyA9IHpsaWIuY29tcHJlc3NvYmooKQotICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKLSAgICAgICAgYy5mbHVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGMuY29weSkKKyAgICAgICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgICAgIGMuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYy5jb3B5KQogCi0gICAgZGVmIHRlc3RfZGVjb21wcmVzc2NvcHkoc2VsZik6Ci0gICAgICAgICMgVGVzdCBjb3B5aW5nIGEgZGVjb21wcmVzc2lvbiBvYmplY3QKLSAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORQotICAgICAgICBjb21wID0gemxpYi5jb21wcmVzcyhkYXRhKQorICAgIGlmIGhhc2F0dHIoemxpYi5kZWNvbXByZXNzb2JqKCksICJjb3B5Iik6CisgICAgICAgIGRlZiB0ZXN0X2RlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBkZWNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORQorICAgICAgICAgICAgY29tcCA9IHpsaWIuY29tcHJlc3MoZGF0YSkKIAotICAgICAgICBkMCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgICAgIGJ1ZnMwID0gW10KLSAgICAgICAgYnVmczAuYXBwZW5kKGQwLmRlY29tcHJlc3MoY29tcFs6MzJdKSkKKyAgICAgICAgICAgIGQwID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbOjMyXSkpCiAKLSAgICAgICAgZDEgPSBkMC5jb3B5KCkKLSAgICAgICAgYnVmczEgPSBidWZzMFs6XQorICAgICAgICAgICAgZDEgPSBkMC5jb3B5KCkKKyAgICAgICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KIAotICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzMyOl0pKQotICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzMyOl0pKQorICAgICAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQogCi0gICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCi0gICAgICAgIHMxID0gJycuam9pbihidWZzMSkKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxzMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxzMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAsZGF0YSkKIAotICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgotICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKLSAgICAgICAgZGF0YSA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQotICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKLSAgICAgICAgZC5kZWNvbXByZXNzKGRhdGEpCi0gICAgICAgIGQuZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCisgICAgICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGQuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgZC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCiAKIGRlZiBnZW5ibG9jayhzZWVkLCBsZW5ndGgsIHN0ZXA9MTAyNCwgZ2VuZXJhdG9yPXJhbmRvbSk6CiAgICAgIiIibGVuZ3RoLWJ5dGUgc3RyZWFtIG9mIHJhbmRvbSBkYXRhIGZyb20gYSBzZWVkIChpbiBzdGVwLWJ5dGUgYmxvY2tzKS4iIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXh0d3JhcC5weSBiL0xpYi90ZXh0d3JhcC5weQppbmRleCA3YzY4MjgwLi5jY2ZmMmFiIDEwMDY0NAotLS0gYS9MaWIvdGV4dHdyYXAucHkKKysrIGIvTGliL3RleHR3cmFwLnB5CkBAIC0zMTcsNDEgKzMxNyw1OCBAQAogCiAjIC0tIExvb3NlbHkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorX3doaXRlc3BhY2Vfb25seV9yZSA9IHJlLmNvbXBpbGUoJ15bIFx0XSskJywgcmUuTVVMVElMSU5FKQorX2xlYWRpbmdfd2hpdGVzcGFjZV9yZSA9IHJlLmNvbXBpbGUoJyheWyBcdF0qKSg/OlteIFx0XG5dKScsIHJlLk1VTFRJTElORSkKKwogZGVmIGRlZGVudCh0ZXh0KToKLSAgICAiIiJkZWRlbnQodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nCisgICAgIiIiUmVtb3ZlIGFueSBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZSBpbiBgdGV4dGAuCiAKLSAgICBSZW1vdmUgYW55IHdoaXRlc3BhY2UgdGhhbiBjYW4gYmUgdW5pZm9ybWx5IHJlbW92ZWQgZnJvbSB0aGUgbGVmdAotICAgIG9mIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLgorICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0CisgICAgZWRnZSBvZiB0aGUgZGlzcGxheSwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyB0aGVtIGluIHRoZSBzb3VyY2UgY29kZQorICAgIGluIGluZGVudGVkIGZvcm0uCiAKLSAgICBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoCi0gICAgdGhlIGxlZnQgZWRnZSBvZiBzY3JlZW4vd2hhdGV2ZXIsIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgaXQgaW4gdGhlCi0gICAgc291cmNlIGNvZGUgaW4gaW5kZW50ZWQgZm9ybS4KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgICAgIGRlZiB0ZXN0KCk6Ci0gICAgICAgICAgICAjIGVuZCBmaXJzdCBsaW5lIHdpdGggXCB0byBhdm9pZCB0aGUgZW1wdHkgbGluZSEKLSAgICAgICAgICAgIHMgPSAnJydcCi0gICAgICAgICAgICBoZWxsbwotICAgICAgICAgICAgICB3b3JsZAotICAgICAgICAgICAgJycnCi0gICAgICAgICAgICBwcmludCByZXByKHMpICAgICAgICAgICMgcHJpbnRzICcgICAgaGVsbG9cbiAgICAgIHdvcmxkXG4gICAgJwotICAgICAgICAgICAgcHJpbnQgcmVwcihkZWRlbnQocykpICAjIHByaW50cyAnaGVsbG9cbiAgd29ybGRcbicKKyAgICBOb3RlIHRoYXQgdGFicyBhbmQgc3BhY2VzIGFyZSBib3RoIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSwgYnV0IHRoZXkKKyAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgIiAgaGVsbG8iIGFuZCAiXHRoZWxsbyIgYXJlCisgICAgY29uc2lkZXJlZCB0byBoYXZlIG5vIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuICAoVGhpcyBiZWhhdmlvdXIgaXMKKyAgICBuZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkKKyAgICBleHBhbmRlZCB0YWJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuKQogICAgICIiIgotICAgIGxpbmVzID0gdGV4dC5leHBhbmR0YWJzKCkuc3BsaXQoJ1xuJykKKyAgICAjIExvb2sgZm9yIHRoZSBsb25nZXN0IGxlYWRpbmcgc3RyaW5nIG9mIHNwYWNlcyBhbmQgdGFicyBjb21tb24gdG8KKyAgICAjIGFsbCBsaW5lcy4KICAgICBtYXJnaW4gPSBOb25lCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIGNvbnRlbnQgPSBsaW5lLmxzdHJpcCgpCi0gICAgICAgIGlmIG5vdCBjb250ZW50OgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaW5kZW50ID0gbGVuKGxpbmUpIC0gbGVuKGNvbnRlbnQpCisgICAgdGV4dCA9IF93aGl0ZXNwYWNlX29ubHlfcmUuc3ViKCcnLCB0ZXh0KQorICAgIGluZGVudHMgPSBfbGVhZGluZ193aGl0ZXNwYWNlX3JlLmZpbmRhbGwodGV4dCkKKyAgICBmb3IgaW5kZW50IGluIGluZGVudHM6CiAgICAgICAgIGlmIG1hcmdpbiBpcyBOb25lOgogICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50CisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgbW9yZSBkZWVwbHkgaW5kZW50ZWQgdGhhbiBwcmV2aW91cyB3aW5uZXI6CisgICAgICAgICMgbm8gY2hhbmdlIChwcmV2aW91cyB3aW5uZXIgaXMgc3RpbGwgb24gdG9wKS4KKyAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOgorICAgICAgICAjIGl0J3MgdGhlIG5ldyB3aW5uZXIuCisgICAgICAgIGVsaWYgbWFyZ2luLnN0YXJ0c3dpdGgoaW5kZW50KToKKyAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudAorCisgICAgICAgICMgQ3VycmVudCBsaW5lIGFuZCBwcmV2aW91cyB3aW5uZXIgaGF2ZSBubyBjb21tb24gd2hpdGVzcGFjZToKKyAgICAgICAgIyB0aGVyZSBpcyBubyBtYXJnaW4uCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtYXJnaW4gPSBtaW4obWFyZ2luLCBpbmRlbnQpCisgICAgICAgICAgICBtYXJnaW4gPSAiIgorICAgICAgICAgICAgYnJlYWsKIAotICAgIGlmIG1hcmdpbiBpcyBub3QgTm9uZSBhbmQgbWFyZ2luID4gMDoKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6Ci0gICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldW21hcmdpbjpdCisgICAgIyBzYW5pdHkgY2hlY2sgKHRlc3RpbmcvZGVidWdnaW5nIG9ubHkpCisgICAgaWYgMCBhbmQgbWFyZ2luOgorICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aChtYXJnaW4pLCBcCisgICAgICAgICAgICAgICAgICAgImxpbmUgPSAlciwgbWFyZ2luID0gJXIiICUgKGxpbmUsIG1hcmdpbikKIAotICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCisgICAgaWYgbWFyZ2luOgorICAgICAgICB0ZXh0ID0gcmUuc3ViKHInKD9tKV4nICsgbWFyZ2luLCAnJywgdGV4dCkKKyAgICByZXR1cm4gdGV4dAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICNwcmludCBkZWRlbnQoIlx0Zm9vXG5cdGJhciIpCisgICAgI3ByaW50IGRlZGVudCgiICBcdGhlbGxvIHRoZXJlXG4gIFx0ICBob3cgYXJlIHlvdT8iKQorICAgIHByaW50IGRlZGVudCgiSGVsbG8gdGhlcmUuXG4gIFRoaXMgaXMgaW5kZW50ZWQuIikKZGlmZiAtLWdpdCBhL0xpYi90aHJlYWRpbmcucHkgYi9MaWIvdGhyZWFkaW5nLnB5CmluZGV4IGMyNzE0MGQuLjU2NTVkZGUgMTAwNjQ0Ci0tLSBhL0xpYi90aHJlYWRpbmcucHkKKysrIGIvTGliL3RocmVhZGluZy5weQpAQCAtMTUsNyArMTUsNyBAQAogIyBSZW5hbWUgc29tZSBzdHVmZiBzbyAiZnJvbSB0aHJlYWRpbmcgaW1wb3J0ICoiIGlzIHNhZmUKIF9fYWxsX18gPSBbJ2FjdGl2ZUNvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50VGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCiAgICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsCi0gICAgICAgICAgICdUaW1lcicsICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJ10KKyAgICAgICAgICAgJ1RpbWVyJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCiAKIF9zdGFydF9uZXdfdGhyZWFkID0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKIF9hbGxvY2F0ZV9sb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2sKQEAgLTcxMyw2ICs3MTMsOCBAQAogICAgIF9hY3RpdmVfbGltYm9fbG9jay5yZWxlYXNlKCkKICAgICByZXR1cm4gYWN0aXZlCiAKK2Zyb20gdGhyZWFkIGltcG9ydCBzdGFja19zaXplCisKICMgQ3JlYXRlIHRoZSBtYWluIHRocmVhZCBvYmplY3QKIAogX01haW5UaHJlYWQoKQpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlLnB5IGIvTGliL3RyYWNlLnB5CmluZGV4IGNhNjI5NGUuLmRiMzZlMWQgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZS5weQorKysgYi9MaWIvdHJhY2UucHkKQEAgLTI4NSw3ICsyODUsNyBAQAogICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gIjxzdHJpbmc+IjoKICAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnB5YyIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIucHlvIik6CisgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKToKICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KIAogICAgICAgICAgICAgaWYgY292ZXJkaXIgaXMgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi90cmFjZWJhY2sucHkgYi9MaWIvdHJhY2ViYWNrLnB5CmluZGV4IGY1YzRiMjkuLmVmZDBmNzUgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZWJhY2sucHkKKysrIGIvTGliL3RyYWNlYmFjay5weQpAQCAtMTUwLDUwICsxNTAsNTMgQEAKIAogICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBleGNlcHRpb24gdHlwZSBhbmQgdmFsdWUgc3VjaCBhcyBnaXZlbiBieQogICAgIHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZgotICAgIHN0cmluZ3MsIGVhY2ggZW5kaW5nIGluIGEgbmV3bGluZS4gIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhCi0gICAgc2luZ2xlIHN0cmluZzsgaG93ZXZlciwgZm9yIFN5bnRheEVycm9yIGV4Y2VwdGlvbnMsIGl0IGNvbnRhaW5zCi0gICAgc2V2ZXJhbCBsaW5lcyB0aGF0ICh3aGVuIHByaW50ZWQpIGRpc3BsYXkgZGV0YWlsZWQgaW5mb3JtYXRpb24KLSAgICBhYm91dCB3aGVyZSB0aGUgc3ludGF4IGVycm9yIG9jY3VycmVkLiAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZwotICAgIHdoaWNoIGV4Y2VwdGlvbiBvY2N1cnJlZCBpcyB0aGUgYWx3YXlzIGxhc3Qgc3RyaW5nIGluIHRoZSBsaXN0LgorICAgIHN0cmluZ3MsIGVhY2ggZW5kaW5nIGluIGEgbmV3bGluZS4KKworICAgIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhIHNpbmdsZSBzdHJpbmc7IGhvd2V2ZXIsIGZvcgorICAgIFN5bnRheEVycm9yIGV4Y2VwdGlvbnMsIGl0IGNvbnRhaW5zIHNldmVyYWwgbGluZXMgdGhhdCAod2hlbgorICAgIHByaW50ZWQpIGRpc3BsYXkgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIHN5bnRheAorICAgIGVycm9yIG9jY3VycmVkLgorCisgICAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24gb2NjdXJyZWQgaXMgYWx3YXlzIHRoZSBsYXN0CisgICAgc3RyaW5nIGluIHRoZSBsaXN0LgorCiAgICAgIiIiCi0gICAgbGlzdCA9IFtdCi0gICAgaWYgKHR5cGUoZXR5cGUpID09IHR5cGVzLkNsYXNzVHlwZQotICAgICAgICBvciAoaXNpbnN0YW5jZShldHlwZSwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXR5cGUsIEJhc2VFeGNlcHRpb24pKSk6Ci0gICAgICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KKworICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KKworICAgIGlmIG5vdCBpc3N1YmNsYXNzKGV0eXBlLCBTeW50YXhFcnJvcik6CisgICAgICAgIHJldHVybiBbX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpXQorCisgICAgIyBJdCB3YXMgYSBzeW50YXggZXJyb3I7IHNob3cgZXhhY3RseSB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZm91bmQuCisgICAgbGluZXMgPSBbXQorICAgIHRyeToKKyAgICAgICAgbXNnLCAoZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBiYWRsaW5lKSA9IHZhbHVlCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcwogICAgIGVsc2U6Ci0gICAgICAgIHN0eXBlID0gZXR5cGUKLSAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICBsaXN0LmFwcGVuZChzdHIoc3R5cGUpICsgJ1xuJykKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSBvciAiPHN0cmluZz4iCisgICAgICAgIGxpbmVzLmFwcGVuZCgnICBGaWxlICIlcyIsIGxpbmUgJWRcbicgJSAoZmlsZW5hbWUsIGxpbmVubykpCisgICAgICAgIGlmIGJhZGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAlc1xuJyAlIGJhZGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZVs6b2Zmc2V0XS5sc3RyaXAoKQorICAgICAgICAgICAgICAgICMgbm9uLXNwYWNlIHdoaXRlc3BhY2UgKGxpa2VzIHRhYnMpIG11c3QgYmUga2VwdCBmb3IgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgY2FyZXRzcGFjZSA9ICgoYy5pc3NwYWNlKCkgYW5kIGMgb3IgJyAnKSBmb3IgYyBpbiBjYXJldHNwYWNlKQorICAgICAgICAgICAgICAgICMgb25seSB0aHJlZSBzcGFjZXMgdG8gYWNjb3VudCBmb3Igb2Zmc2V0MSA9PSBwb3MgMAorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgJXNeXG4nICUgJycuam9pbihjYXJldHNwYWNlKSkKKyAgICAgICAgICAgIHZhbHVlID0gbXNnCisKKyAgICBsaW5lcy5hcHBlbmQoX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpKQorICAgIHJldHVybiBsaW5lcworCitkZWYgX2Zvcm1hdF9maW5hbF9leGNfbGluZShldHlwZSwgdmFsdWUpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYSBzaW5nbGUgbGluZSAtLSBub3JtYWwgY2FzZSBmb3IgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5IiIiCisgICAgdmFsdWVzdHIgPSBfc29tZV9zdHIodmFsdWUpCisgICAgaWYgdmFsdWUgaXMgTm9uZSBvciBub3QgdmFsdWVzdHI6CisgICAgICAgIGxpbmUgPSAiJXNcbiIgJSBldHlwZQogICAgIGVsc2U6Ci0gICAgICAgIGlmIGlzc3ViY2xhc3MoZXR5cGUsIFN5bnRheEVycm9yKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gdmFsdWUKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZTogZmlsZW5hbWUgPSAiPHN0cmluZz4iCi0gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoJyAgRmlsZSAiJXMiLCBsaW5lICVkXG4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsIGxpbmVubykpCi0gICAgICAgICAgICAgICAgaWYgbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgaSA8IGxlbihsaW5lKSBhbmQgbGluZVtpXS5pc3NwYWNlKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKCcgICAgJXNcbicgJSBsaW5lLnN0cmlwKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnICAgICcKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGxpbmVbaTpvZmZzZXQtMV06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYy5pc3NwYWNlKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgJyAnCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZCgnJXNeXG4nICUgcykKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtc2cKLSAgICAgICAgcyA9IF9zb21lX3N0cih2YWx1ZSkKLSAgICAgICAgaWYgczoKLSAgICAgICAgICAgIGxpc3QuYXBwZW5kKCclczogJXNcbicgJSAoc3RyKHN0eXBlKSwgcykpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsaXN0LmFwcGVuZCgnJXNcbicgJSBzdHIoc3R5cGUpKQotICAgIHJldHVybiBsaXN0CisgICAgICAgIGxpbmUgPSAiJXM6ICVzXG4iICUgKGV0eXBlLCB2YWx1ZXN0cikKKyAgICByZXR1cm4gbGluZQogCiBkZWYgX3NvbWVfc3RyKHZhbHVlKToKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdHlwZXMucHkgYi9MaWIvdHlwZXMucHkKaW5kZXggZGI2M2M5Ni4uNWE4OWFkMSAxMDA2NDQKLS0tIGEvTGliL3R5cGVzLnB5CisrKyBiL0xpYi90eXBlcy5weQpAQCAtODQsNCArODQsMTYgQEAKIERpY3RQcm94eVR5cGUgPSB0eXBlKFR5cGVUeXBlLl9fZGljdF9fKQogTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZCkKIAotZGVsIHN5cywgX2YsIF9nLCBfQyAgICAgICAgICAgICAgICAgIyBOb3QgZm9yIGV4cG9ydAorIyBFeHRlbnNpb24gdHlwZXMgZGVmaW5lZCBpbiBhIEMgaGVscGVyIG1vZHVsZS4gIFhYWCBUaGVyZSBtYXkgYmUgbm8KKyMgZXF1aXZhbGVudCBpbiBpbXBsZW1lbnRhdGlvbnMgb3RoZXIgdGhhbiBDUHl0aG9uLCBzbyBpdCBzZWVtcyBiZXR0ZXIgdG8KKyMgbGVhdmUgdGhlbSB1bmRlZmluZWQgdGhlbiB0byBzZXQgdGhlbSB0byBlLmcuIE5vbmUuCit0cnk6CisgICAgaW1wb3J0IF90eXBlcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgR2V0U2V0RGVzY3JpcHRvclR5cGUgPSB0eXBlKF90eXBlcy5IZWxwZXIuZ2V0dGVyKQorICAgIE1lbWJlckRlc2NyaXB0b3JUeXBlID0gdHlwZShfdHlwZXMuSGVscGVyLm1lbWJlcikKKyAgICBkZWwgX3R5cGVzCisKK2RlbCBzeXMsIF9mLCBfZywgX0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZm9yIGV4cG9ydApkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggZjBhZTUzYS4uZDJhNGM0OCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgICAgc2VsZi5wcm94aWVzID0gcHJveGllcwogICAgICAgICBzZWxmLmtleV9maWxlID0geDUwOS5nZXQoJ2tleV9maWxlJykKICAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSB4NTA5LmdldCgnY2VydF9maWxlJykKLSAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1hZ2VudCcsIHNlbGYudmVyc2lvbildCisgICAgICAgIHNlbGYuYWRkaGVhZGVycyA9IFsoJ1VzZXItQWdlbnQnLCBzZWxmLnZlcnNpb24pXQogICAgICAgICBzZWxmLl9fdGVtcGZpbGVzID0gW10KICAgICAgICAgc2VsZi5fX3VubGluayA9IG9zLnVubGluayAjIFNlZSBjbGVhbnVwKCkKICAgICAgICAgc2VsZi50ZW1wY2FjaGUgPSBOb25lCkBAIC0zMTQsOCArMzE0LDggQEAKICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUChob3N0KQogICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZWN0b3IpCi0gICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCi0gICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQorICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKQorICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGgucHV0cmVxdWVzdCgnR0VUJywgc2VsZWN0b3IpCiAgICAgICAgIGlmIHByb3h5X2F1dGg6IGgucHV0aGVhZGVyKCdQcm94eS1BdXRob3JpemF0aW9uJywgJ0Jhc2ljICVzJyAlIHByb3h5X2F1dGgpCkBAIC00MDAsOSArNDAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRfZmlsZSkKICAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScsCisgICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCi0gICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKKyAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ0dFVCcsIHNlbGVjdG9yKQogICAgICAgICAgICAgaWYgcHJveHlfYXV0aDogaC5wdXRoZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb246IEJhc2ljICVzJyAlIHByb3h5X2F1dGgpCkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkYXRhID0gdW5xdW90ZShkYXRhKQotICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LWxlbmd0aDogJWQnICUgbGVuKGRhdGEpKQorICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LUxlbmd0aDogJWQnICUgbGVuKGRhdGEpKQogICAgICAgICBtc2cuYXBwZW5kKCcnKQogICAgICAgICBtc2cuYXBwZW5kKGRhdGEpCiAgICAgICAgIG1zZyA9ICdcbicuam9pbihtc2cpCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDIyNzMxMWMuLjZlZTllMmMgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC0yNjMsMTEgKzI2MywxMSBAQAogCiAgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICAjIHVzZWZ1bCBmb3Igc29tZXRoaW5nIGxpa2UgYXV0aGVudGljYXRpb24KLSAgICAgICAgc2VsZi5oZWFkZXJzW2tleS5jYXBpdGFsaXplKCldID0gdmFsCisgICAgICAgIHNlbGYuaGVhZGVyc1trZXkudGl0bGUoKV0gPSB2YWwKIAogICAgIGRlZiBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgICMgd2lsbCBub3QgYmUgYWRkZWQgdG8gYSByZWRpcmVjdGVkIHJlcXVlc3QKLSAgICAgICAgc2VsZi51bnJlZGlyZWN0ZWRfaGRyc1trZXkuY2FwaXRhbGl6ZSgpXSA9IHZhbAorICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzW2tleS50aXRsZSgpXSA9IHZhbAogCiAgICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgaGVhZGVyX25hbWUpOgogICAgICAgICByZXR1cm4gKGhlYWRlcl9uYW1lIGluIHNlbGYuaGVhZGVycyBvcgpAQCAtMjg2LDcgKzI4Niw3IEBACiBjbGFzcyBPcGVuZXJEaXJlY3RvcjoKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIGNsaWVudF92ZXJzaW9uID0gIlB5dGhvbi11cmxsaWIvJXMiICUgX192ZXJzaW9uX18KLSAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1hZ2VudCcsIGNsaWVudF92ZXJzaW9uKV0KKyAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1BZ2VudCcsIGNsaWVudF92ZXJzaW9uKV0KICAgICAgICAgIyBtYW5hZ2UgdGhlIGluZGl2aWR1YWwgaGFuZGxlcnMKICAgICAgICAgc2VsZi5oYW5kbGVycyA9IFtdCiAgICAgICAgIHNlbGYuaGFuZGxlX29wZW4gPSB7fQpAQCAtNjc1LDcgKzY3NSw3IEBACiAgICAgICAgIGlmIHVzZXIgYW5kIHBhc3N3b3JkOgogICAgICAgICAgICAgdXNlcl9wYXNzID0gJyVzOiVzJyAlICh1bnF1b3RlKHVzZXIpLCB1bnF1b3RlKHBhc3N3b3JkKSkKICAgICAgICAgICAgIGNyZWRzID0gYmFzZTY0LmVuY29kZXN0cmluZyh1c2VyX3Bhc3MpLnN0cmlwKCkKLSAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1hdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBjcmVkcykKKyAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1BdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBjcmVkcykKICAgICAgICAgaG9zdHBvcnQgPSB1bnF1b3RlKGhvc3Rwb3J0KQogICAgICAgICByZXEuc2V0X3Byb3h5KGhvc3Rwb3J0LCBwcm94eV90eXBlKQogICAgICAgICBpZiBvcmlnX3R5cGUgPT0gcHJveHlfdHlwZToKQEAgLTgxOSw3ICs4MTksNyBAQAogCiBjbGFzcyBQcm94eUJhc2ljQXV0aEhhbmRsZXIoQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyLCBCYXNlSGFuZGxlcik6CiAKLSAgICBhdXRoX2hlYWRlciA9ICdQcm94eS1hdXRob3JpemF0aW9uJworICAgIGF1dGhfaGVhZGVyID0gJ1Byb3h5LUF1dGhvcml6YXRpb24nCiAKICAgICBkZWYgaHR0cF9lcnJvcl80MDcoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKICAgICAgICAgIyBodHRwX2Vycm9yX2F1dGhfcmVxZWQgcmVxdWlyZXMgdGhhdCB0aGVyZSBpcyBubyB1c2VyaW5mbyBjb21wb25lbnQgaW4KQEAgLTEwMjIsMjAgKzEwMjIsMjAgQEAKIAogICAgICAgICBpZiByZXF1ZXN0Lmhhc19kYXRhKCk6ICAjIFBPU1QKICAgICAgICAgICAgIGRhdGEgPSByZXF1ZXN0LmdldF9kYXRhKCkKLSAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtdHlwZScpOgorICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC1UeXBlJyk6CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZScsCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnLAogICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKLSAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJyk6CisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LUxlbmd0aCcpOgogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCiAKICAgICAgICAgc2NoZW1lLCBzZWwgPSBzcGxpdHR5cGUocmVxdWVzdC5nZXRfc2VsZWN0b3IoKSkKICAgICAgICAgc2VsX2hvc3QsIHNlbF9wYXRoID0gc3BsaXRob3N0KHNlbCkKICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignSG9zdCcpOgogICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcignSG9zdCcsIHNlbF9ob3N0IG9yIGhvc3QpCiAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZWxmLnBhcmVudC5hZGRoZWFkZXJzOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICBuYW1lID0gbmFtZS50aXRsZSgpCiAgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKG5hbWUpOgogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIobmFtZSwgdmFsdWUpCiAKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAgICAgICAgIG1vZGlmaWVkID0gZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZShzdGF0cy5zdF9tdGltZSwgdXNlZ210PVRydWUpCiAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZSlbMF0KICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKAotICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZTogJXNcbkNvbnRlbnQtbGVuZ3RoOiAlZFxuTGFzdC1tb2RpZmllZDogJXNcbicgJQorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXNcbkNvbnRlbnQtTGVuZ3RoOiAlZFxuTGFzdC1Nb2RpZmllZDogJXNcbicgJQogICAgICAgICAgICAgKG10eXBlIG9yICd0ZXh0L3BsYWluJywgc2l6ZSwgbW9kaWZpZWQpKSkKICAgICAgICAgaWYgaG9zdDoKICAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKQEAgLTEyNzIsOSArMTI3Miw5IEBACiAgICAgICAgICAgICBoZWFkZXJzID0gIiIKICAgICAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUocmVxLmdldF9mdWxsX3VybCgpKVswXQogICAgICAgICAgICAgaWYgbXR5cGU6Ci0gICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC10eXBlOiAlc1xuIiAlIG10eXBlCisgICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1UeXBlOiAlc1xuIiAlIG10eXBlCiAgICAgICAgICAgICBpZiByZXRybGVuIGlzIG5vdCBOb25lIGFuZCByZXRybGVuID49IDA6Ci0gICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1sZW5ndGg6ICVkXG4iICUgcmV0cmxlbgorICAgICAgICAgICAgICAgIGhlYWRlcnMgKz0gIkNvbnRlbnQtTGVuZ3RoOiAlZFxuIiAlIHJldHJsZW4KICAgICAgICAgICAgIHNmID0gU3RyaW5nSU8oaGVhZGVycykKICAgICAgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShzZikKICAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCmRpZmYgLS1naXQgYS9MaWIvdXVpZC5weSBiL0xpYi91dWlkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdXVpZC5weQpAQCAtMCwwICsxLDUxNSBAQAorciIiIlVVSUQgb2JqZWN0cyAodW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzKSBhY2NvcmRpbmcgdG8gUkZDIDQxMjIuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGltbXV0YWJsZSBVVUlEIG9iamVjdHMgKGNsYXNzIFVVSUQpIGFuZCB0aGUgZnVuY3Rpb25zCit1dWlkMSgpLCB1dWlkMygpLCB1dWlkNCgpLCB1dWlkNSgpIGZvciBnZW5lcmF0aW5nIHZlcnNpb24gMSwgMywgNCwgYW5kIDUKK1VVSURzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMi4KKworSWYgYWxsIHlvdSB3YW50IGlzIGEgdW5pcXVlIElELCB5b3Ugc2hvdWxkIHByb2JhYmx5IGNhbGwgdXVpZDEoKSBvciB1dWlkNCgpLgorTm90ZSB0aGF0IHV1aWQxKCkgbWF5IGNvbXByb21pc2UgcHJpdmFjeSBzaW5jZSBpdCBjcmVhdGVzIGEgVVVJRCBjb250YWluaW5nCit0aGUgY29tcHV0ZXIncyBuZXR3b3JrIGFkZHJlc3MuICB1dWlkNCgpIGNyZWF0ZXMgYSByYW5kb20gVVVJRC4KKworVHlwaWNhbCB1c2FnZToKKworICAgID4+PiBpbXBvcnQgdXVpZAorCisgICAgIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCisgICAgPj4+IHV1aWQudXVpZDEoKQorICAgIFVVSUQoJ2E4MDk4YzFhLWY4NmUtMTFkYS1iZDFhLTAwMTEyNDQ0YmUxZScpCisKKyAgICAjIG1ha2UgYSBVVUlEIHVzaW5nIGFuIE1ENSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQorICAgID4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorICAgIFVVSUQoJzZmYTQ1OWVhLWVlOGEtM2NhNC04OTRlLWRiNzdlMTYwMzU1ZScpCisKKyAgICAjIG1ha2UgYSByYW5kb20gVVVJRAorICAgID4+PiB1dWlkLnV1aWQ0KCkKKyAgICBVVUlEKCcxNmZkMjcwNi04YmFmLTQzM2ItODJlYi04YzdmYWRhODQ3ZGEnKQorCisgICAgIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCisgICAgPj4+IHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCisgICAgVVVJRCgnODg2MzEzZTEtM2I4YS01MzcyLTliOTAtMGM5YWVlMTk5ZTVkJykKKworICAgICMgbWFrZSBhIFVVSUQgZnJvbSBhIHN0cmluZyBvZiBoZXggZGlnaXRzIChicmFjZXMgYW5kIGh5cGhlbnMgaWdub3JlZCkKKyAgICA+Pj4geCA9IHV1aWQuVVVJRCgnezAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZn0nKQorCisgICAgIyBjb252ZXJ0IGEgVVVJRCB0byBhIHN0cmluZyBvZiBoZXggZGlnaXRzIGluIHN0YW5kYXJkIGZvcm0KKyAgICA+Pj4gc3RyKHgpCisgICAgJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicKKworICAgICMgZ2V0IHRoZSByYXcgMTYgYnl0ZXMgb2YgdGhlIFVVSUQKKyAgICA+Pj4geC5ieXRlcworICAgICdceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuXHgwYlx4MGNcclx4MGVceDBmJworCisgICAgIyBtYWtlIGEgVVVJRCBmcm9tIGEgMTYtYnl0ZSBzdHJpbmcKKyAgICA+Pj4gdXVpZC5VVUlEKGJ5dGVzPXguYnl0ZXMpCisgICAgVVVJRCgnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJykKKyIiIgorCitfX2F1dGhvcl9fID0gJ0thLVBpbmcgWWVlIDxwaW5nQHplc3R5LmNhPicKK19fZGF0ZV9fID0gJyREYXRlOiAyMDA2LzA2LzEyIDIzOjE1OjQwICQnLnNwbGl0KClbMV0ucmVwbGFjZSgnLycsICctJykKK19fdmVyc2lvbl9fID0gJyRSZXZpc2lvbjogMS4zMCAkJy5zcGxpdCgpWzFdCisKK1JFU0VSVkVEX05DUywgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgUkVTRVJWRURfRlVUVVJFID0gWworICAgICdyZXNlcnZlZCBmb3IgTkNTIGNvbXBhdGliaWxpdHknLCAnc3BlY2lmaWVkIGluIFJGQyA0MTIyJywKKyAgICAncmVzZXJ2ZWQgZm9yIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5JywgJ3Jlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbiddCisKK2NsYXNzIFVVSUQob2JqZWN0KToKKyAgICAiIiJJbnN0YW5jZXMgb2YgdGhlIFVVSUQgY2xhc3MgcmVwcmVzZW50IFVVSURzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMi4KKyAgICBVVUlEIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgaGFzaGFibGUsIGFuZCB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgorICAgIENvbnZlcnRpbmcgYSBVVUlEIHRvIGEgc3RyaW5nIHdpdGggc3RyKCkgeWllbGRzIHNvbWV0aGluZyBpbiB0aGUgZm9ybQorICAgICcxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMnLiAgVGhlIFVVSUQgY29uc3RydWN0b3IgYWNjZXB0cworICAgIGZvdXIgcG9zc2libGUgZm9ybXM6IGEgc2ltaWxhciBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLCBvciBhCisgICAgc3RyaW5nIG9mIDE2IHJhdyBieXRlcyBhcyBhbiBhcmd1bWVudCBuYW1lZCAnYnl0ZXMnLCBvciBhIHR1cGxlIG9mCisgICAgc2l4IGludGVnZXIgZmllbGRzICh3aXRoIDMyLWJpdCwgMTYtYml0LCAxNi1iaXQsIDgtYml0LCA4LWJpdCwgYW5kCisgICAgNDgtYml0IHZhbHVlcyByZXNwZWN0aXZlbHkpIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdmaWVsZHMnLCBvciBhIHNpbmdsZQorICAgIDEyOC1iaXQgaW50ZWdlciBhcyBhbiBhcmd1bWVudCBuYW1lZCAnaW50Jy4KKworICAgIFVVSURzIGhhdmUgdGhlc2UgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6CisKKyAgICAgICAgYnl0ZXMgICAgICAgdGhlIFVVSUQgYXMgYSAxNi1ieXRlIHN0cmluZworCisgICAgICAgIGZpZWxkcyAgICAgIGEgdHVwbGUgb2YgdGhlIHNpeCBpbnRlZ2VyIGZpZWxkcyBvZiB0aGUgVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIGFsc28gYXZhaWxhYmxlIGFzIHNpeCBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIHR3byBkZXJpdmVkIGF0dHJpYnV0ZXM6CisKKyAgICAgICAgICAgIHRpbWVfbG93ICAgICAgICAgICAgICAgIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX21pZCAgICAgICAgICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX2hpX3ZlcnNpb24gICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCAgICB0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIGNsb2NrX3NlcV9sb3cgICAgICAgICAgIHRoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgbm9kZSAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgNDggYml0cyBvZiB0aGUgVVVJRAorCisgICAgICAgICAgICB0aW1lICAgICAgICAgICAgICAgICAgICB0aGUgNjAtYml0IHRpbWVzdGFtcAorICAgICAgICAgICAgY2xvY2tfc2VxICAgICAgICAgICAgICAgdGhlIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXIKKworICAgICAgICBoZXggICAgICAgICB0aGUgVVVJRCBhcyBhIDMyLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcKKworICAgICAgICBpbnQgICAgICAgICB0aGUgVVVJRCBhcyBhIDEyOC1iaXQgaW50ZWdlcgorCisgICAgICAgIHVybiAgICAgICAgIHRoZSBVVUlEIGFzIGEgVVJOIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMgorCisgICAgICAgIHZhcmlhbnQgICAgIHRoZSBVVUlEIHZhcmlhbnQgKG9uZSBvZiB0aGUgY29uc3RhbnRzIFJFU0VSVkVEX05DUywKKyAgICAgICAgICAgICAgICAgICAgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgb3IgUkVTRVJWRURfRlVUVVJFKQorCisgICAgICAgIHZlcnNpb24gICAgIHRoZSBVVUlEIHZlcnNpb24gbnVtYmVyICgxIHRocm91Z2ggNSwgbWVhbmluZ2Z1bCBvbmx5CisgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHZhcmlhbnQgaXMgUkZDXzQxMjIpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGV4PU5vbmUsIGJ5dGVzPU5vbmUsIGZpZWxkcz1Ob25lLCBpbnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1Ob25lKToKKyAgICAgICAgciIiIkNyZWF0ZSBhIFVVSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb2YgMzIgaGV4YWRlY2ltYWwgZGlnaXRzLAorICAgICAgICBhIHN0cmluZyBvZiAxNiBieXRlcyBhcyB0aGUgJ2J5dGVzJyBhcmd1bWVudCwgYSB0dXBsZSBvZiBzaXgKKyAgICAgICAgaW50ZWdlcnMgKDMyLWJpdCB0aW1lX2xvdywgMTYtYml0IHRpbWVfbWlkLCAxNi1iaXQgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICA4LWJpdCBjbG9ja19zZXFfaGlfdmFyaWFudCwgOC1iaXQgY2xvY2tfc2VxX2xvdywgNDgtYml0IG5vZGUpIGFzCisgICAgICAgIHRoZSAnZmllbGRzJyBhcmd1bWVudCwgb3IgYSBzaW5nbGUgMTI4LWJpdCBpbnRlZ2VyIGFzIHRoZSAnaW50JworICAgICAgICBhcmd1bWVudC4gIFdoZW4gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpcyBnaXZlbiwgY3VybHkgYnJhY2VzLAorICAgICAgICBoeXBoZW5zLCBhbmQgYSBVUk4gcHJlZml4IGFyZSBhbGwgb3B0aW9uYWwuICBGb3IgZXhhbXBsZSwgdGhlc2UKKyAgICAgICAgZXhwcmVzc2lvbnMgYWxsIHlpZWxkIHRoZSBzYW1lIFVVSUQ6CisKKyAgICAgICAgVVVJRCgnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nKQorICAgICAgICBVVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoYnl0ZXM9J1x4MTJceDM0XHg1Nlx4NzgnKjQpCisgICAgICAgIFVVSUQoZmllbGRzPSgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpKQorICAgICAgICBVVUlEKGludD0weDEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4KQorCisgICAgICAgIEV4YWN0bHkgb25lIG9mICdoZXgnLCAnYnl0ZXMnLCAnZmllbGRzJywgb3IgJ2ludCcgbXVzdCBiZSBnaXZlbi4KKyAgICAgICAgVGhlICd2ZXJzaW9uJyBhcmd1bWVudCBpcyBvcHRpb25hbDsgaWYgZ2l2ZW4sIHRoZSByZXN1bHRpbmcgVVVJRAorICAgICAgICB3aWxsIGhhdmUgaXRzIHZhcmlhbnQgYW5kIHZlcnNpb24gbnVtYmVyIHNldCBhY2NvcmRpbmcgdG8gUkZDIDQxMjIsCisgICAgICAgIG92ZXJyaWRpbmcgYml0cyBpbiB0aGUgZ2l2ZW4gJ2hleCcsICdieXRlcycsICdmaWVsZHMnLCBvciAnaW50Jy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgW2hleCwgYnl0ZXMsIGZpZWxkcywgaW50XS5jb3VudChOb25lKSAhPSAzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCduZWVkIGp1c3Qgb25lIG9mIGhleCwgYnl0ZXMsIGZpZWxkcywgb3IgaW50JykKKyAgICAgICAgaWYgaGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaGV4ID0gaGV4LnJlcGxhY2UoJ3VybjonLCAnJykucmVwbGFjZSgndXVpZDonLCAnJykKKyAgICAgICAgICAgIGhleCA9IGhleC5zdHJpcCgne30nKS5yZXBsYWNlKCctJywgJycpCisgICAgICAgICAgICBpZiBsZW4oaGV4KSAhPSAzMjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdiYWRseSBmb3JtZWQgaGV4YWRlY2ltYWwgVVVJRCBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZyhoZXgsIDE2KQorICAgICAgICBpZiBieXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihieXRlcykgIT0gMTY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYnl0ZXMgaXMgbm90IGEgMTYtY2hhciBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZygoJyUwMngnKjE2KSAlIHR1cGxlKG1hcChvcmQsIGJ5dGVzKSksIDE2KQorICAgICAgICBpZiBmaWVsZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oZmllbGRzKSAhPSA2OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkcyBpcyBub3QgYSA2LXR1cGxlJykKKyAgICAgICAgICAgICh0aW1lX2xvdywgdGltZV9taWQsIHRpbWVfaGlfdmVyc2lvbiwKKyAgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCwgY2xvY2tfc2VxX2xvdywgbm9kZSkgPSBmaWVsZHMKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHRpbWVfbG93IDwgMTw8MzJMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDEgb3V0IG9mIHJhbmdlIChuZWVkIGEgMzItYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSB0aW1lX21pZCA8IDE8PDE2TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCAyIG91dCBvZiByYW5nZSAobmVlZCBhIDE2LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gdGltZV9oaV92ZXJzaW9uIDwgMTw8MTZMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTYtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfaGlfdmFyaWFudCA8IDE8PDhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDQgb3V0IG9mIHJhbmdlIChuZWVkIGFuIDgtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfbG93IDwgMTw8OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNSBvdXQgb2YgcmFuZ2UgKG5lZWQgYW4gOC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IG5vZGUgPCAxPDw0OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNiBvdXQgb2YgcmFuZ2UgKG5lZWQgYSA0OC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGNsb2NrX3NlcSA9IChjbG9ja19zZXFfaGlfdmFyaWFudCA8PCA4TCkgfCBjbG9ja19zZXFfbG93CisgICAgICAgICAgICBpbnQgPSAoKHRpbWVfbG93IDw8IDk2TCkgfCAodGltZV9taWQgPDwgODBMKSB8CisgICAgICAgICAgICAgICAgICAgKHRpbWVfaGlfdmVyc2lvbiA8PCA2NEwpIHwgKGNsb2NrX3NlcSA8PCA0OEwpIHwgbm9kZSkKKyAgICAgICAgaWYgaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDAgPD0gaW50IDwgMTw8MTI4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnQgaXMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTI4LWJpdCB2YWx1ZSknKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDEgPD0gdmVyc2lvbiA8PSA1OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2lsbGVnYWwgdmVyc2lvbiBudW1iZXInKQorICAgICAgICAgICAgIyBTZXQgdGhlIHZhcmlhbnQgdG8gUkZDIDQxMjIuCisgICAgICAgICAgICBpbnQgJj0gfigweGMwMDAgPDwgNDhMKQorICAgICAgICAgICAgaW50IHw9IDB4ODAwMCA8PCA0OEwKKyAgICAgICAgICAgICMgU2V0IHRoZSB2ZXJzaW9uIG51bWJlci4KKyAgICAgICAgICAgIGludCAmPSB+KDB4ZjAwMCA8PCA2NEwpCisgICAgICAgICAgICBpbnQgfD0gdmVyc2lvbiA8PCA3NkwKKyAgICAgICAgc2VsZi5fX2RpY3RfX1snaW50J10gPSBpbnQKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVVVJRCk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuaW50LCBvdGhlci5pbnQpCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmludCkKKworICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdVVUlEKCVyKScgJSBzdHIoc2VsZikKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUnKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGhleCA9ICclMDMyeCcgJSBzZWxmLmludAorICAgICAgICByZXR1cm4gJyVzLSVzLSVzLSVzLSVzJyAlICgKKyAgICAgICAgICAgIGhleFs6OF0sIGhleFs4OjEyXSwgaGV4WzEyOjE2XSwgaGV4WzE2OjIwXSwgaGV4WzIwOl0pCisKKyAgICBkZWYgZ2V0X2J5dGVzKHNlbGYpOgorICAgICAgICBieXRlcyA9ICcnCisgICAgICAgIGZvciBzaGlmdCBpbiByYW5nZSgwLCAxMjgsIDgpOgorICAgICAgICAgICAgYnl0ZXMgPSBjaHIoKHNlbGYuaW50ID4+IHNoaWZ0KSAmIDB4ZmYpICsgYnl0ZXMKKyAgICAgICAgcmV0dXJuIGJ5dGVzCisKKyAgICBieXRlcyA9IHByb3BlcnR5KGdldF9ieXRlcykKKworICAgIGRlZiBnZXRfZmllbGRzKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYudGltZV9sb3csIHNlbGYudGltZV9taWQsIHNlbGYudGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIHNlbGYuY2xvY2tfc2VxX2xvdywgc2VsZi5ub2RlKQorCisgICAgZmllbGRzID0gcHJvcGVydHkoZ2V0X2ZpZWxkcykKKworICAgIGRlZiBnZXRfdGltZV9sb3coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCA+PiA5NkwKKworICAgIHRpbWVfbG93ID0gcHJvcGVydHkoZ2V0X3RpbWVfbG93KQorCisgICAgZGVmIGdldF90aW1lX21pZChzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA4MEwpICYgMHhmZmZmCisKKyAgICB0aW1lX21pZCA9IHByb3BlcnR5KGdldF90aW1lX21pZCkKKworICAgIGRlZiBnZXRfdGltZV9oaV92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDY0TCkgJiAweGZmZmYKKworICAgIHRpbWVfaGlfdmVyc2lvbiA9IHByb3BlcnR5KGdldF90aW1lX2hpX3ZlcnNpb24pCisKKyAgICBkZWYgZ2V0X2Nsb2NrX3NlcV9oaV92YXJpYW50KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDU2TCkgJiAweGZmCisKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfaGlfdmFyaWFudCkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxX2xvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA0OEwpICYgMHhmZgorCisgICAgY2xvY2tfc2VxX2xvdyA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfbG93KQorCisgICAgZGVmIGdldF90aW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi50aW1lX2hpX3ZlcnNpb24gJiAweDBmZmZMKSA8PCA0OEwpIHwKKyAgICAgICAgICAgICAgICAoc2VsZi50aW1lX21pZCA8PCAzMkwpIHwgc2VsZi50aW1lX2xvdykKKworICAgIHRpbWUgPSBwcm9wZXJ0eShnZXRfdGltZSkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2ZMKSA8PCA4TCkgfAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2xvdykKKworICAgIGNsb2NrX3NlcSA9IHByb3BlcnR5KGdldF9jbG9ja19zZXEpCisKKyAgICBkZWYgZ2V0X25vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCAmIDB4ZmZmZmZmZmZmZmZmCisKKyAgICBub2RlID0gcHJvcGVydHkoZ2V0X25vZGUpCisKKyAgICBkZWYgZ2V0X2hleChzZWxmKToKKyAgICAgICAgcmV0dXJuICclMDMyeCcgJSBzZWxmLmludAorCisgICAgaGV4ID0gcHJvcGVydHkoZ2V0X2hleCkKKworICAgIGRlZiBnZXRfdXJuKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3Vybjp1dWlkOicgKyBzdHIoc2VsZikKKworICAgIHVybiA9IHByb3BlcnR5KGdldF91cm4pCisKKyAgICBkZWYgZ2V0X3ZhcmlhbnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmludCAmICgweDgwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9OQ1MKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHg0MDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkZDXzQxMjIKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHgyMDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfTUlDUk9TT0ZUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfRlVUVVJFCisKKyAgICB2YXJpYW50ID0gcHJvcGVydHkoZ2V0X3ZhcmlhbnQpCisKKyAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhlIHZlcnNpb24gYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIGZvciBSRkMgNDEyMiBVVUlEcy4KKyAgICAgICAgaWYgc2VsZi52YXJpYW50ID09IFJGQ180MTIyOgorICAgICAgICAgICAgcmV0dXJuIGludCgoc2VsZi5pbnQgPj4gNzZMKSAmIDB4ZikKKworICAgIHZlcnNpb24gPSBwcm9wZXJ0eShnZXRfdmVyc2lvbikKKworZGVmIF9maW5kX21hYyhjb21tYW5kLCBhcmdzLCBod19pZGVudGlmaWVycywgZ2V0X2luZGV4KToKKyAgICBpbXBvcnQgb3MKKyAgICBmb3IgZGlyIGluIFsnJywgJy9zYmluLycsICcvdXNyL3NiaW4nXToKKyAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkaXIsIGNvbW1hbmQpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBMQ19BTEwgdG8gZ2V0IEVuZ2xpc2ggb3V0cHV0LCAyPi9kZXYvbnVsbCB0bworICAgICAgICAgICAgIyBwcmV2ZW50IG91dHB1dCBvbiBzdGRlcnIKKyAgICAgICAgICAgIGNtZCA9ICdMQ19BTEw9QyAlcyAlcyAyPi9kZXYvbnVsbCcgJSAoZXhlY3V0YWJsZSwgYXJncykKKyAgICAgICAgICAgIHBpcGUgPSBvcy5wb3BlbihjbWQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBmb3IgbGluZSBpbiBwaXBlOgorICAgICAgICAgICAgd29yZHMgPSBsaW5lLmxvd2VyKCkuc3BsaXQoKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHdvcmRzKSk6CisgICAgICAgICAgICAgICAgaWYgd29yZHNbaV0gaW4gaHdfaWRlbnRpZmllcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQod29yZHNbZ2V0X2luZGV4KGkpXS5yZXBsYWNlKCc6JywgJycpLCAxNikKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lmY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gVW5peCBieSBydW5uaW5nIGlmY29uZmlnLiIiIgorCisgICAgIyBUaGlzIHdvcmtzIG9uIExpbnV4ICgnJyBvciAnLWEnKSwgVHJ1NjQgKCctYXYnKSwgYnV0IG5vdCBhbGwgVW5peGVzLgorICAgIGZvciBhcmdzIGluICgnJywgJy1hJywgJy1hdicpOgorICAgICAgICBtYWMgPSBfZmluZF9tYWMoJ2lmY29uZmlnJywgYXJncywgWydod2FkZHInLCAnZXRoZXInXSwgbGFtYmRhIGk6IGkrMSkKKyAgICAgICAgaWYgbWFjOgorICAgICAgICAgICAgcmV0dXJuIG1hYworCisgICAgaW1wb3J0IHNvY2tldAorICAgIGlwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKworICAgICMgVHJ5IGdldHRpbmcgdGhlIE1BQyBhZGRyIGZyb20gYXJwIGJhc2VkIG9uIG91ciBJUCBhZGRyZXNzIChTb2xhcmlzKS4KKyAgICBtYWMgPSBfZmluZF9tYWMoJ2FycCcsICctYW4nLCBbaXBfYWRkcl0sIGxhbWJkYSBpOiAtMSkKKyAgICBpZiBtYWM6CisgICAgICAgIHJldHVybiBtYWMKKworICAgICMgVGhpcyBtaWdodCB3b3JrIG9uIEhQLVVYLgorICAgIG1hYyA9IF9maW5kX21hYygnbGFuc2NhbicsICctYWknLCBbJ2xhbjAnXSwgbGFtYmRhIGk6IDApCisgICAgaWYgbWFjOgorICAgICAgICByZXR1cm4gbWFjCisKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lwY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyBieSBydW5uaW5nIGlwY29uZmlnLmV4ZS4iIiIKKyAgICBpbXBvcnQgb3MsIHJlCisgICAgZGlycyA9IFsnJywgcidjOlx3aW5kb3dzXHN5c3RlbTMyJywgcidjOlx3aW5udFxzeXN0ZW0zMiddCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigzMDApCisgICAgICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U3lzdGVtRGlyZWN0b3J5QShidWZmZXIsIDMwMCkKKyAgICAgICAgZGlycy5pbnNlcnQoMCwgYnVmZmVyLnZhbHVlLmRlY29kZSgnbWJjcycpKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlwZSA9IG9zLnBvcGVuKG9zLnBhdGguam9pbihkaXIsICdpcGNvbmZpZycpICsgJyAvYWxsJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3IgbGluZSBpbiBwaXBlOgorICAgICAgICAgICAgdmFsdWUgPSBsaW5lLnNwbGl0KCc6JylbLTFdLnN0cmlwKCkubG93ZXIoKQorICAgICAgICAgICAgaWYgcmUubWF0Y2goJyhbMC05YS1mXVswLTlhLWZdLSl7NX1bMC05YS1mXVswLTlhLWZdJywgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUucmVwbGFjZSgnLScsICcnKSwgMTYpCisKK2RlZiBfbmV0Ymlvc19nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgTmV0QklPUyBjYWxscy4KKyAgICBTZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg2MjMgZm9yIGRldGFpbHMuIiIiCisgICAgaW1wb3J0IHdpbjMyd25ldCwgbmV0YmlvcworICAgIG5jYiA9IG5ldGJpb3MuTkNCKCkKKyAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCRU5VTQorICAgIG5jYi5CdWZmZXIgPSBhZGFwdGVycyA9IG5ldGJpb3MuTEFOQV9FTlVNKCkKKyAgICBhZGFwdGVycy5fcGFjaygpCisgICAgaWYgd2luMzJ3bmV0Lk5ldGJpb3MobmNiKSAhPSAwOgorICAgICAgICByZXR1cm4KKyAgICBhZGFwdGVycy5fdW5wYWNrKCkKKyAgICBmb3IgaSBpbiByYW5nZShhZGFwdGVycy5sZW5ndGgpOgorICAgICAgICBuY2IuUmVzZXQoKQorICAgICAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCUkVTRVQKKyAgICAgICAgbmNiLkxhbmFfbnVtID0gb3JkKGFkYXB0ZXJzLmxhbmFbaV0pCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5jYi5SZXNldCgpCisgICAgICAgIG5jYi5Db21tYW5kID0gbmV0Ymlvcy5OQ0JBU1RBVAorICAgICAgICBuY2IuTGFuYV9udW0gPSBvcmQoYWRhcHRlcnMubGFuYVtpXSkKKyAgICAgICAgbmNiLkNhbGxuYW1lID0gJyonLmxqdXN0KDE2KQorICAgICAgICBuY2IuQnVmZmVyID0gc3RhdHVzID0gbmV0Ymlvcy5BREFQVEVSX1NUQVRVUygpCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHN0YXR1cy5fdW5wYWNrKCkKKyAgICAgICAgYnl0ZXMgPSBtYXAob3JkLCBzdGF0dXMuYWRhcHRlcl9hZGRyZXNzKQorICAgICAgICByZXR1cm4gKChieXRlc1swXTw8NDBMKSArIChieXRlc1sxXTw8MzJMKSArIChieXRlc1syXTw8MjRMKSArCisgICAgICAgICAgICAgICAgKGJ5dGVzWzNdPDwxNkwpICsgKGJ5dGVzWzRdPDw4TCkgKyBieXRlc1s1XSkKKworIyBUaGFua3MgdG8gVGhvbWFzIEhlbGxlciBmb3IgY3R5cGVzIGFuZCBmb3IgaGlzIGhlbHAgd2l0aCBpdHMgdXNlIGhlcmUuCisKKyMgSWYgY3R5cGVzIGlzIGF2YWlsYWJsZSwgdXNlIGl0IHRvIGZpbmQgc3lzdGVtIHJvdXRpbmVzIGZvciBVVUlEIGdlbmVyYXRpb24uCitfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBfdXVpZF9nZW5lcmF0ZV90aW1lID0gX1V1aWRDcmVhdGUgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcywgY3R5cGVzLnV0aWwKKyAgICBfYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDE2KQorCisgICAgIyBUaGUgdXVpZF9nZW5lcmF0ZV8qIHJvdXRpbmVzIGFyZSBwcm92aWRlZCBieSBsaWJ1dWlkIG9uIGF0IGxlYXN0CisgICAgIyBMaW51eCBhbmQgRnJlZUJTRCwgYW5kIHByb3ZpZGVkIGJ5IGxpYmMgb24gTWFjIE9TIFguCisgICAgZm9yIGxpYm5hbWUgaW4gWyd1dWlkJywgJ2MnXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGliID0gY3R5cGVzLkNETEwoY3R5cGVzLnV0aWwuZmluZF9saWJyYXJ5KGxpYm5hbWUpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBoYXNhdHRyKGxpYiwgJ3V1aWRfZ2VuZXJhdGVfcmFuZG9tJyk6CisgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBsaWIudXVpZF9nZW5lcmF0ZV9yYW5kb20KKyAgICAgICAgaWYgaGFzYXR0cihsaWIsICd1dWlkX2dlbmVyYXRlX3RpbWUnKToKKyAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3RpbWUgPSBsaWIudXVpZF9nZW5lcmF0ZV90aW1lCisKKyAgICAjIE9uIFdpbmRvd3MgcHJpb3IgdG8gMjAwMCwgVXVpZENyZWF0ZSBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBPbiBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyLCBVdWlkQ3JlYXRlIG1ha2VzIGEKKyAgICAjIHJhbmRvbSBVVUlEIGFuZCBVdWlkQ3JlYXRlU2VxdWVudGlhbCBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBUaGVzZSByb3V0aW5lcyBhcmUgcHJvdmlkZWQgYnkgdGhlIFJQQyBydW50aW1lLgorICAgICMgTk9URTogIGF0IGxlYXN0IG9uIFRpbSdzIFdpblhQIFBybyBTUDIgZGVza3RvcCBib3gsIHdoaWxlIHRoZSBsYXN0CisgICAgIyA2IGJ5dGVzIHJldHVybmVkIGJ5IFV1aWRDcmVhdGVTZXF1ZW50aWFsIGFyZSBmaXhlZCwgdGhleSBkb24ndCBhcHBlYXIKKyAgICAjIHRvIGJlYXIgYW55IHJlbGF0aW9uc2hpcCB0byB0aGUgTUFDIGFkZHJlc3Mgb2YgYW55IG5ldHdvcmsgZGV2aWNlCisgICAgIyBvbiB0aGUgYm94LgorICAgIHRyeToKKyAgICAgICAgbGliID0gY3R5cGVzLndpbmRsbC5ycGNydDQKKyAgICBleGNlcHQ6CisgICAgICAgIGxpYiA9IE5vbmUKKyAgICBfVXVpZENyZWF0ZSA9IGdldGF0dHIobGliLCAnVXVpZENyZWF0ZVNlcXVlbnRpYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGxpYiwgJ1V1aWRDcmVhdGUnLCBOb25lKSkKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2RlZiBfdW5peGRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFVuaXggdXNpbmcgY3R5cGVzLiIiIgorICAgIF91dWlkX2dlbmVyYXRlX3RpbWUoX2J1ZmZlcikKKyAgICByZXR1cm4gVVVJRChieXRlcz1fYnVmZmVyLnJhdykubm9kZQorCitkZWYgX3dpbmRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgY3R5cGVzLiIiIgorICAgIGlmIF9VdWlkQ3JlYXRlKF9idWZmZXIpID09IDA6CisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KS5ub2RlCisKK2RlZiBfcmFuZG9tX2dldG5vZGUoKToKKyAgICAiIiJHZXQgYSByYW5kb20gbm9kZSBJRCwgd2l0aCBlaWdodGggYml0IHNldCBhcyBzdWdnZXN0ZWQgYnkgUkZDIDQxMjIuIiIiCisgICAgaW1wb3J0IHJhbmRvbQorICAgIHJldHVybiByYW5kb20ucmFuZHJhbmdlKDAsIDE8PDQ4TCkgfCAweDAxMDAwMDAwMDAwMEwKKworX25vZGUgPSBOb25lCisKK2RlZiBnZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIGFzIGEgNDgtYml0IHBvc2l0aXZlIGludGVnZXIuCisKKyAgICBUaGUgZmlyc3QgdGltZSB0aGlzIHJ1bnMsIGl0IG1heSBsYXVuY2ggYSBzZXBhcmF0ZSBwcm9ncmFtLCB3aGljaCBjb3VsZAorICAgIGJlIHF1aXRlIHNsb3cuICBJZiBhbGwgYXR0ZW1wdHMgdG8gb2J0YWluIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGZhaWwsIHdlCisgICAgY2hvb3NlIGEgcmFuZG9tIDQ4LWJpdCBudW1iZXIgd2l0aCBpdHMgZWlnaHRoIGJpdCBzZXQgdG8gMSBhcyByZWNvbW1lbmRlZAorICAgIGluIFJGQyA0MTIyLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9ub2RlCisgICAgaWYgX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBfbm9kZQorCisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBnZXR0ZXJzID0gW193aW5kbGxfZ2V0bm9kZSwgX25ldGJpb3NfZ2V0bm9kZSwgX2lwY29uZmlnX2dldG5vZGVdCisgICAgZWxzZToKKyAgICAgICAgZ2V0dGVycyA9IFtfdW5peGRsbF9nZXRub2RlLCBfaWZjb25maWdfZ2V0bm9kZV0KKworICAgIGZvciBnZXR0ZXIgaW4gZ2V0dGVycyArIFtfcmFuZG9tX2dldG5vZGVdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbm9kZSA9IGdldHRlcigpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIF9ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9ub2RlCisKK2RlZiB1dWlkMShub2RlPU5vbmUsIGNsb2NrX3NlcT1Ob25lKToKKyAgICAiIiJHZW5lcmF0ZSBhIFVVSUQgZnJvbSBhIGhvc3QgSUQsIHNlcXVlbmNlIG51bWJlciwgYW5kIHRoZSBjdXJyZW50IHRpbWUuCisgICAgSWYgJ25vZGUnIGlzIG5vdCBnaXZlbiwgZ2V0bm9kZSgpIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBoYXJkd2FyZQorICAgIGFkZHJlc3MuICBJZiAnY2xvY2tfc2VxJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc2VxdWVuY2UgbnVtYmVyOworICAgIG90aGVyd2lzZSBhIHJhbmRvbSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyIGlzIGNob3Nlbi4iIiIKKworICAgICMgV2hlbiB0aGUgc3lzdGVtIHByb3ZpZGVzIGEgdmVyc2lvbi0xIFVVSUQgZ2VuZXJhdG9yLCB1c2UgaXQgKGJ1dCBkb24ndAorICAgICMgdXNlIFV1aWRDcmVhdGUgaGVyZSBiZWNhdXNlIGl0cyBVVUlEcyBkb24ndCBjb25mb3JtIHRvIFJGQyA0MTIyKS4KKyAgICBpZiBfdXVpZF9nZW5lcmF0ZV90aW1lIGFuZCBub2RlIGlzIGNsb2NrX3NlcSBpcyBOb25lOgorICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgaW1wb3J0IHRpbWUKKyAgICBuYW5vc2Vjb25kcyA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKKyAgICAjIDB4MDFiMjFkZDIxMzgxNDAwMCBpcyB0aGUgbnVtYmVyIG9mIDEwMC1ucyBpbnRlcnZhbHMgYmV0d2VlbiB0aGUKKyAgICAjIFVVSUQgZXBvY2ggMTU4Mi0xMC0xNSAwMDowMDowMCBhbmQgdGhlIFVuaXggZXBvY2ggMTk3MC0wMS0wMSAwMDowMDowMC4KKyAgICB0aW1lc3RhbXAgPSBpbnQobmFub3NlY29uZHMvMTAwKSArIDB4MDFiMjFkZDIxMzgxNDAwMEwKKyAgICBpZiBjbG9ja19zZXEgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBjbG9ja19zZXEgPSByYW5kb20ucmFuZHJhbmdlKDE8PDE0TCkgIyBpbnN0ZWFkIG9mIHN0YWJsZSBzdG9yYWdlCisgICAgdGltZV9sb3cgPSB0aW1lc3RhbXAgJiAweGZmZmZmZmZmTAorICAgIHRpbWVfbWlkID0gKHRpbWVzdGFtcCA+PiAzMkwpICYgMHhmZmZmTAorICAgIHRpbWVfaGlfdmVyc2lvbiA9ICh0aW1lc3RhbXAgPj4gNDhMKSAmIDB4MGZmZkwKKyAgICBjbG9ja19zZXFfbG93ID0gY2xvY2tfc2VxICYgMHhmZkwKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IChjbG9ja19zZXEgPj4gOEwpICYgMHgzZkwKKyAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgIG5vZGUgPSBnZXRub2RlKCkKKyAgICByZXR1cm4gVVVJRChmaWVsZHM9KHRpbWVfbG93LCB0aW1lX21pZCwgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGNsb2NrX3NlcV9sb3csIG5vZGUpLCB2ZXJzaW9uPTEpCisKK2RlZiB1dWlkMyhuYW1lc3BhY2UsIG5hbWUpOgorICAgICIiIkdlbmVyYXRlIGEgVVVJRCBmcm9tIHRoZSBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUuIiIiCisgICAgaW1wb3J0IG1kNQorICAgIGhhc2ggPSBtZDUubWQ1KG5hbWVzcGFjZS5ieXRlcyArIG5hbWUpLmRpZ2VzdCgpCisgICAgcmV0dXJuIFVVSUQoYnl0ZXM9aGFzaFs6MTZdLCB2ZXJzaW9uPTMpCisKK2RlZiB1dWlkNCgpOgorICAgICIiIkdlbmVyYXRlIGEgcmFuZG9tIFVVSUQuIiIiCisKKyAgICAjIFdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBhIHZlcnNpb24tNCBVVUlEIGdlbmVyYXRvciwgdXNlIGl0LgorICAgIGlmIF91dWlkX2dlbmVyYXRlX3JhbmRvbToKKyAgICAgICAgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgIyBPdGhlcndpc2UsIGdldCByYW5kb21uZXNzIGZyb20gdXJhbmRvbSBvciB0aGUgJ3JhbmRvbScgbW9kdWxlLgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPW9zLnVyYW5kb20oMTYpLCB2ZXJzaW9uPTQpCisgICAgZXhjZXB0OgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGJ5dGVzID0gW2NocihyYW5kb20ucmFuZHJhbmdlKDI1NikpIGZvciBpIGluIHJhbmdlKDE2KV0KKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9Ynl0ZXMsIHZlcnNpb249NCkKKworZGVmIHV1aWQ1KG5hbWVzcGFjZSwgbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gdGhlIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lLiIiIgorICAgIGltcG9ydCBzaGEKKyAgICBoYXNoID0gc2hhLnNoYShuYW1lc3BhY2UuYnl0ZXMgKyBuYW1lKS5kaWdlc3QoKQorICAgIHJldHVybiBVVUlEKGJ5dGVzPWhhc2hbOjE2XSwgdmVyc2lvbj01KQorCisjIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgVVVJRHMgYXJlIGZvciB1c2Ugd2l0aCB1dWlkMygpIG9yIHV1aWQ1KCkuCisKK05BTUVTUEFDRV9ETlMgPSBVVUlEKCc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQorTkFNRVNQQUNFX1VSTCA9IFVVSUQoJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCitOQU1FU1BBQ0VfT0lEID0gVVVJRCgnNmJhN2I4MTItOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKK05BTUVTUEFDRV9YNTAwID0gVVVJRCgnNmJhN2I4MTQtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKZGlmZiAtLWdpdCBhL0xpYi93YXJuaW5ncy5weSBiL0xpYi93YXJuaW5ncy5weQppbmRleCBiNWQ3NWU0Li5iN2ZhYzY5IDEwMDY0NAotLS0gYS9MaWIvd2FybmluZ3MucHkKKysrIGIvTGliL3dhcm5pbmdzLnB5CkBAIC00Niw3ICs0Niw3IEBACiAgICAgZmlsZW5hbWUgPSBnbG9iYWxzLmdldCgnX19maWxlX18nKQogICAgIGlmIGZpbGVuYW1lOgogICAgICAgICBmbmwgPSBmaWxlbmFtZS5sb3dlcigpCi0gICAgICAgIGlmIGZubC5lbmRzd2l0aCgiLnB5YyIpIG9yIGZubC5lbmRzd2l0aCgiLnB5byIpOgorICAgICAgICBpZiBmbmwuZW5kc3dpdGgoKCIucHljIiwgIi5weW8iKSk6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KICAgICBlbHNlOgogICAgICAgICBpZiBtb2R1bGUgPT0gIl9fbWFpbl9fIjoKQEAgLTI1NCwxMSArMjU0LDExIEBACiAgICAgICAgICAgICBjYXQgPSBnZXRhdHRyKG0sIGtsYXNzKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoInVua25vd24gd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCi0gICAgaWYgKG5vdCBpc2luc3RhbmNlKGNhdCwgdHlwZXMuQ2xhc3NUeXBlKSBvcgotICAgICAgICBub3QgaXNzdWJjbGFzcyhjYXQsIFdhcm5pbmcpKToKKyAgICBpZiBub3QgaXNzdWJjbGFzcyhjYXQsIFdhcm5pbmcpOgogICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoImludmFsaWQgd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCiAgICAgcmV0dXJuIGNhdAogCiAjIE1vZHVsZSBpbml0aWFsaXphdGlvbgogX3Byb2Nlc3NvcHRpb25zKHN5cy53YXJub3B0aW9ucykKIHNpbXBsZWZpbHRlcigiaWdub3JlIiwgY2F0ZWdvcnk9UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgYXBwZW5kPTEpCitzaW1wbGVmaWx0ZXIoImlnbm9yZSIsIGNhdGVnb3J5PUltcG9ydFdhcm5pbmcsIGFwcGVuZD0xKQpkaWZmIC0tZ2l0IGEvTGliL3dlYmJyb3dzZXIucHkgYi9MaWIvd2ViYnJvd3Nlci5weQppbmRleCA0NjkzZmU3Li43YTFhM2I0IDEwMDY0NAotLS0gYS9MaWIvd2ViYnJvd3Nlci5weQorKysgYi9MaWIvd2ViYnJvd3Nlci5weQpAQCAtOTgsOCArOTgsNyBAQAogaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIjoKICAgICBkZWYgX2lzZXhlY3V0YWJsZShjbWQpOgogICAgICAgICBjbWQgPSBjbWQubG93ZXIoKQotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpIGFuZCAoY21kLmVuZHN3aXRoKCIuZXhlIikgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5lbmRzd2l0aCgiLmJhdCIpKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY21kKSBhbmQgY21kLmVuZHN3aXRoKCgiLmV4ZSIsICIuYmF0IikpOgogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgZm9yIGV4dCBpbiAiLmV4ZSIsICIuYmF0IjoKICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNtZCArIGV4dCk6CkBAIC00MzUsMTMgKzQzNCwxMyBAQAogICAgICMgVGhlIGRlZmF1bHQgR25vbWUgYnJvd3NlcgogICAgIGlmIF9pc2NvbW1hbmQoImdjb25mdG9vbC0yIik6CiAgICAgICAgICMgZ2V0IHRoZSB3ZWIgYnJvd3NlciBzdHJpbmcgZnJvbSBnY29uZnRvb2wKLSAgICAgICAgZ2MgPSAnZ2NvbmZ0b29sLTIgLWcgL2Rlc2t0b3AvZ25vbWUvdXJsLWhhbmRsZXJzL2h0dHAvY29tbWFuZCcKKyAgICAgICAgZ2MgPSAnZ2NvbmZ0b29sLTIgLWcgL2Rlc2t0b3AvZ25vbWUvdXJsLWhhbmRsZXJzL2h0dHAvY29tbWFuZCAyPi9kZXYvbnVsbCcKICAgICAgICAgb3V0ID0gb3MucG9wZW4oZ2MpCiAgICAgICAgIGNvbW1kID0gb3V0LnJlYWQoKS5zdHJpcCgpCiAgICAgICAgIHJldG5jb2RlID0gb3V0LmNsb3NlKCkKIAogICAgICAgICAjIGlmIHN1Y2Nlc3NmdWwsIHJlZ2lzdGVyIGl0Ci0gICAgICAgIGlmIHJldG5jb2RlID09IE5vbmUgYW5kIGxlbihjb21tZCkgIT0gMDoKKyAgICAgICAgaWYgcmV0bmNvZGUgaXMgTm9uZSBhbmQgY29tbWQ6CiAgICAgICAgICAgICByZWdpc3RlcigiZ25vbWUiLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3Nlcihjb21tZCkpCiAKICAgICAjIEZpcnN0LCB0aGUgTW96aWxsYS9OZXRzY2FwZSBicm93c2VycwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYuZWdnLWluZm8gYi9MaWIvd3NnaXJlZi5lZ2ctaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI3ODkzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYuZWdnLWluZm8KQEAgLTAsMCArMSw4IEBACitNZXRhZGF0YS1WZXJzaW9uOiAxLjAKK05hbWU6IHdzZ2lyZWYKK1ZlcnNpb246IDAuMS4yCitTdW1tYXJ5OiBXU0dJIChQRVAgMzMzKSBSZWZlcmVuY2UgTGlicmFyeQorQXV0aG9yOiBQaGlsbGlwIEouIEVieQorQXV0aG9yLWVtYWlsOiB3ZWItc2lnQHB5dGhvbi5vcmcKK0xpY2Vuc2U6IFBTRiBvciBaUEwKK1BsYXRmb3JtOiBVTktOT1dOCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9fX2luaXRfXy5weSBiL0xpYi93c2dpcmVmL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzU3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDIzIEBACisiIiJ3c2dpcmVmIC0tIGEgV1NHSSAoUEVQIDMzMykgUmVmZXJlbmNlIExpYnJhcnkKKworQ3VycmVudCBDb250ZW50czoKKworKiB1dGlsIC0tIE1pc2NlbGxhbmVvdXMgdXNlZnVsIGZ1bmN0aW9ucyBhbmQgd3JhcHBlcnMKKworKiBoZWFkZXJzIC0tIE1hbmFnZSByZXNwb25zZSBoZWFkZXJzCisKKyogaGFuZGxlcnMgLS0gYmFzZSBjbGFzc2VzIGZvciBzZXJ2ZXIvZ2F0ZXdheSBpbXBsZW1lbnRhdGlvbnMKKworKiBzaW1wbGVfc2VydmVyIC0tIGEgc2ltcGxlIEJhc2VIVFRQU2VydmVyIHRoYXQgc3VwcG9ydHMgV1NHSQorCisqIHZhbGlkYXRlIC0tIHZhbGlkYXRpb24gd3JhcHBlciB0aGF0IHNpdHMgYmV0d2VlbiBhbiBhcHAgYW5kIGEgc2VydmVyCisgIHRvIGRldGVjdCBlcnJvcnMgaW4gZWl0aGVyCisKK1RvLURvOgorCisqIGNnaV9nYXRld2F5IC0tIFJ1biBXU0dJIGFwcHMgdW5kZXIgQ0dJIChwZW5kaW5nIGEgZGVwbG95bWVudCBzdGFuZGFyZCkKKworKiBjZ2lfd3JhcHBlciAtLSBSdW4gQ0dJIGFwcHMgdW5kZXIgV1NHSQorCisqIHJvdXRlciAtLSBhIHNpbXBsZSBtaWRkbGV3YXJlIGNvbXBvbmVudCB0aGF0IGhhbmRsZXMgVVJMIHRyYXZlcnNhbAorIiIiCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9oYW5kbGVycy5weSBiL0xpYi93c2dpcmVmL2hhbmRsZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTM3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9oYW5kbGVycy5weQpAQCAtMCwwICsxLDQ5MiBAQAorIiIiQmFzZSBjbGFzc2VzIGZvciBzZXJ2ZXIvZ2F0ZXdheSBpbXBsZW1lbnRhdGlvbnMiIiIKKworZnJvbSB0eXBlcyBpbXBvcnQgU3RyaW5nVHlwZQorZnJvbSB1dGlsIGltcG9ydCBGaWxlV3JhcHBlciwgZ3Vlc3Nfc2NoZW1lLCBpc19ob3BfYnlfaG9wCitmcm9tIGhlYWRlcnMgaW1wb3J0IEhlYWRlcnMKKworaW1wb3J0IHN5cywgb3MsIHRpbWUKKworX19hbGxfXyA9IFsnQmFzZUhhbmRsZXInLCAnU2ltcGxlSGFuZGxlcicsICdCYXNlQ0dJSGFuZGxlcicsICdDR0lIYW5kbGVyJ10KKwordHJ5OgorICAgIGRpY3QKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIGRpY3QoaXRlbXMpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZm9yIGssdiBpbiBpdGVtczoKKyAgICAgICAgICAgIGRba10gPSB2CisgICAgICAgIHJldHVybiBkCisKK3RyeToKKyAgICBUcnVlCisgICAgRmFsc2UKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgVHJ1ZSA9IG5vdCBOb25lCisgICAgRmFsc2UgPSBub3QgVHJ1ZQorCisKKyMgV2Vla2RheSBhbmQgbW9udGggbmFtZXMgZm9yIEhUVFAgZGF0ZS90aW1lIGZvcm1hdHRpbmc7IGFsd2F5cyBFbmdsaXNoIQorX3dlZWtkYXluYW1lID0gWyJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iXQorX21vbnRobmFtZSA9IFtOb25lLCAjIER1bW15IHNvIHdlIGNhbiB1c2UgMS1iYXNlZCBtb250aCBudW1iZXJzCisgICAgICAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdCisKK2RlZiBmb3JtYXRfZGF0ZV90aW1lKHRpbWVzdGFtcCk6CisgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCisgICAgcmV0dXJuICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgIF93ZWVrZGF5bmFtZVt3ZF0sIGRheSwgX21vbnRobmFtZVttb250aF0sIHllYXIsIGhoLCBtbSwgc3MKKyAgICApCisKKworCitjbGFzcyBCYXNlSGFuZGxlcjoKKyAgICAiIiJNYW5hZ2UgdGhlIGludm9jYXRpb24gb2YgYSBXU0dJIGFwcGxpY2F0aW9uIiIiCisKKyAgICAjIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgY2FuIG92ZXJyaWRlIHBlci1zdWJjbGFzcyBvciBwZXItaW5zdGFuY2UKKyAgICB3c2dpX3ZlcnNpb24gPSAoMSwwKQorICAgIHdzZ2lfbXVsdGl0aHJlYWQgPSBUcnVlCisgICAgd3NnaV9tdWx0aXByb2Nlc3MgPSBUcnVlCisgICAgd3NnaV9ydW5fb25jZSA9IEZhbHNlCisKKyAgICBvcmlnaW5fc2VydmVyID0gVHJ1ZSAgICAjIFdlIGFyZSB0cmFuc21pdHRpbmcgZGlyZWN0IHRvIGNsaWVudAorICAgIGh0dHBfdmVyc2lvbiAgPSAiMS4wIiAgICMgVmVyc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXNwb25zZQorICAgIHNlcnZlcl9zb2Z0d2FyZSA9IE5vbmUgICMgU3RyaW5nIG5hbWUgb2Ygc2VydmVyIHNvZnR3YXJlLCBpZiBhbnkKKworICAgICMgb3NfZW52aXJvbiBpcyB1c2VkIHRvIHN1cHBseSBjb25maWd1cmF0aW9uIGZyb20gdGhlIE9TIGVudmlyb25tZW50OgorICAgICMgYnkgZGVmYXVsdCBpdCdzIGEgY29weSBvZiAnb3MuZW52aXJvbicgYXMgb2YgaW1wb3J0IHRpbWUsIGJ1dCB5b3UgY2FuCisgICAgIyBvdmVycmlkZSB0aGlzIGluIGUuZy4geW91ciBfX2luaXRfXyBtZXRob2QuCisgICAgb3NfZW52aXJvbiA9IGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKQorCisgICAgIyBDb2xsYWJvcmF0b3IgY2xhc3NlcworICAgIHdzZ2lfZmlsZV93cmFwcGVyID0gRmlsZVdyYXBwZXIgICAgICMgc2V0IHRvIE5vbmUgdG8gZGlzYWJsZQorICAgIGhlYWRlcnNfY2xhc3MgPSBIZWFkZXJzICAgICAgICAgICAgICMgbXVzdCBiZSBhIEhlYWRlcnMtbGlrZSBjbGFzcworCisgICAgIyBFcnJvciBoYW5kbGluZyAoYWxzbyBwZXItc3ViY2xhc3Mgb3IgcGVyLWluc3RhbmNlKQorICAgIHRyYWNlYmFja19saW1pdCA9IE5vbmUgICMgUHJpbnQgZW50aXJlIHRyYWNlYmFjayB0byBzZWxmLmdldF9zdGRlcnIoKQorICAgIGVycm9yX3N0YXR1cyA9ICI1MDAgRHVkZSwgdGhpcyBpcyB3aGFjayEiCisgICAgZXJyb3JfaGVhZGVycyA9IFsoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKV0KKyAgICBlcnJvcl9ib2R5ID0gIkEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuIgorCisgICAgIyBTdGF0ZSB2YXJpYWJsZXMgKGRvbid0IG1lc3Mgd2l0aCB0aGVzZSkKKyAgICBzdGF0dXMgPSByZXN1bHQgPSBOb25lCisgICAgaGVhZGVyc19zZW50ID0gRmFsc2UKKyAgICBoZWFkZXJzID0gTm9uZQorICAgIGJ5dGVzX3NlbnQgPSAwCisKKworCisKKworCisKKworICAgIGRlZiBydW4oc2VsZiwgYXBwbGljYXRpb24pOgorICAgICAgICAiIiJJbnZva2UgdGhlIGFwcGxpY2F0aW9uIiIiCisgICAgICAgICMgTm90ZSB0byBzZWxmOiBkb24ndCBtb3ZlIHRoZSBjbG9zZSgpISAgQXN5bmNocm9ub3VzIHNlcnZlcnMgc2hvdWxkbid0CisgICAgICAgICMgY2FsbCBjbG9zZSgpIGZyb20gZmluaXNoX3Jlc3BvbnNlKCksIHNvIGlmIHlvdSBjbG9zZSgpIGFueXdoZXJlIGJ1dAorICAgICAgICAjIHRoZSBkb3VibGUtZXJyb3IgYnJhbmNoIGhlcmUsIHlvdSdsbCBicmVhayBhc3luY2hyb25vdXMgc2VydmVycyBieQorICAgICAgICAjIHByZW1hdHVyZWx5IGNsb3NpbmcuICBBc3luYyBzZXJ2ZXJzIG11c3QgcmV0dXJuIGZyb20gJ3J1bigpJyB3aXRob3V0CisgICAgICAgICMgY2xvc2luZyBpZiB0aGVyZSBtaWdodCBzdGlsbCBiZSBvdXRwdXQgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBhcHBsaWNhdGlvbihzZWxmLmVudmlyb24sIHNlbGYuc3RhcnRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXNwb25zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcigpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSBnZXQgYW4gZXJyb3IgaGFuZGxpbmcgYW4gZXJyb3IsIGp1c3QgZ2l2ZSB1cCBhbHJlYWR5IQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlICAgIyAuLi5hbmQgbGV0IHRoZSBhY3R1YWwgc2VydmVyIGZpZ3VyZSBpdCBvdXQuCisKKworICAgIGRlZiBzZXR1cF9lbnZpcm9uKHNlbGYpOgorICAgICAgICAiIiJTZXQgdXAgdGhlIGVudmlyb25tZW50IGZvciBvbmUgcmVxdWVzdCIiIgorCisgICAgICAgIGVudiA9IHNlbGYuZW52aXJvbiA9IHNlbGYub3NfZW52aXJvbi5jb3B5KCkKKyAgICAgICAgc2VsZi5hZGRfY2dpX3ZhcnMoKQorCisgICAgICAgIGVudlsnd3NnaS5pbnB1dCddICAgICAgICA9IHNlbGYuZ2V0X3N0ZGluKCkKKyAgICAgICAgZW52Wyd3c2dpLmVycm9ycyddICAgICAgID0gc2VsZi5nZXRfc3RkZXJyKCkKKyAgICAgICAgZW52Wyd3c2dpLnZlcnNpb24nXSAgICAgID0gc2VsZi53c2dpX3ZlcnNpb24KKyAgICAgICAgZW52Wyd3c2dpLnJ1bl9vbmNlJ10gICAgID0gc2VsZi53c2dpX3J1bl9vbmNlCisgICAgICAgIGVudlsnd3NnaS51cmxfc2NoZW1lJ10gICA9IHNlbGYuZ2V0X3NjaGVtZSgpCisgICAgICAgIGVudlsnd3NnaS5tdWx0aXRocmVhZCddICA9IHNlbGYud3NnaV9tdWx0aXRocmVhZAorICAgICAgICBlbnZbJ3dzZ2kubXVsdGlwcm9jZXNzJ10gPSBzZWxmLndzZ2lfbXVsdGlwcm9jZXNzCisKKyAgICAgICAgaWYgc2VsZi53c2dpX2ZpbGVfd3JhcHBlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudlsnd3NnaS5maWxlX3dyYXBwZXInXSA9IHNlbGYud3NnaV9maWxlX3dyYXBwZXIKKworICAgICAgICBpZiBzZWxmLm9yaWdpbl9zZXJ2ZXIgYW5kIHNlbGYuc2VydmVyX3NvZnR3YXJlOgorICAgICAgICAgICAgZW52LnNldGRlZmF1bHQoJ1NFUlZFUl9TT0ZUV0FSRScsc2VsZi5zZXJ2ZXJfc29mdHdhcmUpCisKKworICAgIGRlZiBmaW5pc2hfcmVzcG9uc2Uoc2VsZik6CisgICAgICAgICIiIlNlbmQgYW55IGl0ZXJhYmxlIGRhdGEsIHRoZW4gY2xvc2Ugc2VsZiBhbmQgdGhlIGl0ZXJhYmxlCisKKyAgICAgICAgU3ViY2xhc3NlcyBpbnRlbmRlZCBmb3IgdXNlIGluIGFzeW5jaHJvbm91cyBzZXJ2ZXJzIHdpbGwKKyAgICAgICAgd2FudCB0byByZWRlZmluZSB0aGlzIG1ldGhvZCwgc3VjaCB0aGF0IGl0IHNldHMgdXAgY2FsbGJhY2tzCisgICAgICAgIGluIHRoZSBldmVudCBsb29wIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZGF0YSwgYW5kIHRvIGNhbGwKKyAgICAgICAgJ3NlbGYuY2xvc2UoKScgb25jZSB0aGUgcmVzcG9uc2UgaXMgZmluaXNoZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5yZXN1bHRfaXNfZmlsZSgpIG9yIG5vdCBzZWxmLnNlbmRmaWxlKCk6CisgICAgICAgICAgICBmb3IgZGF0YSBpbiBzZWxmLnJlc3VsdDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBzZWxmLmZpbmlzaF9jb250ZW50KCkKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKworICAgIGRlZiBnZXRfc2NoZW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFVSTCBzY2hlbWUgYmVpbmcgdXNlZCIiIgorICAgICAgICByZXR1cm4gZ3Vlc3Nfc2NoZW1lKHNlbGYuZW52aXJvbikKKworCisgICAgZGVmIHNldF9jb250ZW50X2xlbmd0aChzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSBDb250ZW50LUxlbmd0aCBvciBzd2l0Y2ggdG8gY2h1bmtlZCBlbmNvZGluZyBpZiBwb3NzaWJsZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBibG9ja3MgPSBsZW4oc2VsZi5yZXN1bHQpCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLEF0dHJpYnV0ZUVycm9yLE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYmxvY2tzPT0xOgorICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IHN0cihzZWxmLmJ5dGVzX3NlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIFRyeSBmb3IgY2h1bmtlZCBlbmNvZGluZyBpZiBvcmlnaW4gc2VydmVyIGFuZCBjbGllbnQgaXMgMS4xCisKKworICAgIGRlZiBjbGVhbnVwX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIk1ha2UgYW55IG5lY2Vzc2FyeSBoZWFkZXIgY2hhbmdlcyBvciBkZWZhdWx0cworCisgICAgICAgIFN1YmNsYXNzZXMgY2FuIGV4dGVuZCB0aGlzIHRvIGFkZCBvdGhlciBkZWZhdWx0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcnMuaGFzX2tleSgnQ29udGVudC1MZW5ndGgnKToKKyAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRlbnRfbGVuZ3RoKCkKKworICAgIGRlZiBzdGFydF9yZXNwb25zZShzZWxmLCBzdGF0dXMsIGhlYWRlcnMsZXhjX2luZm89Tm9uZSk6CisgICAgICAgICIiIidzdGFydF9yZXNwb25zZSgpJyBjYWxsYWJsZSBhcyBzcGVjaWZpZWQgYnkgUEVQIDMzMyIiIgorCisgICAgICAgIGlmIGV4Y19pbmZvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgICAgICAgICAjIFJlLXJhaXNlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpZiBoZWFkZXJzIHNlbnQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUgICAgICAgICMgYXZvaWQgZGFuZ2xpbmcgY2lyY3VsYXIgcmVmCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkhlYWRlcnMgYWxyZWFkeSBzZXQhIikKKworICAgICAgICBhc3NlcnQgdHlwZShzdGF0dXMpIGlzIFN0cmluZ1R5cGUsIlN0YXR1cyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICBhc3NlcnQgbGVuKHN0YXR1cyk+PTQsIlN0YXR1cyBtdXN0IGJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyIKKyAgICAgICAgYXNzZXJ0IGludChzdGF0dXNbOjNdKSwiU3RhdHVzIG1lc3NhZ2UgbXVzdCBiZWdpbiB3LzMtZGlnaXQgY29kZSIKKyAgICAgICAgYXNzZXJ0IHN0YXR1c1szXT09IiAiLCAiU3RhdHVzIG1lc3NhZ2UgbXVzdCBoYXZlIGEgc3BhY2UgYWZ0ZXIgY29kZSIKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgZm9yIG5hbWUsdmFsIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUobmFtZSkgaXMgU3RyaW5nVHlwZSwiSGVhZGVyIG5hbWVzIG11c3QgYmUgc3RyaW5ncyIKKyAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSh2YWwpIGlzIFN0cmluZ1R5cGUsIkhlYWRlciB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgICAgIGFzc2VydCBub3QgaXNfaG9wX2J5X2hvcChuYW1lKSwiSG9wLWJ5LWhvcCBoZWFkZXJzIG5vdCBhbGxvd2VkIgorICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cworICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLmhlYWRlcnNfY2xhc3MoaGVhZGVycykKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGUKKworCisgICAgZGVmIHNlbmRfcHJlYW1ibGUoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IHZlcnNpb24vc3RhdHVzL2RhdGUvc2VydmVyLCB2aWEgc2VsZi5fd3JpdGUoKSIiIgorICAgICAgICBpZiBzZWxmLm9yaWdpbl9zZXJ2ZXI6CisgICAgICAgICAgICBpZiBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgnSFRUUC8lcyAlc1xyXG4nICUgKHNlbGYuaHR0cF92ZXJzaW9uLHNlbGYuc3RhdHVzKSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzLmhhc19rZXkoJ0RhdGUnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZTogJXNcclxuJyAlIGZvcm1hdF9kYXRlX3RpbWUodGltZS50aW1lKCkpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlcnZlcl9zb2Z0d2FyZSBhbmQgbm90IHNlbGYuaGVhZGVycy5oYXNfa2V5KCdTZXJ2ZXInKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1NlcnZlcjogJXNcclxuJyAlIHNlbGYuc2VydmVyX3NvZnR3YXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1N0YXR1czogJXNcclxuJyAlIHNlbGYuc3RhdHVzKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiInd3JpdGUoKScgY2FsbGFibGUgYXMgc3BlY2lmaWVkIGJ5IFBFUCAzMzMiIiIKKworICAgICAgICBhc3NlcnQgdHlwZShkYXRhKSBpcyBTdHJpbmdUeXBlLCJ3cml0ZSgpIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nIgorCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXR1czoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ3cml0ZSgpIGJlZm9yZSBzdGFydF9yZXNwb25zZSgpIikKKworICAgICAgICBlbGlmIG5vdCBzZWxmLmhlYWRlcnNfc2VudDoKKyAgICAgICAgICAgICMgQmVmb3JlIHRoZSBmaXJzdCBvdXRwdXQsIHNlbmQgdGhlIHN0b3JlZCBoZWFkZXJzCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSBsZW4oZGF0YSkgICAgIyBtYWtlIHN1cmUgd2Uga25vdyBjb250ZW50LWxlbmd0aAorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcnMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ieXRlc19zZW50ICs9IGxlbihkYXRhKQorCisgICAgICAgICMgWFhYIGNoZWNrIENvbnRlbnQtTGVuZ3RoIGFuZCB0cnVuY2F0ZSBpZiB0b28gbWFueSBieXRlcyB3cml0dGVuPworICAgICAgICBzZWxmLl93cml0ZShkYXRhKQorICAgICAgICBzZWxmLl9mbHVzaCgpCisKKworICAgIGRlZiBzZW5kZmlsZShzZWxmKToKKyAgICAgICAgIiIiUGxhdGZvcm0tc3BlY2lmaWMgZmlsZSB0cmFuc21pc3Npb24KKworICAgICAgICBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHN1cHBvcnQgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgZmlsZSB0cmFuc21pc3Npb24uICBJdCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgYXBwbGljYXRpb24ncworICAgICAgICByZXR1cm4gaXRlcmFibGUgKCdzZWxmLnJlc3VsdCcpIGlzIGFuIGluc3RhbmNlIG9mCisgICAgICAgICdzZWxmLndzZ2lfZmlsZV93cmFwcGVyJy4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBpdCB3YXMgYWJsZSB0byBhY3R1YWxseQorICAgICAgICB0cmFuc21pdCB0aGUgd3JhcHBlZCBmaWxlLWxpa2Ugb2JqZWN0IHVzaW5nIGEgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgYXBwcm9hY2guICBJdCBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgaWYgbm9ybWFsIGl0ZXJhdGlvbgorICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiAgQW4gZXhjZXB0aW9uIGNhbiBiZSByYWlzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgdGhhdCB0cmFuc21pc3Npb24gd2FzIGF0dGVtcHRlZCwgYnV0IGZhaWxlZC4KKworICAgICAgICBOT1RFOiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCAnc2VsZi5zZW5kX2hlYWRlcnMoKScgaWYKKyAgICAgICAgJ3NlbGYuaGVhZGVyc19zZW50JyBpcyBmYWxzZSBhbmQgaXQgaXMgZ29pbmcgdG8gYXR0ZW1wdCBkaXJlY3QKKyAgICAgICAgdHJhbnNtaXNzaW9uIG9mIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlICAgIyBObyBwbGF0Zm9ybS1zcGVjaWZpYyB0cmFuc21pc3Npb24gYnkgZGVmYXVsdAorCisKKyAgICBkZWYgZmluaXNoX2NvbnRlbnQoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBoZWFkZXJzIGFuZCBjb250ZW50IGhhdmUgYm90aCBiZWVuIHNlbnQiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gIjAiCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzICMgWFhYIGNoZWNrIGlmIGNvbnRlbnQtbGVuZ3RoIHdhcyB0b28gc2hvcnQ/CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBpdGVyYWJsZSAoaWYgbmVlZGVkKSBhbmQgcmVzZXQgYWxsIGluc3RhbmNlIHZhcnMKKworICAgICAgICBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGFsc28gZHJvcCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucmVzdWx0LCdjbG9zZScpOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0LmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gc2VsZi5oZWFkZXJzID0gc2VsZi5zdGF0dXMgPSBzZWxmLmVudmlyb24gPSBOb25lCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSAwOyBzZWxmLmhlYWRlcnNfc2VudCA9IEZhbHNlCisKKworICAgIGRlZiBzZW5kX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IGhlYWRlcnMgdG8gdGhlIGNsaWVudCwgdmlhIHNlbGYuX3dyaXRlKCkiIiIKKyAgICAgICAgc2VsZi5jbGVhbnVwX2hlYWRlcnMoKQorICAgICAgICBzZWxmLmhlYWRlcnNfc2VudCA9IFRydWUKKyAgICAgICAgaWYgbm90IHNlbGYub3JpZ2luX3NlcnZlciBvciBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9wcmVhbWJsZSgpCisgICAgICAgICAgICBzZWxmLl93cml0ZShzdHIoc2VsZi5oZWFkZXJzKSkKKworCisgICAgZGVmIHJlc3VsdF9pc19maWxlKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmICdzZWxmLnJlc3VsdCcgaXMgYW4gaW5zdGFuY2Ugb2YgJ3NlbGYud3NnaV9maWxlX3dyYXBwZXInIiIiCisgICAgICAgIHdyYXBwZXIgPSBzZWxmLndzZ2lfZmlsZV93cmFwcGVyCisgICAgICAgIHJldHVybiB3cmFwcGVyIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKHNlbGYucmVzdWx0LHdyYXBwZXIpCisKKworICAgIGRlZiBjbGllbnRfaXNfbW9kZXJuKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmIGNsaWVudCBjYW4gYWNjZXB0IHN0YXR1cyBhbmQgaGVhZGVycyIiIgorICAgICAgICByZXR1cm4gc2VsZi5lbnZpcm9uWydTRVJWRVJfUFJPVE9DT0wnXS51cHBlcigpICE9ICdIVFRQLzAuOScKKworCisgICAgZGVmIGxvZ19leGNlcHRpb24oc2VsZixleGNfaW5mbyk6CisgICAgICAgICIiIkxvZyB0aGUgJ2V4Y19pbmZvJyB0dXBsZSBpbiB0aGUgc2VydmVyIGxvZworCisgICAgICAgIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldGFyZ2V0IHRoZSBvdXRwdXQgb3IgY2hhbmdlIGl0cyBmb3JtYXQuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRyYWNlYmFjayBpbXBvcnQgcHJpbnRfZXhjZXB0aW9uCisgICAgICAgICAgICBzdGRlcnIgPSBzZWxmLmdldF9zdGRlcnIoKQorICAgICAgICAgICAgcHJpbnRfZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGV4Y19pbmZvWzBdLCBleGNfaW5mb1sxXSwgZXhjX2luZm9bMl0sCisgICAgICAgICAgICAgICAgc2VsZi50cmFjZWJhY2tfbGltaXQsIHN0ZGVycgorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgIiIiTG9nIGN1cnJlbnQgZXJyb3IsIGFuZCBzZW5kIGVycm9yIG91dHB1dCB0byBjbGllbnQgaWYgcG9zc2libGUiIiIKKyAgICAgICAgc2VsZi5sb2dfZXhjZXB0aW9uKHN5cy5leGNfaW5mbygpKQorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHNlbGYuZXJyb3Jfb3V0cHV0KHNlbGYuZW52aXJvbiwgc2VsZi5zdGFydF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Jlc3BvbnNlKCkKKyAgICAgICAgIyBYWFggZWxzZTogYXR0ZW1wdCBhZHZhbmNlZCByZWNvdmVyeSB0ZWNobmlxdWVzIGZvciBIVE1MIG9yIHRleHQ/CisKKyAgICBkZWYgZXJyb3Jfb3V0cHV0KHNlbGYsIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgIiIiV1NHSSBtaW5pLWFwcCB0byBjcmVhdGUgZXJyb3Igb3V0cHV0CisKKyAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBqdXN0IHVzZXMgdGhlICdlcnJvcl9zdGF0dXMnLCAnZXJyb3JfaGVhZGVycycsCisgICAgICAgIGFuZCAnZXJyb3JfYm9keScgYXR0cmlidXRlcyB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgcGFnZS4gIEl0IGNhbgorICAgICAgICBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgZGlhZ25vc3RpY3MsCisgICAgICAgIGNob29zZSBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBsYW5ndWFnZSwgZXRjLgorCisgICAgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQncyBub3QgcmVjb21tZW5kZWQgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlIHRvCisgICAgICAgIHNwaXQgb3V0IGRpYWdub3N0aWNzIHRvIGFueSBvbGQgdXNlcjsgaWRlYWxseSwgeW91IHNob3VsZCBoYXZlIHRvIGRvCisgICAgICAgIHNvbWV0aGluZyBzcGVjaWFsIHRvIGVuYWJsZSBkaWFnbm9zdGljIG91dHB1dCwgd2hpY2ggaXMgd2h5IHdlIGRvbid0CisgICAgICAgIGluY2x1ZGUgYW55IGhlcmUhCisgICAgICAgICIiIgorICAgICAgICBzdGFydF9yZXNwb25zZShzZWxmLmVycm9yX3N0YXR1cyxzZWxmLmVycm9yX2hlYWRlcnNbOl0sc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIHJldHVybiBbc2VsZi5lcnJvcl9ib2R5XQorCisKKyAgICAjIFB1cmUgYWJzdHJhY3QgbWV0aG9kczsgKm11c3QqIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcworCisgICAgZGVmIF93cml0ZShzZWxmLGRhdGEpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBidWZmZXIgZGF0YSBmb3Igc2VuZCB0byBjbGllbnQKKworICAgICAgICBJdCdzIG9rYXkgaWYgdGhpcyBtZXRob2QgYWN0dWFsbHkgdHJhbnNtaXRzIHRoZSBkYXRhOyBCYXNlSGFuZGxlcgorICAgICAgICBqdXN0IHNlcGFyYXRlcyB3cml0ZSBhbmQgZmx1c2ggb3BlcmF0aW9ucyBmb3IgZ3JlYXRlciBlZmZpY2llbmN5CisgICAgICAgIHdoZW4gdGhlIHVuZGVybHlpbmcgc3lzdGVtIGFjdHVhbGx5IGhhcyBzdWNoIGEgZGlzdGluY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBmb3JjZSBzZW5kaW5nIG9mIHJlY2VudCAnX3dyaXRlKCknIGNhbGxzCisKKyAgICAgICAgSXQncyBva2F5IGlmIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AgKGkuZS4sIGlmICdfd3JpdGUoKScgYWN0dWFsbHkKKyAgICAgICAgc2VuZHMgdGhlIGRhdGEuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZ2V0X3N0ZGluKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuaW5wdXQnIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuZXJyb3JzJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgYWRkX2NnaV92YXJzKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBpbnNlcnQgQ0dJIHZhcmlhYmxlcyBpbiAnc2VsZi5lbnZpcm9uJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworCisKKworCisKKworCisKKworY2xhc3MgU2ltcGxlSGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgIiIiSGFuZGxlciB0aGF0J3MganVzdCBpbml0aWFsaXplZCB3aXRoIHN0cmVhbXMsIGVudmlyb25tZW50LCBldGMuCisKKyAgICBUaGlzIGhhbmRsZXIgc3ViY2xhc3MgaXMgaW50ZW5kZWQgZm9yIHN5bmNocm9ub3VzIEhUVFAvMS4wIG9yaWdpbiBzZXJ2ZXJzLAorICAgIGFuZCBoYW5kbGVzIHNlbmRpbmcgdGhlIGVudGlyZSByZXNwb25zZSBvdXRwdXQsIGdpdmVuIHRoZSBjb3JyZWN0IGlucHV0cy4KKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gU2ltcGxlSGFuZGxlcigKKyAgICAgICAgICAgIGlucCxvdXQsZXJyLGVudiwgbXVsdGl0aHJlYWQ9RmFsc2UsIG11bHRpcHJvY2Vzcz1UcnVlCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5ydW4oYXBwKSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsc3RkaW4sc3Rkb3V0LHN0ZGVycixlbnZpcm9uLAorICAgICAgICBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9RmFsc2UKKyAgICApOgorICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKKyAgICAgICAgc2VsZi5iYXNlX2VudiA9IGVudmlyb24KKyAgICAgICAgc2VsZi53c2dpX211bHRpdGhyZWFkID0gbXVsdGl0aHJlYWQKKyAgICAgICAgc2VsZi53c2dpX211bHRpcHJvY2VzcyA9IG11bHRpcHJvY2VzcworCisgICAgZGVmIGdldF9zdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RkaW4KKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRlcnIKKworICAgIGRlZiBhZGRfY2dpX3ZhcnMoc2VsZik6CisgICAgICAgIHNlbGYuZW52aXJvbi51cGRhdGUoc2VsZi5iYXNlX2VudikKKworICAgIGRlZiBfd3JpdGUoc2VsZixkYXRhKToKKyAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5fd3JpdGUgPSBzZWxmLnN0ZG91dC53cml0ZQorCisgICAgZGVmIF9mbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5zdGRvdXQuZmx1c2goKQorICAgICAgICBzZWxmLl9mbHVzaCA9IHNlbGYuc3Rkb3V0LmZsdXNoCisKKworY2xhc3MgQmFzZUNHSUhhbmRsZXIoU2ltcGxlSGFuZGxlcik6CisKKyAgICAiIiJDR0ktbGlrZSBzeXN0ZW1zIHVzaW5nIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBlbnZpcm9uIG1hcHBpbmcKKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gQmFzZUNHSUhhbmRsZXIoaW5wLG91dCxlcnIsZW52KQorICAgICAgICBoYW5kbGVyLnJ1bihhcHApCisKKyAgICBUaGlzIGhhbmRsZXIgY2xhc3MgaXMgdXNlZnVsIGZvciBnYXRld2F5IHByb3RvY29scyBsaWtlIFJlYWR5RXhlYyBhbmQKKyAgICBGYXN0Q0dJLCB0aGF0IGhhdmUgdXNhYmxlIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBhbiBlbnZpcm9ubWVudAorICAgIG1hcHBpbmcuICBJdCdzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yIENHSUhhbmRsZXIsIHdoaWNoIGp1c3QgdXNlcworICAgIHN5cy5zdGRpbiwgb3MuZW52aXJvbiwgYW5kIHNvIG9uLgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGFsc28gdGFrZXMga2V5d29yZCBhcmd1bWVudHMgJ211bHRpdGhyZWFkJyBhbmQKKyAgICAnbXVsdGlwcm9jZXNzJyAoZGVmYXVsdGluZyB0byAnVHJ1ZScgYW5kICdGYWxzZScgcmVzcGVjdGl2ZWx5KSB0byBjb250cm9sCisgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2VudCB0byB0aGUgYXBwbGljYXRpb24uICBJdCBzZXRzICdvcmlnaW5fc2VydmVyJyB0bworICAgIEZhbHNlICh0byBlbmFibGUgQ0dJLWxpa2Ugb3V0cHV0KSwgYW5kIGFzc3VtZXMgdGhhdCAnd3NnaS5ydW5fb25jZScgaXMKKyAgICBGYWxzZS4KKyAgICAiIiIKKworICAgIG9yaWdpbl9zZXJ2ZXIgPSBGYWxzZQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBDR0lIYW5kbGVyKEJhc2VDR0lIYW5kbGVyKToKKworICAgICIiIkNHSS1iYXNlZCBpbnZvY2F0aW9uIHZpYSBzeXMuc3RkaW4vc3Rkb3V0L3N0ZGVyciBhbmQgb3MuZW52aXJvbgorCisgICAgVXNhZ2U6OgorCisgICAgICAgIENHSUhhbmRsZXIoKS5ydW4oYXBwKQorCisgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGNsYXNzIGFuZCBCYXNlQ0dJSGFuZGxlciBpcyB0aGF0IGl0IGFsd2F5cworICAgIHVzZXMgJ3dzZ2kucnVuX29uY2UnIG9mICdUcnVlJywgJ3dzZ2kubXVsdGl0aHJlYWQnIG9mICdGYWxzZScsIGFuZAorICAgICd3c2dpLm11bHRpcHJvY2Vzcycgb2YgJ1RydWUnLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgaW5pdGlhbGl6YXRpb24KKyAgICBwYXJhbWV0ZXJzLCBidXQgYWx3YXlzIHVzZXMgJ3N5cy5zdGRpbicsICdvcy5lbnZpcm9uJywgYW5kIGZyaWVuZHMuCisKKyAgICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSBhbnkgb2YgdGhlc2UgcGFyYW1ldGVycywgdXNlIEJhc2VDR0lIYW5kbGVyCisgICAgaW5zdGVhZC4KKyAgICAiIiIKKworICAgIHdzZ2lfcnVuX29uY2UgPSBUcnVlCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEJhc2VDR0lIYW5kbGVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyLCBkaWN0KG9zLmVudmlyb24uaXRlbXMoKSksCisgICAgICAgICAgICBtdWx0aXRocmVhZD1GYWxzZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisjCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9oZWFkZXJzLnB5IGIvTGliL3dzZ2lyZWYvaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZlYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYvaGVhZGVycy5weQpAQCAtMCwwICsxLDIwNSBAQAorIiIiTWFuYWdlIEhUVFAgUmVzcG9uc2UgSGVhZGVycworCitNdWNoIG9mIHRoaXMgbW9kdWxlIGlzIHJlZC1oYW5kZWRseSBwaWxmZXJlZCBmcm9tIGVtYWlsLk1lc3NhZ2UgaW4gdGhlIHN0ZGxpYiwKK3NvIHBvcnRpb25zIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kIHdlcmUKK3dyaXR0ZW4gYnkgQmFycnkgV2Fyc2F3LgorIiIiCisKK2Zyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlLCBUdXBsZVR5cGUKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGBzcGVjaWFsJyBjaGFyYWN0ZXJzIGluIHBhcmFtZXRlcnMsIHRoZQorIyBleGlzdGFuY2Ugb2Ygd2hpY2ggZm9yY2UgcXVvdGluZyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlLgoraW1wb3J0IHJlCit0c3BlY2lhbHMgPSByZS5jb21waWxlKHInWyBcKFwpPD5ALDs6XFwiL1xbXF1cPz1dJykKKworZGVmIF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWU9Tm9uZSwgcXVvdGU9MSk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCByZXR1cm4gYSBrZXk9dmFsdWUgcGFpci4KKworICAgIFRoaXMgd2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIGxlbih2YWx1ZSkgPiAwOgorICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoJyInLCByJ1wiJykKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcz0lcycgJSAocGFyYW0sIHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYXJhbQorCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIEhlYWRlcnM6CisKKyAgICAiIiJNYW5hZ2UgYSBjb2xsZWN0aW9uIG9mIEhUVFAgcmVzcG9uc2UgaGVhZGVycyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsaGVhZGVycyk6CisgICAgICAgIGlmIHR5cGUoaGVhZGVycykgaXMgbm90IExpc3RUeXBlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJIZWFkZXJzIG11c3QgYmUgYSBsaXN0IG9mIG5hbWUvdmFsdWUgdHVwbGVzIikKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IGhlYWRlcnMKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBoZWFkZXJzLCBpbmNsdWRpbmcgZHVwbGljYXRlcy4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9oZWFkZXJzKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbCk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuIiIiCisgICAgICAgIGRlbCBzZWxmW25hbWVdCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLCB2YWwpKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBoZWFkZXIsIGlmIHByZXNlbnQuCisKKyAgICAgICAgRG9lcyAqbm90KiByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBzZWxmLl9oZWFkZXJzWzpdID0gW2t2IGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzIGlmIGt2WzBdLmxvd2VyKCk8Pm5hbWVdCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixuYW1lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJworCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgaGVhZGVyIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzLCB0aGUgZmlyc3QgZXhhY3RseSB3aGljaAorICAgICAgICBvY2N1cnJhbmNlIGdldHMgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLiAgVXNlIGdldGFsbCgpIHRvIGdldCBhbGwKKyAgICAgICAgdGhlIHZhbHVlcyBtYXRjaGluZyBhIGhlYWRlciBmaWVsZCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpCisKKworCisKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkgaXMgbm90IE5vbmUKKworICAgIF9fY29udGFpbnNfXyA9IGhhc19rZXkKKworCisgICAgZGVmIGdldF9hbGwoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBmaWVsZC4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3Qgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4gIEFueQorICAgICAgICBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyIGxpc3QuCisgICAgICAgIElmIG5vIGZpZWxkcyBleGlzdCB3aXRoIHRoZSBnaXZlbiBuYW1lLCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIHJldHVybiBba3ZbMV0gZm9yIGt2IGluIHNlbGYuX2hlYWRlcnMgaWYga3ZbMF0ubG93ZXIoKT09bmFtZV0KKworCisgICAgZGVmIGdldChzZWxmLG5hbWUsZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJywgb3IgcmV0dXJuICdkZWZhdWx0JyIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGZvciBrLHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKT09bmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGhlYWRlciBmaWVsZCBuYW1lcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3QsIG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW2sgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworCisKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGhlYWRlciB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0LCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt2IGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgdGhlIGhlYWRlciBmaWVsZHMgYW5kIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCwgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzWzpdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSGVhZGVycyglcykiICUgYHNlbGYuX2hlYWRlcnNgCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIic3RyKCkgcmV0dXJucyB0aGUgZm9ybWF0dGVkIGhlYWRlcnMsIGNvbXBsZXRlIHdpdGggZW5kIGxpbmUsCisgICAgICAgIHN1aXRhYmxlIGZvciBkaXJlY3QgSFRUUCB0cmFuc21pc3Npb24uIiIiCisgICAgICAgIHJldHVybiAnXHJcbicuam9pbihbIiVzOiAlcyIgJSBrdiBmb3Iga3YgaW4gc2VsZi5faGVhZGVyc10rWycnLCcnXSkKKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgICIiIlJldHVybiBmaXJzdCBtYXRjaGluZyBoZWFkZXIgdmFsdWUgZm9yICduYW1lJywgb3IgJ3ZhbHVlJworCisgICAgICAgIElmIHRoZXJlIGlzIG5vIGhlYWRlciBuYW1lZCAnbmFtZScsIGFkZCBhIG5ldyBoZWFkZXIgd2l0aCBuYW1lICduYW1lJworICAgICAgICBhbmQgdmFsdWUgJ3ZhbHVlJy4iIiIKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXQobmFtZSkKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgobmFtZSx2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworCisgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwgX25hbWUsIF92YWx1ZSwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuCisKKyAgICAgICAgX25hbWUgaXMgdGhlIGhlYWRlciBmaWVsZCB0byBhZGQuICBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBzZXQKKyAgICAgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgaGVhZGVyIGZpZWxkLCB3aXRoIHVuZGVyc2NvcmVzIGNvbnZlcnRlZAorICAgICAgICB0byBkYXNoZXMuICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgYXMga2V5PSJ2YWx1ZSIgdW5sZXNzCisgICAgICAgIHZhbHVlIGlzIE5vbmUsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUga2V5IHdpbGwgYmUgYWRkZWQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKworICAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRoZSBjb3JyZXNwb25kaW5nICdlbWFpbC5NZXNzYWdlJyBtZXRob2QsIHRoaXMgZG9lcworICAgICAgICAqbm90KiBoYW5kbGUgJyhjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpJyB0dXBsZXM6IGFsbCB2YWx1ZXMgbXVzdCBiZQorICAgICAgICBzdHJpbmdzIG9yIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIGlmIF92YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChfdmFsdWUpCisgICAgICAgIGZvciBrLCB2IGluIF9wYXJhbXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoay5yZXBsYWNlKCdfJywgJy0nKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKF9mb3JtYXRwYXJhbShrLnJlcGxhY2UoJ18nLCAnLScpLCB2KSkKKyAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKF9uYW1lLCAiOyAiLmpvaW4ocGFydHMpKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKyMKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTk2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJCYXNlSFRUUFNlcnZlciB0aGF0IGltcGxlbWVudHMgdGhlIFB5dGhvbiBXU0dJIHByb3RvY29sIChQRVAgMzMzLCByZXYgMS4yMSkKKworVGhpcyBpcyBib3RoIGFuIGV4YW1wbGUgb2YgaG93IFdTR0kgY2FuIGJlIGltcGxlbWVudGVkLCBhbmQgYSBiYXNpcyBmb3IgcnVubmluZworc2ltcGxlIHdlYiBhcHBsaWNhdGlvbnMgb24gYSBsb2NhbCBtYWNoaW5lLCBzdWNoIGFzIG1pZ2h0IGJlIGRvbmUgd2hlbiB0ZXN0aW5nCitvciBkZWJ1Z2dpbmcgYW4gYXBwbGljYXRpb24uICBJdCBoYXMgbm90IGJlZW4gcmV2aWV3ZWQgZm9yIHNlY3VyaXR5IGlzc3VlcywKK2hvd2V2ZXIsIGFuZCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgInJlYWwiIHdlYiBzZXJ2ZXIgZm9yCitwcm9kdWN0aW9uIHVzZS4KKworRm9yIGV4YW1wbGUgdXNhZ2UsIHNlZSB0aGUgJ2lmIF9fbmFtZV9fPT0iX19tYWluX18iJyBibG9jayBhdCB0aGUgZW5kIG9mIHRoZQorbW9kdWxlLiAgU2VlIGFsc28gdGhlIEJhc2VIVFRQU2VydmVyIG1vZHVsZSBkb2NzIGZvciBvdGhlciBBUEkgaW5mb3JtYXRpb24uCisiIiIKKworZnJvbSBCYXNlSFRUUFNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgoraW1wb3J0IHVybGxpYiwgc3lzCitmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IFNpbXBsZUhhbmRsZXIKKworX192ZXJzaW9uX18gPSAiMC4xIgorX19hbGxfXyA9IFsnV1NHSVNlcnZlcicsICdXU0dJUmVxdWVzdEhhbmRsZXInLCAnZGVtb19hcHAnLCAnbWFrZV9zZXJ2ZXInXQorCisKK3NlcnZlcl92ZXJzaW9uID0gIldTR0lTZXJ2ZXIvIiArIF9fdmVyc2lvbl9fCitzeXNfdmVyc2lvbiA9ICJQeXRob24vIiArIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KK3NvZnR3YXJlX3ZlcnNpb24gPSBzZXJ2ZXJfdmVyc2lvbiArICcgJyArIHN5c192ZXJzaW9uCisKKworY2xhc3MgU2VydmVySGFuZGxlcihTaW1wbGVIYW5kbGVyKToKKworICAgIHNlcnZlcl9zb2Z0d2FyZSA9IHNvZnR3YXJlX3ZlcnNpb24KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X2hhbmRsZXIubG9nX3JlcXVlc3QoCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMuc3BsaXQoJyAnLDEpWzBdLCBzZWxmLmJ5dGVzX3NlbnQKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIFNpbXBsZUhhbmRsZXIuY2xvc2Uoc2VsZikKKworCisKKworCitjbGFzcyBXU0dJU2VydmVyKEhUVFBTZXJ2ZXIpOgorCisgICAgIiIiQmFzZUhUVFBTZXJ2ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBQeXRob24gV1NHSSBwcm90b2NvbCIiIgorCisgICAgYXBwbGljYXRpb24gPSBOb25lCisKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKKyAgICAgICAgSFRUUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQorICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorCisgICAgZGVmIHNldHVwX2Vudmlyb24oc2VsZik6CisgICAgICAgICMgU2V0IHVwIGJhc2UgZW52aXJvbm1lbnQKKyAgICAgICAgZW52ID0gc2VsZi5iYXNlX2Vudmlyb24gPSB7fQorICAgICAgICBlbnZbJ1NFUlZFUl9OQU1FJ10gPSBzZWxmLnNlcnZlcl9uYW1lCisgICAgICAgIGVudlsnR0FURVdBWV9JTlRFUkZBQ0UnXSA9ICdDR0kvMS4xJworICAgICAgICBlbnZbJ1NFUlZFUl9QT1JUJ10gPSBzdHIoc2VsZi5zZXJ2ZXJfcG9ydCkKKyAgICAgICAgZW52WydSRU1PVEVfSE9TVCddPScnCisgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXT0nJworICAgICAgICBlbnZbJ1NDUklQVF9OQU1FJ10gPSAnJworCisgICAgZGVmIGdldF9hcHAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFwcGxpY2F0aW9uCisKKyAgICBkZWYgc2V0X2FwcChzZWxmLGFwcGxpY2F0aW9uKToKKyAgICAgICAgc2VsZi5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBXU0dJUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisKKyAgICBzZXJ2ZXJfdmVyc2lvbiA9ICJXU0dJU2VydmVyLyIgKyBfX3ZlcnNpb25fXworCisgICAgZGVmIGdldF9lbnZpcm9uKHNlbGYpOgorICAgICAgICBlbnYgPSBzZWxmLnNlcnZlci5iYXNlX2Vudmlyb24uY29weSgpCisgICAgICAgIGVudlsnU0VSVkVSX1BST1RPQ09MJ10gPSBzZWxmLnJlcXVlc3RfdmVyc2lvbgorICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSBzZWxmLmNvbW1hbmQKKyAgICAgICAgaWYgJz8nIGluIHNlbGYucGF0aDoKKyAgICAgICAgICAgIHBhdGgscXVlcnkgPSBzZWxmLnBhdGguc3BsaXQoJz8nLDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoLHF1ZXJ5ID0gc2VsZi5wYXRoLCcnCisKKyAgICAgICAgZW52WydQQVRIX0lORk8nXSA9IHVybGxpYi51bnF1b3RlKHBhdGgpCisgICAgICAgIGVudlsnUVVFUllfU1RSSU5HJ10gPSBxdWVyeQorCisgICAgICAgIGhvc3QgPSBzZWxmLmFkZHJlc3Nfc3RyaW5nKCkKKyAgICAgICAgaWYgaG9zdCAhPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdOgorICAgICAgICAgICAgZW52WydSRU1PVEVfSE9TVCddID0gaG9zdAorICAgICAgICBlbnZbJ1JFTU9URV9BRERSJ10gPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdCisKKyAgICAgICAgaWYgc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9UWVBFJ10gPSBzZWxmLmhlYWRlcnMudHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlaGVhZGVyCisKKyAgICAgICAgbGVuZ3RoID0gc2VsZi5oZWFkZXJzLmdldGhlYWRlcignY29udGVudC1sZW5ndGgnKQorICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ10gPSBsZW5ndGgKKworICAgICAgICBmb3IgaCBpbiBzZWxmLmhlYWRlcnMuaGVhZGVyczoKKyAgICAgICAgICAgIGssdiA9IGguc3BsaXQoJzonLDEpCisgICAgICAgICAgICBrPWsucmVwbGFjZSgnLScsJ18nKS51cHBlcigpOyB2PXYuc3RyaXAoKQorICAgICAgICAgICAgaWYgayBpbiBlbnY6CisgICAgICAgICAgICAgICAgY29udGludWUgICAgICAgICAgICAgICAgICAgICMgc2tpcCBjb250ZW50IGxlbmd0aCwgdHlwZSxldGMuCisgICAgICAgICAgICBpZiAnSFRUUF8nK2sgaW4gZW52OgorICAgICAgICAgICAgICAgIGVudlsnSFRUUF8nK2tdICs9ICcsJyt2ICAgICAjIGNvbW1hLXNlcGFyYXRlIG11bHRpcGxlIGhlYWRlcnMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW52WydIVFRQXycra10gPSB2CisgICAgICAgIHJldHVybiBlbnYKKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIGEgc2luZ2xlIEhUVFAgcmVxdWVzdCIiIgorCisgICAgICAgIHNlbGYucmF3X3JlcXVlc3RsaW5lID0gc2VsZi5yZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKTogIyBBbiBlcnJvciBjb2RlIGhhcyBiZWVuIHNlbnQsIGp1c3QgZXhpdAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCisgICAgICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlLCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5yZXF1ZXN0X2hhbmRsZXIgPSBzZWxmICAgICAgIyBiYWNrcG9pbnRlciBmb3IgbG9nZ2luZworICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIGRlbW9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgIHByaW50ID4+c3Rkb3V0LCAiSGVsbG8gd29ybGQhIgorICAgIHByaW50ID4+c3Rkb3V0CisgICAgaCA9IGVudmlyb24uaXRlbXMoKTsgaC5zb3J0KCkKKyAgICBmb3Igayx2IGluIGg6CisgICAgICAgIHByaW50ID4+c3Rkb3V0LCBrLCc9JyxgdmAKKyAgICBzdGFydF9yZXNwb25zZSgiMjAwIE9LIiwgWygnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpXSkKKyAgICByZXR1cm4gW3N0ZG91dC5nZXR2YWx1ZSgpXQorCisKK2RlZiBtYWtlX3NlcnZlcigKKyAgICBob3N0LCBwb3J0LCBhcHAsIHNlcnZlcl9jbGFzcz1XU0dJU2VydmVyLCBoYW5kbGVyX2NsYXNzPVdTR0lSZXF1ZXN0SGFuZGxlcgorKToKKyAgICAiIiJDcmVhdGUgYSBuZXcgV1NHSSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGBob3N0YCBhbmQgYHBvcnRgIGZvciBgYXBwYCIiIgorICAgIHNlcnZlciA9IHNlcnZlcl9jbGFzcygoaG9zdCwgcG9ydCksIGhhbmRsZXJfY2xhc3MpCisgICAgc2VydmVyLnNldF9hcHAoYXBwKQorICAgIHJldHVybiBzZXJ2ZXIKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQorICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICBwcmludCAiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iCisgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICB3ZWJicm93c2VyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC94eXo/YWJjJykKKyAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKKworCisKKworCisKKworCisKKworCisKKyMKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3V0aWwucHkgYi9MaWIvd3NnaXJlZi91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDliODcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi91dGlsLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJNaXNjZWxsYW5lb3VzIFdTR0ktcmVsYXRlZCBVdGlsaXRpZXMiIiIKKworaW1wb3J0IHBvc2l4cGF0aAorCitfX2FsbF9fID0gWworICAgICdGaWxlV3JhcHBlcicsICdndWVzc19zY2hlbWUnLCAnYXBwbGljYXRpb25fdXJpJywgJ3JlcXVlc3RfdXJpJywKKyAgICAnc2hpZnRfcGF0aF9pbmZvJywgJ3NldHVwX3Rlc3RpbmdfZGVmYXVsdHMnLAorXQorCisKK2NsYXNzIEZpbGVXcmFwcGVyOgorICAgICIiIldyYXBwZXIgdG8gY29udmVydCBmaWxlLWxpa2Ugb2JqZWN0cyB0byBpdGVyYWJsZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbGlrZSwgYmxrc2l6ZT04MTkyKToKKyAgICAgICAgc2VsZi5maWxlbGlrZSA9IGZpbGVsaWtlCisgICAgICAgIHNlbGYuYmxrc2l6ZSA9IGJsa3NpemUKKyAgICAgICAgaWYgaGFzYXR0cihmaWxlbGlrZSwnY2xvc2UnKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBmaWxlbGlrZS5jbG9zZQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKworCisKKworCisKKworZGVmIGd1ZXNzX3NjaGVtZShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gYSBndWVzcyBmb3Igd2hldGhlciAnd3NnaS51cmxfc2NoZW1lJyBzaG91bGQgYmUgJ2h0dHAnIG9yICdodHRwcycKKyAgICAiIiIKKyAgICBpZiBlbnZpcm9uLmdldCgiSFRUUFMiKSBpbiAoJ3llcycsJ29uJywnMScpOgorICAgICAgICByZXR1cm4gJ2h0dHBzJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnaHR0cCcKKworZGVmIGFwcGxpY2F0aW9uX3VyaShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBVUkkgKG5vIFBBVEhfSU5GTyBvciBRVUVSWV9TVFJJTkcpIiIiCisgICAgdXJsID0gZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10rJzovLycKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgcXVvdGUKKworICAgIGlmIGVudmlyb24uZ2V0KCdIVFRQX0hPU1QnKToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ0hUVFBfSE9TVCddCisgICAgZWxzZToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ1NFUlZFUl9OQU1FJ10KKworICAgICAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnNDQzJzoKKyAgICAgICAgICAgICAgICB1cmwgKz0gJzonICsgZW52aXJvblsnU0VSVkVSX1BPUlQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnODAnOgorICAgICAgICAgICAgICAgIHVybCArPSAnOicgKyBlbnZpcm9uWydTRVJWRVJfUE9SVCddCisKKyAgICB1cmwgKz0gcXVvdGUoZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJykgb3IgJy8nKQorICAgIHJldHVybiB1cmwKKworZGVmIHJlcXVlc3RfdXJpKGVudmlyb24sIGluY2x1ZGVfcXVlcnk9MSk6CisgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHJlcXVlc3QgVVJJLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nIiIiCisgICAgdXJsID0gYXBwbGljYXRpb25fdXJpKGVudmlyb24pCisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHF1b3RlCisgICAgcGF0aF9pbmZvID0gcXVvdGUoZW52aXJvbi5nZXQoJ1BBVEhfSU5GTycsJycpKQorICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgdXJsICs9IHBhdGhfaW5mb1sxOl0KKyAgICBlbHNlOgorICAgICAgICB1cmwgKz0gcGF0aF9pbmZvCisgICAgaWYgaW5jbHVkZV9xdWVyeSBhbmQgZW52aXJvbi5nZXQoJ1FVRVJZX1NUUklORycpOgorICAgICAgICB1cmwgKz0gJz8nICsgZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICByZXR1cm4gdXJsCisKK2RlZiBzaGlmdF9wYXRoX2luZm8oZW52aXJvbik6CisgICAgIiIiU2hpZnQgYSBuYW1lIGZyb20gUEFUSF9JTkZPIHRvIFNDUklQVF9OQU1FLCByZXR1cm5pbmcgaXQKKworICAgIElmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgcGF0aCBzZWdtZW50cyBpbiBQQVRIX0lORk8sIHJldHVybiBOb25lLgorICAgIE5vdGU6ICdlbnZpcm9uJyBpcyBtb2RpZmllZCBpbi1wbGFjZTsgdXNlIGEgY29weSBpZiB5b3UgbmVlZCB0byBrZWVwCisgICAgdGhlIG9yaWdpbmFsIFBBVEhfSU5GTyBvciBTQ1JJUFRfTkFNRS4KKworICAgIE5vdGU6IHdoZW4gUEFUSF9JTkZPIGlzIGp1c3QgYSAnLycsIHRoaXMgcmV0dXJucyAnJyBhbmQgYXBwZW5kcyBhIHRyYWlsaW5nCisgICAgJy8nIHRvIFNDUklQVF9OQU1FLCBldmVuIHRob3VnaCBlbXB0eSBwYXRoIHNlZ21lbnRzIGFyZSBub3JtYWxseSBpZ25vcmVkLAorICAgIGFuZCBTQ1JJUFRfTkFNRSBkb2Vzbid0IG5vcm1hbGx5IGVuZCBpbiBhICcvJy4gIFRoaXMgaXMgaW50ZW50aW9uYWwKKyAgICBiZWhhdmlvciwgdG8gZW5zdXJlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICcveCcgYW5kICcveC8nIHdoZW4gdHJhdmVyc2luZyB0byBvYmplY3RzLgorICAgICIiIgorICAgIHBhdGhfaW5mbyA9IGVudmlyb24uZ2V0KCdQQVRIX0lORk8nLCcnKQorICAgIGlmIG5vdCBwYXRoX2luZm86CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBwYXRoX3BhcnRzID0gcGF0aF9pbmZvLnNwbGl0KCcvJykKKyAgICBwYXRoX3BhcnRzWzE6LTFdID0gW3AgZm9yIHAgaW4gcGF0aF9wYXJ0c1sxOi0xXSBpZiBwIGFuZCBwPD4nLiddCisgICAgbmFtZSA9IHBhdGhfcGFydHNbMV0KKyAgICBkZWwgcGF0aF9wYXJ0c1sxXQorCisgICAgc2NyaXB0X25hbWUgPSBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnLCcnKQorICAgIHNjcmlwdF9uYW1lID0gcG9zaXhwYXRoLm5vcm1wYXRoKHNjcmlwdF9uYW1lKycvJytuYW1lKQorICAgIGlmIHNjcmlwdF9uYW1lLmVuZHN3aXRoKCcvJyk6CisgICAgICAgIHNjcmlwdF9uYW1lID0gc2NyaXB0X25hbWVbOi0xXQorICAgIGlmIG5vdCBuYW1lIGFuZCBub3Qgc2NyaXB0X25hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgc2NyaXB0X25hbWUgKz0gJy8nCisKKyAgICBlbnZpcm9uWydTQ1JJUFRfTkFNRSddID0gc2NyaXB0X25hbWUKKyAgICBlbnZpcm9uWydQQVRIX0lORk8nXSAgID0gJy8nLmpvaW4ocGF0aF9wYXJ0cykKKworICAgICMgU3BlY2lhbCBjYXNlOiAnLy4nIG9uIFBBVEhfSU5GTyBkb2Vzbid0IGdldCBzdHJpcHBlZCwKKyAgICAjIGJlY2F1c2Ugd2UgZG9uJ3Qgc3RyaXAgdGhlIGxhc3QgZWxlbWVudCBvZiBQQVRIX0lORk8KKyAgICAjIGlmIHRoZXJlJ3Mgb25seSBvbmUgcGF0aCBwYXJ0IGxlZnQuICBJbnN0ZWFkIG9mIGZpeGluZyB0aGlzCisgICAgIyBhYm92ZSwgd2UgZml4IGl0IGhlcmUgc28gdGhhdCBQQVRIX0lORk8gZ2V0cyBub3JtYWxpemVkIHRvCisgICAgIyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGVudmlyb24uCisgICAgaWYgbmFtZT09Jy4nOgorICAgICAgICBuYW1lID0gTm9uZQorICAgIHJldHVybiBuYW1lCisKK2RlZiBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudmlyb24pOgorICAgICIiIlVwZGF0ZSAnZW52aXJvbicgd2l0aCB0cml2aWFsIGRlZmF1bHRzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisKKyAgICBUaGlzIGFkZHMgdmFyaW91cyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBXU0dJLCBpbmNsdWRpbmcgSFRUUF9IT1NULAorICAgIFNFUlZFUl9OQU1FLCBTRVJWRVJfUE9SVCwgUkVRVUVTVF9NRVRIT0QsIFNDUklQVF9OQU1FLCBQQVRIX0lORk8sCisgICAgYW5kIGFsbCBvZiB0aGUgd3NnaS4qIHZhcmlhYmxlcy4gIEl0IG9ubHkgc3VwcGxpZXMgZGVmYXVsdCB2YWx1ZXMsCisgICAgYW5kIGRvZXMgbm90IHJlcGxhY2UgYW55IGV4aXN0aW5nIHNldHRpbmdzIGZvciB0aGVzZSB2YXJpYWJsZXMuCisKKyAgICBUaGlzIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVuaXQgdGVzdHMgb2YgV1NHSQorICAgIHNlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyB0byBzZXQgdXAgZHVtbXkgZW52aXJvbm1lbnRzLiAgSXQgc2hvdWxkICpub3QqCisgICAgYmUgdXNlZCBieSBhY3R1YWwgV1NHSSBzZXJ2ZXJzIG9yIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIGRhdGEgaXMgZmFrZSEKKyAgICAiIiIKKworICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKQorCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdIVFRQX0hPU1QnLGVudmlyb25bJ1NFUlZFUl9OQU1FJ10pCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdSRVFVRVNUX01FVEhPRCcsJ0dFVCcpCisKKyAgICBpZiAnU0NSSVBUX05BTUUnIG5vdCBpbiBlbnZpcm9uIGFuZCAnUEFUSF9JTkZPJyBub3QgaW4gZW52aXJvbjoKKyAgICAgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTQ1JJUFRfTkFNRScsJycpCisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnUEFUSF9JTkZPJywnLycpCisKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kudmVyc2lvbicsICgxLDApKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5ydW5fb25jZScsIDApCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLm11bHRpdGhyZWFkJywgMCkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kubXVsdGlwcm9jZXNzJywgMCkKKworICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLmlucHV0JywgU3RyaW5nSU8oIiIpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5lcnJvcnMnLCBTdHJpbmdJTygpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJyxndWVzc19zY2hlbWUoZW52aXJvbikpCisKKyAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXT09J2h0dHAnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzgwJykKKyAgICBlbGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddPT0naHR0cHMnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzQ0MycpCisKKworCisKK19ob3BwaXNoID0geworICAgICdjb25uZWN0aW9uJzoxLCAna2VlcC1hbGl2ZSc6MSwgJ3Byb3h5LWF1dGhlbnRpY2F0ZSc6MSwKKyAgICAncHJveHktYXV0aG9yaXphdGlvbic6MSwgJ3RlJzoxLCAndHJhaWxlcnMnOjEsICd0cmFuc2Zlci1lbmNvZGluZyc6MSwKKyAgICAndXBncmFkZSc6MQorfS5oYXNfa2V5CisKK2RlZiBpc19ob3BfYnlfaG9wKGhlYWRlcl9uYW1lKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnaGVhZGVyX25hbWUnIGlzIGFuIEhUVFAvMS4xICJIb3AtYnktSG9wIiBoZWFkZXIiIiIKKyAgICByZXR1cm4gX2hvcHBpc2goaGVhZGVyX25hbWUubG93ZXIoKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkgYi9MaWIvd3NnaXJlZi92YWxpZGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FiOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkKQEAgLTAsMCArMSw0MzIgQEAKKyMgKGMpIDIwMDUgSWFuIEJpY2tpbmcgYW5kIGNvbnRyaWJ1dG9yczsgd3JpdHRlbiBmb3IgUGFzdGUgKGh0dHA6Ly9weXRob25wYXN0ZS5vcmcpCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyMgQWxzbyBsaWNlbmNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIDIuMDogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2FwYWNoZTIuMC5waHAKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50CisiIiIKK01pZGRsZXdhcmUgdG8gY2hlY2sgZm9yIG9iZWRpZW5jZSB0byB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uLgorCitTb21lIG9mIHRoZSB0aGluZ3MgdGhpcyBjaGVja3M6CisKKyogU2lnbmF0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgc3RhcnRfcmVzcG9uc2UgKGluY2x1ZGluZyB0aGF0CisgIGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgdXNlZCkuCisKKyogRW52aXJvbm1lbnQgY2hlY2tzOgorCisgIC0gRW52aXJvbm1lbnQgaXMgYSBkaWN0aW9uYXJ5IChhbmQgbm90IGEgc3ViY2xhc3MpLgorCisgIC0gVGhhdCBhbGwgdGhlIHJlcXVpcmVkIGtleXMgYXJlIGluIHRoZSBlbnZpcm9ubWVudDogUkVRVUVTVF9NRVRIT0QsCisgICAgU0VSVkVSX05BTUUsIFNFUlZFUl9QT1JULCB3c2dpLnZlcnNpb24sIHdzZ2kuaW5wdXQsIHdzZ2kuZXJyb3JzLAorICAgIHdzZ2kubXVsdGl0aHJlYWQsIHdzZ2kubXVsdGlwcm9jZXNzLCB3c2dpLnJ1bl9vbmNlCisKKyAgLSBUaGF0IEhUVFBfQ09OVEVOVF9UWVBFIGFuZCBIVFRQX0NPTlRFTlRfTEVOR1RIIGFyZSBub3QgaW4gdGhlCisgICAgZW52aXJvbm1lbnQgKHRoZXNlIGhlYWRlcnMgc2hvdWxkIGFwcGVhciBhcyBDT05URU5UX0xFTkdUSCBhbmQKKyAgICBDT05URU5UX1RZUEUpLgorCisgIC0gV2FybnMgaWYgUVVFUllfU1RSSU5HIGlzIG1pc3NpbmcsIGFzIHRoZSBjZ2kgbW9kdWxlIGFjdHMKKyAgICB1bnByZWRpY3RhYmx5IGluIHRoYXQgY2FzZS4KKworICAtIFRoYXQgQ0dJLXN0eWxlIHZhcmlhYmxlcyAodGhhdCBkb24ndCBjb250YWluIGEgLikgaGF2ZQorICAgIChub24tdW5pY29kZSkgc3RyaW5nIHZhbHVlcworCisgIC0gVGhhdCB3c2dpLnZlcnNpb24gaXMgYSB0dXBsZQorCisgIC0gVGhhdCB3c2dpLnVybF9zY2hlbWUgaXMgJ2h0dHAnIG9yICdodHRwcycgKEBAOiBpcyB0aGlzIHRvbworICAgIHJlc3RyaWN0aXZlPykKKworICAtIFdhcm5zIGlmIHRoZSBSRVFVRVNUX01FVEhPRCBpcyBub3Qga25vd24gKEBAOiBwcm9iYWJseSB0b28KKyAgICByZXN0cmljdGl2ZSkuCisKKyAgLSBUaGF0IFNDUklQVF9OQU1FIGFuZCBQQVRIX0lORk8gYXJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggLworCisgIC0gVGhhdCBhdCBsZWFzdCBvbmUgb2YgU0NSSVBUX05BTUUgb3IgUEFUSF9JTkZPIGFyZSBzZXQuCisKKyAgLSBUaGF0IENPTlRFTlRfTEVOR1RIIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KKworICAtIFRoYXQgU0NSSVBUX05BTUUgaXMgbm90ICcvJyAoaXQgc2hvdWxkIGJlICcnLCBhbmQgUEFUSF9JTkZPIHNob3VsZAorICAgIGJlICcvJykuCisKKyAgLSBUaGF0IHdzZ2kuaW5wdXQgaGFzIHRoZSBtZXRob2RzIHJlYWQsIHJlYWRsaW5lLCByZWFkbGluZXMsIGFuZAorICAgIF9faXRlcl9fCisKKyAgLSBUaGF0IHdzZ2kuZXJyb3JzIGhhcyB0aGUgbWV0aG9kcyBmbHVzaCwgd3JpdGUsIHdyaXRlbGluZXMKKworKiBUaGUgc3RhdHVzIGlzIGEgc3RyaW5nLCBjb250YWlucyBhIHNwYWNlLCBzdGFydHMgd2l0aCBhbiBpbnRlZ2VyLAorICBhbmQgdGhhdCBpbnRlZ2VyIGlzIGluIHJhbmdlICg+IDEwMCkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBpcyBhIGxpc3QgKG5vdCBhIHN1YmNsYXNzLCBub3QgYW5vdGhlciBraW5kIG9mCisgIHNlcXVlbmNlKS4KKworKiBUaGF0IHRoZSBpdGVtcyBvZiB0aGUgaGVhZGVycyBhcmUgdHVwbGVzIG9mIHN0cmluZ3MuCisKKyogVGhhdCB0aGVyZSBpcyBubyAnc3RhdHVzJyBoZWFkZXIgKHRoYXQgaXMgdXNlZCBpbiBDR0ksIGJ1dCBub3QgaW4KKyAgV1NHSSkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBkb24ndCBjb250YWluIG5ld2xpbmVzIG9yIGNvbG9ucywgZW5kIGluIF8gb3IgLSwgb3IKKyAgY29udGFpbiBjaGFyYWN0ZXJzIGNvZGVzIGJlbG93IDAzNy4KKworKiBUaGF0IENvbnRlbnQtVHlwZSBpcyBnaXZlbiBpZiB0aGVyZSBpcyBjb250ZW50IChDR0kgb2Z0ZW4gaGFzIGEKKyAgZGVmYXVsdCBjb250ZW50IHR5cGUsIGJ1dCBXU0dJIGRvZXMgbm90KS4KKworKiBUaGF0IG5vIENvbnRlbnQtVHlwZSBpcyBnaXZlbiB3aGVuIHRoZXJlIGlzIG5vIGNvbnRlbnQgKEBAOiBpcyB0aGlzCisgIHRvbyByZXN0cmljdGl2ZT8pCisKKyogVGhhdCB0aGUgZXhjX2luZm8gYXJndW1lbnQgdG8gc3RhcnRfcmVzcG9uc2UgaXMgYSB0dXBsZSBvciBOb25lLgorCisqIFRoYXQgYWxsIGNhbGxzIHRvIHRoZSB3cml0ZXIgYXJlIHdpdGggc3RyaW5ncywgYW5kIG5vIG90aGVyIG1ldGhvZHMKKyAgb24gdGhlIHdyaXRlciBhcmUgYWNjZXNzZWQuCisKKyogVGhhdCB3c2dpLmlucHV0IGlzIHVzZWQgcHJvcGVybHk6CisKKyAgLSAucmVhZCgpIGlzIGNhbGxlZCB3aXRoIHplcm8gb3Igb25lIGFyZ3VtZW50CisKKyAgLSBUaGF0IGl0IHJldHVybnMgYSBzdHJpbmcKKworICAtIFRoYXQgcmVhZGxpbmUsIHJlYWRsaW5lcywgYW5kIF9faXRlcl9fIHJldHVybiBzdHJpbmdzCisKKyAgLSBUaGF0IC5jbG9zZSgpIGlzIG5vdCBjYWxsZWQKKworICAtIE5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkCisKKyogVGhhdCB3c2dpLmVycm9ycyBpcyB1c2VkIHByb3Blcmx5OgorCisgIC0gLndyaXRlKCkgYW5kIC53cml0ZWxpbmVzKCkgaXMgY2FsbGVkIHdpdGggYSBzdHJpbmcKKworICAtIFRoYXQgLmNsb3NlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkLgorCisqIFRoZSByZXNwb25zZSBpdGVyYXRvcjoKKworICAtIFRoYXQgaXQgaXMgbm90IGEgc3RyaW5nIChpdCBzaG91bGQgYmUgYSBsaXN0IG9mIGEgc2luZ2xlIHN0cmluZzsgYQorICAgIHN0cmluZyB3aWxsIHdvcmssIGJ1dCBwZXJmb3JtIGhvcnJpYmx5KS4KKworICAtIFRoYXQgLm5leHQoKSByZXR1cm5zIGEgc3RyaW5nCisKKyAgLSBUaGF0IHRoZSBpdGVyYXRvciBpcyBub3QgaXRlcmF0ZWQgb3ZlciB1bnRpbCBzdGFydF9yZXNwb25zZSBoYXMKKyAgICBiZWVuIGNhbGxlZCAodGhhdCBjYW4gc2lnbmFsIGVpdGhlciBhIHNlcnZlciBvciBhcHBsaWNhdGlvbgorICAgIGVycm9yKS4KKworICAtIFRoYXQgLmNsb3NlKCkgaXMgY2FsbGVkIChkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbiwgb25seSBwcmludHMgdG8KKyAgICBzeXMuc3RkZXJyLCBiZWNhdXNlIHdlIG9ubHkga25vdyBpdCBpc24ndCBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0CisgICAgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQpLgorIiIiCitfX2FsbF9fID0gWyd2YWxpZGF0b3InXQorCisKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0eXBlcyBpbXBvcnQgRGljdFR5cGUsIFN0cmluZ1R5cGUsIFR1cGxlVHlwZSwgTGlzdFR5cGUKK2ltcG9ydCB3YXJuaW5ncworCitoZWFkZXJfcmUgPSByZS5jb21waWxlKHInXlthLXpBLVpdW2EtekEtWjAtOVwtX10qJCcpCitiYWRfaGVhZGVyX3ZhbHVlX3JlID0gcmUuY29tcGlsZShyJ1tcMDAwLVwwMzddJykKKworY2xhc3MgV1NHSVdhcm5pbmcoV2FybmluZyk6CisgICAgIiIiCisgICAgUmFpc2VkIGluIHJlc3BvbnNlIHRvIFdTR0ktc3BlYy1yZWxhdGVkIHdhcm5pbmdzCisgICAgIiIiCisKK2RlZiBhc3NlcnRfKGNvbmQsICphcmdzKToKKyAgICBpZiBub3QgY29uZDoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoKmFyZ3MpCisKK2RlZiB2YWxpZGF0b3IoYXBwbGljYXRpb24pOgorCisgICAgIiIiCisgICAgV2hlbiBhcHBsaWVkIGJldHdlZW4gYSBXU0dJIHNlcnZlciBhbmQgYSBXU0dJIGFwcGxpY2F0aW9uLCB0aGlzCisgICAgbWlkZGxld2FyZSB3aWxsIGNoZWNrIGZvciBXU0dJIGNvbXBsaWFuY3kgb24gYSBudW1iZXIgb2YgbGV2ZWxzLgorICAgIFRoaXMgbWlkZGxld2FyZSBkb2VzIG5vdCBtb2RpZnkgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgaW4gYW55CisgICAgd2F5LCBidXQgd2lsbCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvciBpZiBhbnl0aGluZyBzZWVtcyBvZmYKKyAgICAoZXhjZXB0IGZvciBhIGZhaWx1cmUgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIGl0ZXJhdG9yLCB3aGljaAorICAgIHdpbGwgYmUgcHJpbnRlZCB0byBzdGRlcnIgLS0gdGhlcmUncyBubyB3YXkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgYXQgdGhhdCBwb2ludCkuCisgICAgIiIiCisKKyAgICBkZWYgbGludF9hcHAoKmFyZ3MsICoqa3cpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyLCAiVHdvIGFyZ3VtZW50cyByZXF1aXJlZCIpCisgICAgICAgIGFzc2VydF8obm90IGt3LCAiTm8ga2V5d29yZCBhcmd1bWVudHMgYWxsb3dlZCIpCisgICAgICAgIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlID0gYXJncworCisgICAgICAgIGNoZWNrX2Vudmlyb24oZW52aXJvbikKKworICAgICAgICAjIFdlIHVzZSB0aGlzIHRvIGNoZWNrIGlmIHRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIHdpdGhvdXQKKyAgICAgICAgIyBjYWxsaW5nIHN0YXJ0X3Jlc3BvbnNlOgorICAgICAgICBzdGFydF9yZXNwb25zZV9zdGFydGVkID0gW10KKworICAgICAgICBkZWYgc3RhcnRfcmVzcG9uc2Vfd3JhcHBlcigqYXJncywgKiprdyk6CisgICAgICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyIG9yIGxlbihhcmdzKSA9PSAzLCAoCisgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50czogJXMiICUgKGFyZ3MsKSkpCisgICAgICAgICAgICBhc3NlcnRfKG5vdCBrdywgIk5vIGtleXdvcmQgYXJndW1lbnRzIGFsbG93ZWQiKQorICAgICAgICAgICAgc3RhdHVzID0gYXJnc1swXQorICAgICAgICAgICAgaGVhZGVycyA9IGFyZ3NbMV0KKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gYXJnc1syXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUKKworICAgICAgICAgICAgY2hlY2tfc3RhdHVzKHN0YXR1cykKKyAgICAgICAgICAgIGNoZWNrX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgICAgIGNoZWNrX2NvbnRlbnRfdHlwZShzdGF0dXMsIGhlYWRlcnMpCisgICAgICAgICAgICBjaGVja19leGNfaW5mbyhleGNfaW5mbykKKworICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2Vfc3RhcnRlZC5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBXcml0ZVdyYXBwZXIoc3RhcnRfcmVzcG9uc2UoKmFyZ3MpKQorCisgICAgICAgIGVudmlyb25bJ3dzZ2kuaW5wdXQnXSA9IElucHV0V3JhcHBlcihlbnZpcm9uWyd3c2dpLmlucHV0J10pCisgICAgICAgIGVudmlyb25bJ3dzZ2kuZXJyb3JzJ10gPSBFcnJvcldyYXBwZXIoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICAgICBpdGVyYXRvciA9IGFwcGxpY2F0aW9uKGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlX3dyYXBwZXIpCisgICAgICAgIGFzc2VydF8oaXRlcmF0b3IgaXMgbm90IE5vbmUgYW5kIGl0ZXJhdG9yICE9IEZhbHNlLAorICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiBtdXN0IHJldHVybiBhbiBpdGVyYXRvciwgaWYgb25seSBhbiBlbXB0eSBsaXN0IikKKworICAgICAgICBjaGVja19pdGVyYXRvcihpdGVyYXRvcikKKworICAgICAgICByZXR1cm4gSXRlcmF0b3JXcmFwcGVyKGl0ZXJhdG9yLCBzdGFydF9yZXNwb25zZV9zdGFydGVkKQorCisgICAgcmV0dXJuIGxpbnRfYXBwCisKK2NsYXNzIElucHV0V3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2lucHV0KToKKyAgICAgICAgc2VsZi5pbnB1dCA9IHdzZ2lfaW5wdXQKKworICAgIGRlZiByZWFkKHNlbGYsICphcmdzKToKKyAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPD0gMSkKKyAgICAgICAgdiA9IHNlbGYuaW5wdXQucmVhZCgqYXJncykKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHYpIGlzIHR5cGUoIiIpKQorICAgICAgICByZXR1cm4gdgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICB2ID0gc2VsZi5pbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGFzc2VydF8odHlwZSh2KSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA8PSAxKQorICAgICAgICBsaW5lcyA9IHNlbGYuaW5wdXQucmVhZGxpbmVzKCphcmdzKQorICAgICAgICBhc3NlcnRfKHR5cGUobGluZXMpIGlzIHR5cGUoW10pKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGFzc2VydF8odHlwZShsaW5lKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgYXNzZXJ0XygwLCAiaW5wdXQuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBFcnJvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9lcnJvcnMpOgorICAgICAgICBzZWxmLmVycm9ycyA9IHdzZ2lfZXJyb3JzCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi5lcnJvcnMud3JpdGUocykKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcnMuZmx1c2goKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgc2VxKToKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VxOgorICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBhc3NlcnRfKDAsICJlcnJvcnMuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBXcml0ZVdyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV93cml0ZXIpOgorICAgICAgICBzZWxmLndyaXRlciA9IHdzZ2lfd3JpdGVyCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi53cml0ZXIocykKKworY2xhc3MgUGFydGlhbEl0ZXJhdG9yV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2l0ZXJhdG9yKToKKyAgICAgICAgc2VsZi5pdGVyYXRvciA9IHdzZ2lfaXRlcmF0b3IKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIyBXZSB3YW50IHRvIG1ha2Ugc3VyZSBfX2l0ZXJfXyBpcyBjYWxsZWQKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yV3JhcHBlcihzZWxmLml0ZXJhdG9yLCBOb25lKQorCitjbGFzcyBJdGVyYXRvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9pdGVyYXRvciwgY2hlY2tfc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yID0gd3NnaV9pdGVyYXRvcgorICAgICAgICBzZWxmLml0ZXJhdG9yID0gaXRlcih3c2dpX2l0ZXJhdG9yKQorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgPSBjaGVja19zdGFydF9yZXNwb25zZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGFzc2VydF8obm90IHNlbGYuY2xvc2VkLAorICAgICAgICAgICAgIkl0ZXJhdG9yIHJlYWQgYWZ0ZXIgY2xvc2VkIikKKyAgICAgICAgdiA9IHNlbGYuaXRlcmF0b3IubmV4dCgpCisgICAgICAgIGlmIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnRfKHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIGFuZCB3ZSBzdGFydGVkIGl0ZXJhdGluZyBvdmVyIGl0cyBib2R5LCBidXQgc3RhcnRfcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQiKQorICAgICAgICAgICAgc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vcmlnaW5hbF9pdGVyYXRvciwgJ2Nsb3NlJyk6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yLmNsb3NlKCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAgICAgICAgICJJdGVyYXRvciBnYXJiYWdlIGNvbGxlY3RlZCB3aXRob3V0IGJlaW5nIGNsb3NlZCIpCisgICAgICAgIGFzc2VydF8oc2VsZi5jbG9zZWQsCisgICAgICAgICAgICAiSXRlcmF0b3IgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aG91dCBiZWluZyBjbG9zZWQiKQorCitkZWYgY2hlY2tfZW52aXJvbihlbnZpcm9uKToKKyAgICBhc3NlcnRfKHR5cGUoZW52aXJvbikgaXMgRGljdFR5cGUsCisgICAgICAgICJFbnZpcm9ubWVudCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGU6ICVyIChlbnZpcm9ubWVudDogJXIpIgorICAgICAgICAlICh0eXBlKGVudmlyb24pLCBlbnZpcm9uKSkKKworICAgIGZvciBrZXkgaW4gWydSRVFVRVNUX01FVEhPRCcsICdTRVJWRVJfTkFNRScsICdTRVJWRVJfUE9SVCcsCisgICAgICAgICAgICAgICAgJ3dzZ2kudmVyc2lvbicsICd3c2dpLmlucHV0JywgJ3dzZ2kuZXJyb3JzJywKKyAgICAgICAgICAgICAgICAnd3NnaS5tdWx0aXRocmVhZCcsICd3c2dpLm11bHRpcHJvY2VzcycsCisgICAgICAgICAgICAgICAgJ3dzZ2kucnVuX29uY2UnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgaW4gZW52aXJvbiwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudCBtaXNzaW5nIHJlcXVpcmVkIGtleTogJXIiICUgKGtleSwpKQorCisgICAgZm9yIGtleSBpbiBbJ0hUVFBfQ09OVEVOVF9UWVBFJywgJ0hUVFBfQ09OVEVOVF9MRU5HVEgnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgbm90IGluIGVudmlyb24sCisgICAgICAgICAgICAiRW52aXJvbm1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBrZXk6ICVzICIKKyAgICAgICAgICAgICIodXNlICVzIGluc3RlYWQpIiAlIChrZXksIGtleVs1Ol0pKQorCisgICAgaWYgJ1FVRVJZX1NUUklORycgbm90IGluIGVudmlyb246CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HIGlzIG5vdCBpbiB0aGUgV1NHSSBlbnZpcm9ubWVudDsgdGhlIGNnaSAnCisgICAgICAgICAgICAnbW9kdWxlIHdpbGwgdXNlIHN5cy5hcmd2IHdoZW4gdGhpcyB2YXJpYWJsZSBpcyBtaXNzaW5nLCAnCisgICAgICAgICAgICAnc28gYXBwbGljYXRpb24gZXJyb3JzIGFyZSBtb3JlIGxpa2VseScsCisgICAgICAgICAgICBXU0dJV2FybmluZykKKworICAgIGZvciBrZXkgaW4gZW52aXJvbi5rZXlzKCk6CisgICAgICAgIGlmICcuJyBpbiBrZXk6CisgICAgICAgICAgICAjIEV4dGVuc2lvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgdHlwZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKGVudmlyb25ba2V5XSkgaXMgU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudGFsIHZhcmlhYmxlICVzIGlzIG5vdCBhIHN0cmluZzogJXIgKHZhbHVlOiAlcikiCisgICAgICAgICAgICAlIChrZXksIHR5cGUoZW52aXJvbltrZXldKSwgZW52aXJvbltrZXldKSkKKworICAgIGFzc2VydF8odHlwZShlbnZpcm9uWyd3c2dpLnZlcnNpb24nXSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAid3NnaS52ZXJzaW9uIHNob3VsZCBiZSBhIHR1cGxlICglcikiICUgKGVudmlyb25bJ3dzZ2kudmVyc2lvbiddLCkpCisgICAgYXNzZXJ0XyhlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSBpbiAoJ2h0dHAnLCAnaHR0cHMnKSwKKyAgICAgICAgIndzZ2kudXJsX3NjaGVtZSB1bmtub3duOiAlciIgJSBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSkKKworICAgIGNoZWNrX2lucHV0KGVudmlyb25bJ3dzZ2kuaW5wdXQnXSkKKyAgICBjaGVja19lcnJvcnMoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICMgQEA6IHRoZXNlIG5lZWQgZmlsbGluZyBvdXQ6CisgICAgaWYgZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXSBub3QgaW4gKAorICAgICAgICAnR0VUJywgJ0hFQUQnLCAnUE9TVCcsICdPUFRJT05TJywnUFVUJywnREVMRVRFJywnVFJBQ0UnKToKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJVbmtub3duIFJFUVVFU1RfTUVUSE9EOiAlciIgJSBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddLAorICAgICAgICAgICAgV1NHSVdhcm5pbmcpCisKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKQorICAgICAgICAgICAgb3IgZW52aXJvblsnU0NSSVBUX05BTUUnXS5zdGFydHN3aXRoKCcvJyksCisgICAgICAgICJTQ1JJUFRfTkFNRSBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnU0NSSVBUX05BTUUnXSkKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnUEFUSF9JTkZPJykKKyAgICAgICAgICAgIG9yIGVudmlyb25bJ1BBVEhfSU5GTyddLnN0YXJ0c3dpdGgoJy8nKSwKKyAgICAgICAgIlBBVEhfSU5GTyBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnUEFUSF9JTkZPJ10pCisgICAgaWYgZW52aXJvbi5nZXQoJ0NPTlRFTlRfTEVOR1RIJyk6CisgICAgICAgIGFzc2VydF8oaW50KGVudmlyb25bJ0NPTlRFTlRfTEVOR1RIJ10pID49IDAsCisgICAgICAgICAgICAiSW52YWxpZCBDT05URU5UX0xFTkdUSDogJXIiICUgZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXSkKKworICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgYXNzZXJ0XyhlbnZpcm9uLmhhc19rZXkoJ1BBVEhfSU5GTycpLAorICAgICAgICAgICAgIk9uZSBvZiBTQ1JJUFRfTkFNRSBvciBQQVRIX0lORk8gYXJlIHJlcXVpcmVkIChQQVRIX0lORk8gIgorICAgICAgICAgICAgInNob3VsZCBhdCBsZWFzdCBiZSAnLycgaWYgU0NSSVBUX05BTUUgaXMgZW1wdHkpIikKKyAgICBhc3NlcnRfKGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpICE9ICcvJywKKyAgICAgICAgIlNDUklQVF9OQU1FIGNhbm5vdCBiZSAnLyc7IGl0IHNob3VsZCBpbnN0ZWFkIGJlICcnLCBhbmQgIgorICAgICAgICAiUEFUSF9JTkZPIHNob3VsZCBiZSAnLyciKQorCitkZWYgY2hlY2tfaW5wdXQod3NnaV9pbnB1dCk6CisgICAgZm9yIGF0dHIgaW4gWydyZWFkJywgJ3JlYWRsaW5lJywgJ3JlYWRsaW5lcycsICdfX2l0ZXJfXyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9pbnB1dCwgYXR0ciksCisgICAgICAgICAgICAid3NnaS5pbnB1dCAoJXIpIGRvZXNuJ3QgaGF2ZSB0aGUgYXR0cmlidXRlICVzIgorICAgICAgICAgICAgJSAod3NnaV9pbnB1dCwgYXR0cikpCisKK2RlZiBjaGVja19lcnJvcnMod3NnaV9lcnJvcnMpOgorICAgIGZvciBhdHRyIGluIFsnZmx1c2gnLCAnd3JpdGUnLCAnd3JpdGVsaW5lcyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9lcnJvcnMsIGF0dHIpLAorICAgICAgICAgICAgIndzZ2kuZXJyb3JzICglcikgZG9lc24ndCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXMiCisgICAgICAgICAgICAlICh3c2dpX2Vycm9ycywgYXR0cikpCisKK2RlZiBjaGVja19zdGF0dXMoc3RhdHVzKToKKyAgICBhc3NlcnRfKHR5cGUoc3RhdHVzKSBpcyBTdHJpbmdUeXBlLAorICAgICAgICAiU3RhdHVzIG11c3QgYmUgYSBzdHJpbmcgKG5vdCAlcikiICUgc3RhdHVzKQorICAgICMgSW1wbGljaXRseSBjaGVjayB0aGF0IHdlIGNhbiB0dXJuIGl0IGludG8gYW4gaW50ZWdlcjoKKyAgICBzdGF0dXNfY29kZSA9IHN0YXR1cy5zcGxpdChOb25lLCAxKVswXQorICAgIGFzc2VydF8obGVuKHN0YXR1c19jb2RlKSA9PSAzLAorICAgICAgICAiU3RhdHVzIGNvZGVzIG11c3QgYmUgdGhyZWUgY2hhcmFjdGVyczogJXIiICUgc3RhdHVzX2NvZGUpCisgICAgc3RhdHVzX2ludCA9IGludChzdGF0dXNfY29kZSkKKyAgICBhc3NlcnRfKHN0YXR1c19pbnQgPj0gMTAwLCAiU3RhdHVzIGNvZGUgaXMgaW52YWxpZDogJXIiICUgc3RhdHVzX2ludCkKKyAgICBpZiBsZW4oc3RhdHVzKSA8IDQgb3Igc3RhdHVzWzNdICE9ICcgJzoKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGUgc3RhdHVzIHN0cmluZyAoJXIpIHNob3VsZCBiZSBhIHRocmVlLWRpZ2l0IGludGVnZXIgIgorICAgICAgICAgICAgImZvbGxvd2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGFuZCBhIHN0YXR1cyBleHBsYW5hdGlvbiIKKyAgICAgICAgICAgICUgc3RhdHVzLCBXU0dJV2FybmluZykKKworZGVmIGNoZWNrX2hlYWRlcnMoaGVhZGVycyk6CisgICAgYXNzZXJ0Xyh0eXBlKGhlYWRlcnMpIGlzIExpc3RUeXBlLAorICAgICAgICAiSGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSBsaXN0OiAlciIKKyAgICAgICAgJSAoaGVhZGVycywgdHlwZShoZWFkZXJzKSkpCisgICAgaGVhZGVyX25hbWVzID0ge30KKyAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOgorICAgICAgICBhc3NlcnRfKHR5cGUoaXRlbSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAgICAgIkluZGl2aWR1YWwgaGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSB0dXBsZTogJXIiCisgICAgICAgICAgICAlIChpdGVtLCB0eXBlKGl0ZW0pKSkKKyAgICAgICAgYXNzZXJ0XyhsZW4oaXRlbSkgPT0gMikKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtCisgICAgICAgIGFzc2VydF8obmFtZS5sb3dlcigpICE9ICdzdGF0dXMnLAorICAgICAgICAgICAgIlRoZSBTdGF0dXMgaGVhZGVyIGNhbm5vdCBiZSB1c2VkOyBpdCBjb25mbGljdHMgd2l0aCBDR0kgIgorICAgICAgICAgICAgInNjcmlwdCwgYW5kIEhUVFAgc3RhdHVzIGlzIG5vdCBnaXZlbiB0aHJvdWdoIGhlYWRlcnMgIgorICAgICAgICAgICAgIih2YWx1ZTogJXIpLiIgJSB2YWx1ZSkKKyAgICAgICAgaGVhZGVyX25hbWVzW25hbWUubG93ZXIoKV0gPSBOb25lCisgICAgICAgIGFzc2VydF8oJ1xuJyBub3QgaW4gbmFtZSBhbmQgJzonIG5vdCBpbiBuYW1lLAorICAgICAgICAgICAgIkhlYWRlciBuYW1lcyBtYXkgbm90IGNvbnRhaW4gJzonIG9yICdcXG4nOiAlciIgJSBuYW1lKQorICAgICAgICBhc3NlcnRfKGhlYWRlcl9yZS5zZWFyY2gobmFtZSksICJCYWQgaGVhZGVyIG5hbWU6ICVyIiAlIG5hbWUpCisgICAgICAgIGFzc2VydF8obm90IG5hbWUuZW5kc3dpdGgoJy0nKSBhbmQgbm90IG5hbWUuZW5kc3dpdGgoJ18nKSwKKyAgICAgICAgICAgICJOYW1lcyBtYXkgbm90IGVuZCBpbiAnLScgb3IgJ18nOiAlciIgJSBuYW1lKQorICAgICAgICBpZiBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICBhc3NlcnRfKDAsICJCYWQgaGVhZGVyIHZhbHVlOiAlciAoYmFkIGNoYXI6ICVyKSIKKyAgICAgICAgICAgICUgKHZhbHVlLCBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSkuZ3JvdXAoMCkpKQorCitkZWYgY2hlY2tfY29udGVudF90eXBlKHN0YXR1cywgaGVhZGVycyk6CisgICAgY29kZSA9IGludChzdGF0dXMuc3BsaXQoTm9uZSwgMSlbMF0pCisgICAgIyBAQDogbmVlZCBvbmUgbW9yZSBwZXJzb24gdG8gdmVyaWZ5IHRoaXMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDI2MTYKKyAgICAjICAgICBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwKKyAgICBOT19NRVNTQUdFX0JPRFkgPSAoMjA0LCAzMDQpCisgICAgZm9yIG5hbWUsIHZhbHVlIGluIGhlYWRlcnM6CisgICAgICAgIGlmIG5hbWUubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGlmIGNvZGUgbm90IGluIE5PX01FU1NBR0VfQk9EWToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGFzc2VydF8oMCwgKCJDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGEgJXMgcmVzcG9uc2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBtdXN0IG5vdCByZXR1cm4gY29udGVudC4iKSAlIGNvZGUpCisgICAgaWYgY29kZSBub3QgaW4gTk9fTUVTU0FHRV9CT0RZOgorICAgICAgICBhc3NlcnRfKDAsICJObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGhlYWRlcnMgKCVzKSIgJSBoZWFkZXJzKQorCitkZWYgY2hlY2tfZXhjX2luZm8oZXhjX2luZm8pOgorICAgIGFzc2VydF8oZXhjX2luZm8gaXMgTm9uZSBvciB0eXBlKGV4Y19pbmZvKSBpcyB0eXBlKCgpKSwKKyAgICAgICAgImV4Y19pbmZvICglcikgaXMgbm90IGEgdHVwbGU6ICVyIiAlIChleGNfaW5mbywgdHlwZShleGNfaW5mbykpKQorICAgICMgTW9yZSBleGNfaW5mbyBjaGVja3M/CisKK2RlZiBjaGVja19pdGVyYXRvcihpdGVyYXRvcik6CisgICAgIyBUZWNobmljYWxseSBhIHN0cmluZyBpcyBsZWdhbCwgd2hpY2ggaXMgd2h5IGl0J3MgYSByZWFsbHkgYmFkCisgICAgIyBpZGVhLCBiZWNhdXNlIGl0IG1heSBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQKKyAgICAjIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIKKyAgICBhc3NlcnRfKG5vdCBpc2luc3RhbmNlKGl0ZXJhdG9yLCBzdHIpLAorICAgICAgICAiWW91IHNob3VsZCBub3QgcmV0dXJuIGEgc3RyaW5nIGFzIHlvdXIgYXBwbGljYXRpb24gaXRlcmF0b3IsICIKKyAgICAgICAgImluc3RlYWQgcmV0dXJuIGEgc2luZ2xlLWl0ZW0gbGlzdCBjb250YWluaW5nIHRoYXQgc3RyaW5nLiIpCmRpZmYgLS1naXQgYS9MaWIveG1sLnB5IGIvTGliL3htbC9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBMaWIveG1sLnB5CnJlbmFtZSB0byBMaWIveG1sL19faW5pdF9fLnB5CmluZGV4IDczOTNjNjYuLmZhNWU4Y2QgMTAwNjQ0Ci0tLSBhL0xpYi94bWwucHkKKysrIGIvTGliL3htbC9fX2luaXRfXy5weQpAQCAtMTYsOCArMTYsNiBAQAogCiAiIiIKIAotaW1wb3J0IHN5cwotaW1wb3J0IHhtbGNvcmUKIAogX19hbGxfXyA9IFsiZG9tIiwgInBhcnNlcnMiLCAic2F4IiwgImV0cmVlIl0KIApAQCAtMjksMTAgKzI3LDExIEBACiAKIF9NSU5JTVVNX1hNTFBMVVNfVkVSU0lPTiA9ICgwLCA4LCA0KQogCisKIHRyeToKICAgICBpbXBvcnQgX3htbHBsdXMKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBzeXMubW9kdWxlc1tfX25hbWVfX10gPSB4bWxjb3JlCisgICAgcGFzcwogZWxzZToKICAgICB0cnk6CiAgICAgICAgIHYgPSBfeG1scGx1cy52ZXJzaW9uX2luZm8KQEAgLTQxLDcgKzQwLDggQEAKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIGlmIHYgPj0gX01JTklNVU1fWE1MUExVU19WRVJTSU9OOgotICAgICAgICAgICAgX3htbHBsdXMuX19wYXRoX18uZXh0ZW5kKHhtbGNvcmUuX19wYXRoX18pCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBfeG1scGx1cy5fX3BhdGhfXy5leHRlbmQoX19wYXRoX18pCiAgICAgICAgICAgICBzeXMubW9kdWxlc1tfX25hbWVfX10gPSBfeG1scGx1cwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZGVsIHYKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9Ob2RlRmlsdGVyLnB5IGIvTGliL3htbC9kb20vTm9kZUZpbHRlci5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL05vZGVGaWx0ZXIucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL05vZGVGaWx0ZXIucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9fX2luaXRfXy5weSBiL0xpYi94bWwvZG9tL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9fX2luaXRfXy5weQpyZW5hbWUgdG8gTGliL3htbC9kb20vX19pbml0X18ucHkKaW5kZXggMDAyY2RiNy4uNjM2M2QwMCAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL19faW5pdF9fLnB5CisrKyBiL0xpYi94bWwvZG9tL19faW5pdF9fLnB5CkBAIC0xMzYsNCArMTM2LDQgQEAKIEVNUFRZX05BTUVTUEFDRSA9IE5vbmUKIEVNUFRZX1BSRUZJWCA9IE5vbmUKIAotZnJvbSAuZG9tcmVnIGltcG9ydCBnZXRET01JbXBsZW1lbnRhdGlvbixyZWdpc3RlckRPTUltcGxlbWVudGF0aW9uCitmcm9tIGRvbXJlZyBpbXBvcnQgZ2V0RE9NSW1wbGVtZW50YXRpb24scmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL2RvbXJlZy5weSBiL0xpYi94bWwvZG9tL2RvbXJlZy5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9kb20vZG9tcmVnLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9kb21yZWcucHkKaW5kZXggZDYwZWQ2NC4uNjg0YzQzNiAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL2RvbXJlZy5weQorKysgYi9MaWIveG1sL2RvbS9kb21yZWcucHkKQEAgLTIsNyArMiw3IEBACiBkaXJlY3RseS4gSW5zdGVhZCwgdGhlIGZ1bmN0aW9ucyBnZXRET01JbXBsZW1lbnRhdGlvbiBhbmQKIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGltcG9ydGVkIGZyb20geG1sLmRvbS4iIiIKIAotZnJvbSB4bWxjb3JlLmRvbS5taW5pY29tcGF0IGltcG9ydCAqICAjIGlzaW5zdGFuY2UsIFN0cmluZ1R5cGVzCitmcm9tIHhtbC5kb20ubWluaWNvbXBhdCBpbXBvcnQgKiAgIyBpc2luc3RhbmNlLCBTdHJpbmdUeXBlcwogCiAjIFRoaXMgaXMgYSBsaXN0IG9mIHdlbGwta25vd24gaW1wbGVtZW50YXRpb25zLiAgV2VsbC1rbm93biBuYW1lcwogIyBzaG91bGQgYmUgcHVibGlzaGVkIGJ5IHBvc3RpbmcgdG8geG1sLXNpZ0BweXRob24ub3JnLCBhbmQgYXJlCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5IGIvTGliL3htbC9kb20vZXhwYXRidWlsZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL2V4cGF0YnVpbGRlci5weQppbmRleCAzMmZmYTQxLi5hMmY4YTMzIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5CisrKyBiL0xpYi94bWwvZG9tL2V4cGF0YnVpbGRlci5weQpAQCAtMjcsMTMgKzI3LDEzIEBACiAjICAgICAgY2FsbGluZyBhbnkgbWV0aG9kcyBvbiB0aGUgbm9kZSBvYmplY3QgaWYgaXQgZXhpc3RzLiAgKEEgcmF0aGVyCiAjICAgICAgbmljZSBzcGVlZHVwIGlzIGFjaGlldmVkIHRoaXMgd2F5IGFzIHdlbGwhKQogCi1mcm9tIHhtbGNvcmUuZG9tIGltcG9ydCB4bWxidWlsZGVyLCBtaW5pZG9tLCBOb2RlCi1mcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFCi1mcm9tIHhtbGNvcmUucGFyc2VycyBpbXBvcnQgZXhwYXQKLWZyb20geG1sY29yZS5kb20ubWluaWRvbSBpbXBvcnQgX2FwcGVuZF9jaGlsZCwgX3NldF9hdHRyaWJ1dGVfbm9kZQotZnJvbSB4bWxjb3JlLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCitmcm9tIHhtbC5kb20gaW1wb3J0IHhtbGJ1aWxkZXIsIG1pbmlkb20sIE5vZGUKK2Zyb20geG1sLmRvbSBpbXBvcnQgRU1QVFlfTkFNRVNQQUNFLCBFTVBUWV9QUkVGSVgsIFhNTE5TX05BTUVTUEFDRQorZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKK2Zyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBfYXBwZW5kX2NoaWxkLCBfc2V0X2F0dHJpYnV0ZV9ub2RlCitmcm9tIHhtbC5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgogCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCiAKIFRFWFRfTk9ERSA9IE5vZGUuVEVYVF9OT0RFCiBDREFUQV9TRUNUSU9OX05PREUgPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkgYi9MaWIveG1sL2RvbS9taW5pY29tcGF0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9taW5pY29tcGF0LnB5CmluZGV4IGY5OWI3ZmUuLmQ0OTFmYjYgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CisrKyBiL0xpYi94bWwvZG9tL21pbmljb21wYXQucHkKQEAgLTM4LDcgKzM4LDcgQEAKIAogX19hbGxfXyA9IFsiTm9kZUxpc3QiLCAiRW1wdHlOb2RlTGlzdCIsICJTdHJpbmdUeXBlcyIsICJkZWZwcm9wZXJ0eSJdCiAKLWltcG9ydCB4bWxjb3JlLmRvbQoraW1wb3J0IHhtbC5kb20KIAogdHJ5OgogICAgIHVuaWNvZGUKQEAgLTcxLDYgKzcxLDcgQEAKICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICAgc2VsZls6XSA9IHN0YXRlCiAKKwogY2xhc3MgRW1wdHlOb2RlTGlzdCh0dXBsZSk6CiAgICAgX19zbG90c19fID0gKCkKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkgYi9MaWIveG1sL2RvbS9taW5pZG9tLnB5CnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9taW5pZG9tLnB5CmluZGV4IGE4YWJkMTQuLjNhMzU3ODEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CisrKyBiL0xpYi94bWwvZG9tL21pbmlkb20ucHkKQEAgLTE0LDIyICsxNCwyMiBAQAogICogU0FYIDIgbmFtZXNwYWNlcwogIiIiCiAKLWltcG9ydCB4bWxjb3JlLmRvbQoraW1wb3J0IHhtbC5kb20KIAotZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgRU1QVFlfTkFNRVNQQUNFLCBFTVBUWV9QUkVGSVgsIFhNTE5TX05BTUVTUEFDRSwgZG9tcmVnCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKLWZyb20geG1sY29yZS5kb20ueG1sYnVpbGRlciBpbXBvcnQgRE9NSW1wbGVtZW50YXRpb25MUywgRG9jdW1lbnRMUworZnJvbSB4bWwuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFLCBkb21yZWcKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCitmcm9tIHhtbC5kb20ueG1sYnVpbGRlciBpbXBvcnQgRE9NSW1wbGVtZW50YXRpb25MUywgRG9jdW1lbnRMUwogCiAjIFRoaXMgaXMgdXNlZCBieSB0aGUgSUQtY2FjaGUgaW52YWxpZGF0aW9uIGNoZWNrczsgdGhlIGxpc3QgaXNuJ3QKICMgYWN0dWFsbHkgY29tcGxldGUsIHNpbmNlIHRoZSBub2RlcyBiZWluZyBjaGVja2VkIHdpbGwgbmV2ZXIgYmUgdGhlCiAjIERPQ1VNRU5UX05PREUgb3IgRE9DVU1FTlRfRlJBR01FTlRfTk9ERS4gIChUaGUgbm9kZSBiZWluZyBjaGVja2VkIGlzCiAjIHRoZSBub2RlIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQsIG5vdCB0aGUgbm9kZSBiZWluZyBtb2RpZmllZC4pCiAjCi1fbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4gPSAoeG1sY29yZS5kb20uTm9kZS5FTEVNRU5UX05PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sY29yZS5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCitfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4gPSAoeG1sLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKQogCiAKLWNsYXNzIE5vZGUoeG1sY29yZS5kb20uTm9kZSk6CitjbGFzcyBOb2RlKHhtbC5kb20uTm9kZSk6CiAgICAgbmFtZXNwYWNlVVJJID0gTm9uZSAjIHRoaXMgaXMgbm9uLW51bGwgb25seSBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKICAgICBwYXJlbnROb2RlID0gTm9uZQogICAgIG93bmVyRG9jdW1lbnQgPSBOb25lCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgICAgICAjIyMgVGhlIERPTSBkb2VzIG5vdCBjbGVhcmx5IHNwZWNpZnkgd2hhdCB0byByZXR1cm4gaW4gdGhpcyBjYXNlCiAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQKICAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobmV3Q2hpbGQpLCByZXByKHNlbGYpKSkKICAgICAgICAgaWYgbmV3Q2hpbGQucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIG5ld0NoaWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobmV3Q2hpbGQpCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgocmVmQ2hpbGQpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW46CiAgICAgICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCiAgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMuaW5zZXJ0KGluZGV4LCBuZXdDaGlsZCkKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAgICAgIyMjIFRoZSBET00gZG9lcyBub3QgY2xlYXJseSBzcGVjaWZ5IHdoYXQgdG8gcmV0dXJuIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgcmV0dXJuIG5vZGUKICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihub2RlKSwgcmVwcihzZWxmKSkpCiAgICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW46CiAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgc2VsZi5yZW1vdmVDaGlsZChvbGRDaGlsZCkKICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc2VydEJlZm9yZShuZXdDaGlsZCwgcmVmQ2hpbGQpCiAgICAgICAgIGlmIG5ld0NoaWxkLm5vZGVUeXBlIG5vdCBpbiBzZWxmLl9jaGlsZF9ub2RlX3R5cGVzOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5ld0NoaWxkKSwgcmVwcihzZWxmKSkpCiAgICAgICAgIGlmIG5ld0NoaWxkIGlzIG9sZENoaWxkOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgob2xkQ2hpbGQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIHNlbGYuY2hpbGROb2Rlc1tpbmRleF0gPSBuZXdDaGlsZAogICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlID0gc2VsZgogICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5yZW1vdmUob2xkQ2hpbGQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIGlmIG9sZENoaWxkLm5leHRTaWJsaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgb2xkQ2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nCiAgICAgICAgIGlmIG9sZENoaWxkLnByZXZpb3VzU2libGluZyBpcyBub3QgTm9uZToKQEAgLTM4Niw3ICszODYsNyBAQAogICAgICAgICBuc3VyaSA9IHNlbGYubmFtZXNwYWNlVVJJCiAgICAgICAgIGlmIHByZWZpeCA9PSAieG1sbnMiOgogICAgICAgICAgICAgaWYgbnN1cmkgYW5kIG5zdXJpICE9IFhNTE5TX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCiAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiAneG1sbnMnIHByZWZpeCBmb3IgdGhlIHdyb25nIG5hbWVzcGFjZSIpCiAgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCiAgICAgICAgIGRbJ3ByZWZpeCddID0gcHJlZml4CkBAIC01NjQsNyArNTY0LDcgQEAKICAgICAgICAgICAgICAgICBuLl9fZGljdF9fWydvd25lckVsZW1lbnQnXSA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiBuCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKIAogICAgIGRlZiByZW1vdmVOYW1lZEl0ZW1OUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CiAgICAgICAgIG4gPSBzZWxmLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKQpAQCAtNTc2LDExICs1NzYsMTEgQEAKICAgICAgICAgICAgICAgICBuLl9fZGljdF9fWydvd25lckVsZW1lbnQnXSA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiBuCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKIAogICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgbm9kZSk6CiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIEF0dHIpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKICAgICAgICAgb2xkID0gc2VsZi5fYXR0cnMuZ2V0KG5vZGUubmFtZSkKICAgICAgICAgaWYgb2xkOgpAQCAtNzMxLDcgKzczMSw3IEBACiAKICAgICBkZWYgc2V0QXR0cmlidXRlTm9kZShzZWxmLCBhdHRyKToKICAgICAgICAgaWYgYXR0ci5vd25lckVsZW1lbnQgbm90IGluIChOb25lLCBzZWxmKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkludXNlQXR0cmlidXRlRXJyKCJhdHRyaWJ1dGUgbm9kZSBhbHJlYWR5IG93bmVkIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW51c2VBdHRyaWJ1dGVFcnIoImF0dHJpYnV0ZSBub2RlIGFscmVhZHkgb3duZWQiKQogICAgICAgICBvbGQxID0gc2VsZi5fYXR0cnMuZ2V0KGF0dHIubmFtZSwgTm9uZSkKICAgICAgICAgaWYgb2xkMSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHNlbGYucmVtb3ZlQXR0cmlidXRlTm9kZShvbGQxKQpAQCAtNzUzLDIzICs3NTMsMjMgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYXR0ciA9IHNlbGYuX2F0dHJzW25hbWVdCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKIAogICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGF0dHIgPSBzZWxmLl9hdHRyc05TWyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSldCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKIAogICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOb2RlKHNlbGYsIG5vZGUpOgogICAgICAgICBpZiBub2RlIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5fYXR0cnNbbm9kZS5uYW1lXQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCiAgICAgICAgIG5vZGUudW5saW5rKCkKICAgICAgICAgIyBSZXN0b3JlIHRoaXMgc2luY2UgdGhlIG5vZGUgaXMgc3RpbGwgdXNlZnVsIGFuZCBvdGhlcndpc2UKQEAgLTgzNyw5ICs4MzcsOSBAQAogCiAgICAgZGVmIHNldElkQXR0cmlidXRlTm9kZShzZWxmLCBpZEF0dHIpOgogICAgICAgICBpZiBpZEF0dHIgaXMgTm9uZSBvciBub3Qgc2VsZi5pc1NhbWVOb2RlKGlkQXR0ci5vd25lckVsZW1lbnQpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIGlmIF9nZXRfY29udGFpbmluZ19lbnRyZWYoc2VsZikgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoKQogICAgICAgICBpZiBub3QgaWRBdHRyLl9pc19pZDoKICAgICAgICAgICAgIGlkQXR0ci5fX2RpY3RfX1snX2lzX2lkJ10gPSBUcnVlCiAgICAgICAgICAgICBzZWxmLl9tYWdpY19pZF9ub2RlcyArPSAxCkBAIC04ODAsMjIgKzg4MCwyMiBAQAogICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBjYW5ub3QgaGF2ZSBjaGlsZHJlbiIpCiAKICAgICBkZWYgaGFzQ2hpbGROb2RlcyhzZWxmKToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKICAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5ld0NoaWxkLCByZWZDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKIAogICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKAogICAgICAgICAgICAgc2VsZi5ub2RlTmFtZSArICIgbm9kZXMgZG8gbm90IGhhdmUgY2hpbGRyZW4iKQogCiAgICAgZGVmIHJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBkbyBub3QgaGF2ZSBjaGlsZHJlbiIpCiAKIApAQCAtOTYxLDExICs5NjEsMTEgQEAKIAogICAgIGRlZiBzdWJzdHJpbmdEYXRhKHNlbGYsIG9mZnNldCwgY291bnQpOgogICAgICAgICBpZiBvZmZzZXQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQogICAgICAgICBpZiBjb3VudCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvZmZzZXQ6b2Zmc2V0K2NvdW50XQogCiAgICAgZGVmIGFwcGVuZERhdGEoc2VsZiwgYXJnKToKQEAgLTk3MywzMCArOTczLDMwIEBACiAKICAgICBkZWYgaW5zZXJ0RGF0YShzZWxmLCBvZmZzZXQsIGFyZyk6CiAgICAgICAgIGlmIG9mZnNldCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQogICAgICAgICBpZiBvZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCiAgICAgICAgIGlmIGFyZzoKICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIlcyVzJXMiICUgKAogICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6b2Zmc2V0XSwgYXJnLCBzZWxmLmRhdGFbb2Zmc2V0Ol0pCiAKICAgICBkZWYgZGVsZXRlRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50KToKICAgICAgICAgaWYgb2Zmc2V0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKICAgICAgICAgaWYgY291bnQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIGNvdW50OgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzpvZmZzZXRdICsgc2VsZi5kYXRhW29mZnNldCtjb3VudDpdCiAKICAgICBkZWYgcmVwbGFjZURhdGEoc2VsZiwgb2Zmc2V0LCBjb3VudCwgYXJnKToKICAgICAgICAgaWYgb2Zmc2V0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKICAgICAgICAgaWYgY291bnQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIGNvdW50OgogICAgICAgICAgICAgc2VsZi5kYXRhID0gIiVzJXMlcyIgJSAoCiAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpvZmZzZXRdLCBhcmcsIHNlbGYuZGF0YVtvZmZzZXQrY291bnQ6XSkKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAKICAgICBkZWYgc3BsaXRUZXh0KHNlbGYsIG9mZnNldCk6CiAgICAgICAgIGlmIG9mZnNldCA8IDAgb3Igb2Zmc2V0ID4gbGVuKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImlsbGVnYWwgb2Zmc2V0IHZhbHVlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJpbGxlZ2FsIG9mZnNldCB2YWx1ZSIpCiAgICAgICAgIG5ld1RleHQgPSBzZWxmLl9fY2xhc3NfXygpCiAgICAgICAgIG5ld1RleHQuZGF0YSA9IHNlbGYuZGF0YVtvZmZzZXQ6XQogICAgICAgICBuZXdUZXh0Lm93bmVyRG9jdW1lbnQgPSBzZWxmLm93bmVyRG9jdW1lbnQKQEAgLTExODUsMTkgKzExODUsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBkZWYgcmVtb3ZlTmFtZWRJdGVtKHNlbGYsIG5hbWUpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAogICAgICAgICAgICAgIk5hbWVkTm9kZU1hcCBpbnN0YW5jZSBpcyByZWFkLW9ubHkiKQogCiAgICAgZGVmIHJlbW92ZU5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKIAogICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgbm9kZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCiAgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCiAKICAgICBkZWYgc2V0TmFtZWRJdGVtTlMoc2VsZiwgbm9kZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCiAgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKICAgICAgICAgICAgIGNsb25lID0gRG9jdW1lbnRUeXBlKE5vbmUpCiAgICAgICAgICAgICBjbG9uZS5uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgICAgICBjbG9uZS5ub2RlTmFtZSA9IHNlbGYubmFtZQotICAgICAgICAgICAgb3BlcmF0aW9uID0geG1sY29yZS5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECisgICAgICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAogICAgICAgICAgICAgaWYgZGVlcDoKICAgICAgICAgICAgICAgICBjbG9uZS5lbnRpdGllcy5fc2VxID0gW10KICAgICAgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcSA9IFtdCkBAIC0xMzExLDE5ICsxMzExLDE5IEBACiAgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb24KIAogICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBuZXdDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICJjYW5ub3QgYXBwZW5kIGNoaWxkcmVuIHRvIGFuIGVudGl0eSBub2RlIikKIAogICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCBpbnNlcnQgY2hpbGRyZW4gYmVsb3cgYW4gZW50aXR5IG5vZGUiKQogCiAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCByZW1vdmUgY2hpbGRyZW4gZnJvbSBhbiBlbnRpdHkgbm9kZSIpCiAKICAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICJjYW5ub3QgcmVwbGFjZSBjaGlsZHJlbiBvZiBhbiBlbnRpdHkgbm9kZSIpCiAKIGNsYXNzIE5vdGF0aW9uKElkZW50aWZpZWQsIENoaWxkbGVzcywgTm9kZSk6CkBAIC0xMzU1LDcgKzEzNTUsNyBAQAogCiAgICAgZGVmIGNyZWF0ZURvY3VtZW50KHNlbGYsIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgZG9jdHlwZSk6CiAgICAgICAgIGlmIGRvY3R5cGUgYW5kIGRvY3R5cGUucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLldyb25nRG9jdW1lbnRFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoCiAgICAgICAgICAgICAgICAgImRvY3R5cGUgb2JqZWN0IG93bmVkIGJ5IGFub3RoZXIgRE9NIHRyZWUiKQogICAgICAgICBkb2MgPSBzZWxmLl9jcmVhdGVfZG9jdW1lbnQoKQogCkBAIC0xMzc2LDE1ICsxMzc2LDE1IEBACiAgICAgICAgICAgICAjIE51bGwgdGhlIGRvY3VtZW50IGlzIHJldHVybmVkIHdpdGhvdXQgYSBkb2N1bWVudCBlbGVtZW50CiAgICAgICAgICAgICAjIE90aGVyd2lzZSBpZiBkb2N0eXBlIG9yIG5hbWVzcGFjZVVSSSBhcmUgbm90IE5vbmUKICAgICAgICAgICAgICMgVGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBhYm92ZSBwcm9ibGVtCi0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbnZhbGlkQ2hhcmFjdGVyRXJyKCJFbGVtZW50IHdpdGggbm8gbmFtZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkludmFsaWRDaGFyYWN0ZXJFcnIoIkVsZW1lbnQgd2l0aCBubyBuYW1lIikKIAogICAgICAgICBpZiBhZGRfcm9vdF9lbGVtZW50OgogICAgICAgICAgICAgcHJlZml4LCBsb2NhbG5hbWUgPSBfbnNzcGxpdChxdWFsaWZpZWROYW1lKQogICAgICAgICAgICAgaWYgcHJlZml4ID09ICJ4bWwiIFwKICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKCJpbGxlZ2FsIHVzZSBvZiAneG1sJyBwcmVmaXgiKQorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKCJpbGxlZ2FsIHVzZSBvZiAneG1sJyBwcmVmaXgiKQogICAgICAgICAgICAgaWYgcHJlZml4IGFuZCBub3QgbmFtZXNwYWNlVVJJOgotICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mIHByZWZpeCB3aXRob3V0IG5hbWVzcGFjZXMiKQogICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKQogICAgICAgICAgICAgaWYgZG9jdHlwZToKQEAgLTE1MzMsNyArMTUzMyw3IEBACiAKICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobm9kZSksIHJlcHIoc2VsZikpKQogICAgICAgICBpZiBub2RlLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlIG5leHQgdGVzdCBzaW5jZSB0aGlzCkBAIC0xNTQzLDcgKzE1NDMsNyBAQAogCiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgXAogICAgICAgICAgICBhbmQgc2VsZi5fZ2V0X2RvY3VtZW50RWxlbWVudCgpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAidHdvIGRvY3VtZW50IGVsZW1lbnRzIGRpc2FsbG93ZWQiKQogICAgICAgICByZXR1cm4gTm9kZS5hcHBlbmRDaGlsZChzZWxmLCBub2RlKQogCkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMucmVtb3ZlKG9sZENoaWxkKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBvbGRDaGlsZC5uZXh0U2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKICAgICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZSA9IE5vbmUKICAgICAgICAgaWYgc2VsZi5kb2N1bWVudEVsZW1lbnQgaXMgb2xkQ2hpbGQ6CkBAIC0xNTg3LDcgKzE1ODcsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydCBjbG9uZS5kb2N0eXBlIGlzIE5vbmUKICAgICAgICAgICAgICAgICBjbG9uZS5kb2N0eXBlID0gY2hpbGRjbG9uZQogICAgICAgICAgICAgY2hpbGRjbG9uZS5wYXJlbnROb2RlID0gY2xvbmUKLSAgICAgICAgc2VsZi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcih4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsCisgICAgICAgIHNlbGYuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIoeG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgY2xvbmUpCiAgICAgICAgIHJldHVybiBjbG9uZQogCkBAIC0xNzI5LDkgKzE3MjksOSBAQAogCiAgICAgZGVmIGltcG9ydE5vZGUoc2VsZiwgbm9kZSwgZGVlcCk6CiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IG5vZGVzIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IG5vZGVzIikKICAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IHR5cGUgbm9kZXMiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgdHlwZSBub2RlcyIpCiAgICAgICAgIHJldHVybiBfY2xvbmVfbm9kZShub2RlLCBkZWVwLCBzZWxmKQogCiAgICAgZGVmIHdyaXRleG1sKHNlbGYsIHdyaXRlciwgaW5kZW50PSIiLCBhZGRpbmRlbnQ9IiIsIG5ld2w9IiIsCkBAIC0xNzQ3LDI0ICsxNzQ3LDI0IEBACiAKICAgICBkZWYgcmVuYW1lTm9kZShzZWxmLCBuLCBuYW1lc3BhY2VVUkksIG5hbWUpOgogICAgICAgICBpZiBuLm93bmVyRG9jdW1lbnQgaXMgbm90IHNlbGY6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAogICAgICAgICAgICAgICAgICJjYW5ub3QgcmVuYW1lIG5vZGVzIGZyb20gb3RoZXIgZG9jdW1lbnRzO1xuIgogICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyxcbmZvdW5kICVzIiAlIChzZWxmLCBuLm93bmVyRG9jdW1lbnQpKQogICAgICAgICBpZiBuLm5vZGVUeXBlIG5vdCBpbiAoTm9kZS5FTEVNRU5UX05PREUsIE5vZGUuQVRUUklCVVRFX05PREUpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgInJlbmFtZU5vZGUoKSBvbmx5IGFwcGxpZXMgdG8gZWxlbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzIikKICAgICAgICAgaWYgbmFtZXNwYWNlVVJJICE9IEVNUFRZX05BTUVTUEFDRToKICAgICAgICAgICAgIGlmICc6JyBpbiBuYW1lOgogICAgICAgICAgICAgICAgIHByZWZpeCwgbG9jYWxOYW1lID0gbmFtZS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgaWYgKCAgcHJlZml4ID09ICJ4bWxucyIKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbGNvcmUuZG9tLlhNTE5TX05BTUVTUEFDRSk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbC5kb20uWE1MTlNfTkFNRVNQQUNFKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCiAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgJ3htbG5zJyBwcmVmaXgiKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiAoICBuYW1lID09ICJ4bWxucyIKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbGNvcmUuZG9tLlhNTE5TX05BTUVTUEFDRQorICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sLmRvbS5YTUxOU19OQU1FU1BBQ0UKICAgICAgICAgICAgICAgICAgICAgICBhbmQgbi5ub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiB0aGUgJ3htbG5zJyBhdHRyaWJ1dGUiKQogICAgICAgICAgICAgICAgIHByZWZpeCA9IE5vbmUKICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBuYW1lCkBAIC0xODEwLDkgKzE4MTAsOSBAQAogICAgIENhbGxlZCBieSBOb2RlLmNsb25lTm9kZSBhbmQgRG9jdW1lbnQuaW1wb3J0Tm9kZQogICAgICIiIgogICAgIGlmIG5vZGUub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKG5ld093bmVyRG9jdW1lbnQpOgotICAgICAgICBvcGVyYXRpb24gPSB4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKKyAgICAgICAgb3BlcmF0aW9uID0geG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKICAgICBlbHNlOgotICAgICAgICBvcGVyYXRpb24gPSB4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRAorICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECiAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhub2RlLm5hbWVzcGFjZVVSSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lKQpAQCAtMTg0OSw3ICsxODQ5LDcgQEAKICAgICAgICAgY2xvbmUudmFsdWUgPSBub2RlLnZhbHVlCiAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICBhc3NlcnQgbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBuZXdPd25lckRvY3VtZW50Ci0gICAgICAgIG9wZXJhdGlvbiA9IHhtbGNvcmUuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECisgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKICAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZSgKICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNJZCwgbm9kZS5zeXN0ZW1JZCkKICAgICAgICAgY2xvbmUub3duZXJEb2N1bWVudCA9IG5ld093bmVyRG9jdW1lbnQKQEAgLTE4NzYsNyArMTg3Niw3IEBACiAgICAgICAgICMgTm90ZSB0aGUgY2xvbmluZyBvZiBEb2N1bWVudCBhbmQgRG9jdW1lbnRUeXBlIG5vZGVzIGlzCiAgICAgICAgICMgaW1wbGVtZW5ldGF0aW9uIHNwZWNpZmljLiAgbWluaWRvbSBoYW5kbGVzIHRob3NlIGNhc2VzCiAgICAgICAgICMgZGlyZWN0bHkgaW4gdGhlIGNsb25lTm9kZSgpIG1ldGhvZHMuCi0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigiQ2Fubm90IGNsb25lIG5vZGUgJXMiICUgcmVwcihub2RlKSkKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoIkNhbm5vdCBjbG9uZSBub2RlICVzIiAlIHJlcHIobm9kZSkpCiAKICAgICAjIENoZWNrIGZvciBfY2FsbF91c2VyX2RhdGFfaGFuZGxlcigpIHNpbmNlIHRoaXMgY291bGQgY29uY2VpdmFibHkKICAgICAjIHVzZWQgd2l0aCBvdGhlciBET00gaW1wbGVtZW50YXRpb25zIChvbmUgb2YgdGhlIEZvdXJUaG91Z2h0CkBAIC0xOTA5LDIwICsxOTA5LDIwIEBACiBkZWYgcGFyc2UoZmlsZSwgcGFyc2VyPU5vbmUsIGJ1ZnNpemU9Tm9uZSk6CiAgICAgIiIiUGFyc2UgYSBmaWxlIGludG8gYSBET00gYnkgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QuIiIiCiAgICAgaWYgcGFyc2VyIGlzIE5vbmUgYW5kIG5vdCBidWZzaXplOgotICAgICAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKICAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZShmaWxlKQogICAgIGVsc2U6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IHB1bGxkb20KKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCiAgICAgICAgIHJldHVybiBfZG9fcHVsbGRvbV9wYXJzZShwdWxsZG9tLnBhcnNlLCAoZmlsZSwpLAogICAgICAgICAgICAgeydwYXJzZXInOiBwYXJzZXIsICdidWZzaXplJzogYnVmc2l6ZX0pCiAKIGRlZiBwYXJzZVN0cmluZyhzdHJpbmcsIHBhcnNlcj1Ob25lKToKICAgICAiIiJQYXJzZSBhIGZpbGUgaW50byBhIERPTSBmcm9tIGEgc3RyaW5nLiIiIgogICAgIGlmIHBhcnNlciBpcyBOb25lOgotICAgICAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKICAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZVN0cmluZyhzdHJpbmcpCiAgICAgZWxzZToKLSAgICAgICAgZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgcHVsbGRvbQorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KICAgICAgICAgcmV0dXJuIF9kb19wdWxsZG9tX3BhcnNlKHB1bGxkb20ucGFyc2VTdHJpbmcsIChzdHJpbmcsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncGFyc2VyJzogcGFyc2VyfSkKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL3B1bGxkb20ucHkgYi9MaWIveG1sL2RvbS9wdWxsZG9tLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9wdWxsZG9tLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9wdWxsZG9tLnB5CmluZGV4IGRhZDM3MTguLjE4ZjQ5YjUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9wdWxsZG9tLnB5CisrKyBiL0xpYi94bWwvZG9tL3B1bGxkb20ucHkKQEAgLTEsNSArMSw1IEBACi1pbXBvcnQgeG1sY29yZS5zYXgKLWltcG9ydCB4bWxjb3JlLnNheC5oYW5kbGVyCitpbXBvcnQgeG1sLnNheAoraW1wb3J0IHhtbC5zYXguaGFuZGxlcgogaW1wb3J0IHR5cGVzCiAKIHRyeToKQEAgLTE2LDEyICsxNiwxMiBAQAogSUdOT1JBQkxFX1dISVRFU1BBQ0UgPSAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiCiBDSEFSQUNURVJTID0gIkNIQVJBQ1RFUlMiCiAKLWNsYXNzIFB1bGxET00oeG1sY29yZS5zYXguQ29udGVudEhhbmRsZXIpOgorY2xhc3MgUHVsbERPTSh4bWwuc2F4LkNvbnRlbnRIYW5kbGVyKToKICAgICBfbG9jYXRvciA9IE5vbmUKICAgICBkb2N1bWVudCA9IE5vbmUKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkb2N1bWVudEZhY3Rvcnk9Tm9uZSk6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IFhNTF9OQU1FU1BBQ0UKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBYTUxfTkFNRVNQQUNFCiAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0gZG9jdW1lbnRGYWN0b3J5CiAgICAgICAgIHNlbGYuZmlyc3RFdmVudCA9IFtOb25lLCBOb25lXQogICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYuZmlyc3RFdmVudApAQCAtMTY0LDggKzE2NCw4IEBACiAKICAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKICAgICAgICAgaWYgc2VsZi5kb2N1bWVudEZhY3RvcnkgaXMgTm9uZToKLSAgICAgICAgICAgIGltcG9ydCB4bWxjb3JlLmRvbS5taW5pZG9tCi0gICAgICAgICAgICBzZWxmLmRvY3VtZW50RmFjdG9yeSA9IHhtbGNvcmUuZG9tLm1pbmlkb20uRG9jdW1lbnQuaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGltcG9ydCB4bWwuZG9tLm1pbmlkb20KKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0geG1sLmRvbS5taW5pZG9tLkRvY3VtZW50LmltcGxlbWVudGF0aW9uCiAKICAgICBkZWYgYnVpbGREb2N1bWVudChzZWxmLCB1cmksIHRhZ25hbWUpOgogICAgICAgICAjIENhbid0IGRvIHRoYXQgaW4gc3RhcnREb2N1bWVudCwgc2luY2Ugd2UgbmVlZCB0aGUgdGFnbmFtZQpAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnB1bGxkb20gPSBQdWxsRE9NKCkKICAgICAgICAgIyBUaGlzIGNvbnRlbnQgaGFuZGxlciByZWxpZXMgb24gbmFtZXNwYWNlIHN1cHBvcnQKLSAgICAgICAgc2VsZi5wYXJzZXIuc2V0RmVhdHVyZSh4bWxjb3JlLnNheC5oYW5kbGVyLmZlYXR1cmVfbmFtZXNwYWNlcywgMSkKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0RmVhdHVyZSh4bWwuc2F4LmhhbmRsZXIuZmVhdHVyZV9uYW1lc3BhY2VzLCAxKQogICAgICAgICBzZWxmLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcihzZWxmLnB1bGxkb20pCiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcG9zKToKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHN0cmVhbSA9IHN0cmVhbV9vcl9zdHJpbmcKICAgICBpZiBub3QgcGFyc2VyOgotICAgICAgICBwYXJzZXIgPSB4bWxjb3JlLnNheC5tYWtlX3BhcnNlcigpCisgICAgICAgIHBhcnNlciA9IHhtbC5zYXgubWFrZV9wYXJzZXIoKQogICAgIHJldHVybiBET01FdmVudFN0cmVhbShzdHJlYW0sIHBhcnNlciwgYnVmc2l6ZSkKIAogZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgcGFyc2VyPU5vbmUpOgpAQCAtMzQ3LDUgKzM0Nyw1IEBACiAgICAgYnVmc2l6ZSA9IGxlbihzdHJpbmcpCiAgICAgYnVmID0gU3RyaW5nSU8oc3RyaW5nKQogICAgIGlmIG5vdCBwYXJzZXI6Ci0gICAgICAgIHBhcnNlciA9IHhtbGNvcmUuc2F4Lm1ha2VfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyID0geG1sLnNheC5tYWtlX3BhcnNlcigpCiAgICAgcmV0dXJuIERPTUV2ZW50U3RyZWFtKGJ1ZiwgcGFyc2VyLCBidWZzaXplKQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkgYi9MaWIveG1sL2RvbS94bWxidWlsZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS94bWxidWlsZGVyLnB5CmluZGV4IDY1NjZkM2MuLmFjMWQ0NDggMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CisrKyBiL0xpYi94bWwvZG9tL3htbGJ1aWxkZXIucHkKQEAgLTEsOSArMSw5IEBACiAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRE9NIExldmVsIDMgJ0xTLUxvYWQnIGZlYXR1cmUuIiIiCiAKIGltcG9ydCBjb3B5Ci1pbXBvcnQgeG1sY29yZS5kb20KK2ltcG9ydCB4bWwuZG9tCiAKLWZyb20geG1sY29yZS5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgorZnJvbSB4bWwuZG9tLk5vZGVGaWx0ZXIgaW1wb3J0IE5vZGVGaWx0ZXIKIAogCiBfX2FsbF9fID0gWyJET01CdWlsZGVyIiwgIkRPTUVudGl0eVJlc29sdmVyIiwgIkRPTUlucHV0U291cmNlIl0KQEAgLTc4LDEzICs3OCwxMyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2VsZi5fc2V0dGluZ3NbKF9uYW1lX3hmb3JtKG5hbWUpLCBzdGF0ZSldCiAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZmVhdHVyZTogJXIiICUgKG5hbWUsKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNldHRpbmdzOgogICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYuX29wdGlvbnMsIG5hbWUsIHZhbHVlKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoInVua25vd24gZmVhdHVyZTogIiArIHJlcHIobmFtZSkpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCJ1bmtub3duIGZlYXR1cmU6ICIgKyByZXByKG5hbWUpKQogCiAgICAgZGVmIHN1cHBvcnRzRmVhdHVyZShzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fb3B0aW9ucywgX25hbWVfeGZvcm0obmFtZSkpCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuZW50aXRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY2RhdGFfc2VjdGlvbnMpKQotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoImZlYXR1cmUgJXMgbm90IGtub3duIiAlIHJlcHIobmFtZSkpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCJmZWF0dXJlICVzIG5vdCBrbm93biIgJSByZXByKG5hbWUpKQogCiAgICAgZGVmIHBhcnNlVVJJKHNlbGYsIHVyaSk6CiAgICAgICAgIGlmIHNlbGYuZW50aXR5UmVzb2x2ZXI6CkBAIC0yMDAsOCArMjAwLDggQEAKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiSGF2ZW4ndCB3cml0dGVuIHRoaXMgeWV0Li4uIikKIAogICAgIGRlZiBfcGFyc2VfYnl0ZXN0cmVhbShzZWxmLCBzdHJlYW0sIG9wdGlvbnMpOgotICAgICAgICBpbXBvcnQgeG1sY29yZS5kb20uZXhwYXRidWlsZGVyCi0gICAgICAgIGJ1aWxkZXIgPSB4bWxjb3JlLmRvbS5leHBhdGJ1aWxkZXIubWFrZUJ1aWxkZXIob3B0aW9ucykKKyAgICAgICAgaW1wb3J0IHhtbC5kb20uZXhwYXRidWlsZGVyCisgICAgICAgIGJ1aWxkZXIgPSB4bWwuZG9tLmV4cGF0YnVpbGRlci5tYWtlQnVpbGRlcihvcHRpb25zKQogICAgICAgICByZXR1cm4gYnVpbGRlci5wYXJzZUZpbGUoc3RyZWFtKQogCiAKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICByZXR1cm4gRmFsc2UKICAgICBkZWYgX3NldF9hc3luYyhzZWxmLCBhc3luYyk6CiAgICAgICAgIGlmIGFzeW5jOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgImFzeW5jaHJvbm91cyBkb2N1bWVudCBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpAQCAtMzU5LDcgKzM1OSw3IEBACiAgICAgICAgIGlmIHNub2RlIGlzIE5vbmU6CiAgICAgICAgICAgICBzbm9kZSA9IHNlbGYKICAgICAgICAgZWxpZiBzbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBzZWxmOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uV3JvbmdEb2N1bWVudEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoKQogICAgICAgICByZXR1cm4gc25vZGUudG94bWwoKQogCiAKQEAgLTM2OSwxMiArMzY5LDEyIEBACiAKICAgICBkZWYgY3JlYXRlRE9NQnVpbGRlcihzZWxmLCBtb2RlLCBzY2hlbWFUeXBlKToKICAgICAgICAgaWYgc2NoZW1hVHlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICJzY2hlbWFUeXBlIG5vdCB5ZXQgc3VwcG9ydGVkIikKICAgICAgICAgaWYgbW9kZSA9PSBzZWxmLk1PREVfU1lOQ0hST05PVVM6CiAgICAgICAgICAgICByZXR1cm4gRE9NQnVpbGRlcigpCiAgICAgICAgIGlmIG1vZGUgPT0gc2VsZi5NT0RFX0FTWU5DSFJPTk9VUzoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICJhc3luY2hyb25vdXMgYnVpbGRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIHZhbHVlIGZvciBtb2RlIikKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CnJlbmFtZSB0byBMaWIveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CmluZGV4IGQ3Zjg1YjMuLjk3NGNjMjEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKQEAgLTQ5LDcgKzQ5LDcgQEAKICMjCiAKIGltcG9ydCBjb3B5Ci1mcm9tIC4gaW1wb3J0IEVsZW1lbnRUcmVlCitpbXBvcnQgRWxlbWVudFRyZWUKIAogWElOQ0xVREUgPSAie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGV9IgogCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9ldHJlZS9FbGVtZW50UGF0aC5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRQYXRoLnB5CnJlbmFtZSB0byBMaWIveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9ldHJlZS9FbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudFRyZWUucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKaW5kZXggYjM5NzYwZWEuLjdkYmM3MmUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRUcmVlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAidG9zdHJpbmciLAogICAgICJUcmVlQnVpbGRlciIsCiAgICAgIlZFUlNJT04iLCAiWE1MIiwKLSAgICAiWE1MVHJlZUJ1aWxkZXIiLAorICAgICJYTUxQYXJzZXIiLCAiWE1MVHJlZUJ1aWxkZXIiLAogICAgIF0KIAogIyMKQEAgLTExMTIsNyArMTExMiw3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaHRtbD0wLCB0YXJnZXQ9Tm9uZSk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgICAgICAgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCBleHBhdDsgdXNlIFNpbXBsZVhNTFRyZWVCdWlsZGVyIGluc3RlYWQiCkBAIC0xMTk0LDcgKzExOTQsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX3RhcmdldC5kYXRhKHNlbGYuZW50aXR5W3RleHRbMTotMV1dKQogICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIGZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgICAgICAgICAgICAgIGZyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0CiAgICAgICAgICAgICAgICAgcmFpc2UgZXhwYXQuZXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgZW50aXR5ICVzOiBsaW5lICVkLCBjb2x1bW4gJWQiICUKICAgICAgICAgICAgICAgICAgICAgKHRleHQsIHNlbGYuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIsCkBAIC0xMjU1LDMgKzEyNTUsNiBAQAogICAgICAgICB0cmVlID0gc2VsZi5fdGFyZ2V0LmNsb3NlKCkKICAgICAgICAgZGVsIHNlbGYuX3RhcmdldCwgc2VsZi5fcGFyc2VyICMgZ2V0IHJpZCBvZiBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgIHJldHVybiB0cmVlCisKKyMgY29tcGF0aWJpbGl0eQorWE1MUGFyc2VyID0gWE1MVHJlZUJ1aWxkZXIKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL19faW5pdF9fLnB5IGIvTGliL3htbC9ldHJlZS9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvX19pbml0X18ucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL2NFbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9ldHJlZS9jRWxlbWVudFRyZWUucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9wYXJzZXJzL19faW5pdF9fLnB5IGIvTGliL3htbC9wYXJzZXJzL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9wYXJzZXJzL19faW5pdF9fLnB5CnJlbmFtZSB0byBMaWIveG1sL3BhcnNlcnMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3BhcnNlcnMvZXhwYXQucHkgYi9MaWIveG1sL3BhcnNlcnMvZXhwYXQucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3BhcnNlcnMvZXhwYXQucHkKcmVuYW1lIHRvIExpYi94bWwvcGFyc2Vycy9leHBhdC5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvc2F4L19faW5pdF9fLnB5IGIvTGliL3htbC9zYXgvX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L19faW5pdF9fLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9fX2luaXRfXy5weQppbmRleCA4YWZiZGIwLi42YjFiMWJhIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgvX19pbml0X18ucHkKKysrIGIvTGliL3htbC9zYXgvX19pbml0X18ucHkKQEAgLTE5LDExICsxOSwxMSBAQAogZXhwYXRyZWFkZXIgLS0gRHJpdmVyIHRoYXQgYWxsb3dzIHVzZSBvZiB0aGUgRXhwYXQgcGFyc2VyIHdpdGggU0FYLgogIiIiCiAKLWZyb20gLnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UKLWZyb20gLmhhbmRsZXIgaW1wb3J0IENvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIKLWZyb20gLl9leGNlcHRpb25zIGltcG9ydCAoU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQVhSZWFkZXJOb3RBdmFpbGFibGUpCitmcm9tIHhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UKK2Zyb20gaGFuZGxlciBpbXBvcnQgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlcgorZnJvbSBfZXhjZXB0aW9ucyBpbXBvcnQgU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhSZWFkZXJOb3RBdmFpbGFibGUKIAogCiBkZWYgcGFyc2Uoc291cmNlLCBoYW5kbGVyLCBlcnJvckhhbmRsZXI9RXJyb3JIYW5kbGVyKCkpOgpAQCAtNTEsMTIgKzUxLDEyIEBACiAjIHRoaXMgaXMgdGhlIHBhcnNlciBsaXN0IHVzZWQgYnkgdGhlIG1ha2VfcGFyc2VyIGZ1bmN0aW9uIGlmIG5vCiAjIGFsdGVybmF0aXZlcyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb24KIAotZGVmYXVsdF9wYXJzZXJfbGlzdCA9IFsieG1sY29yZS5zYXguZXhwYXRyZWFkZXIiXQorZGVmYXVsdF9wYXJzZXJfbGlzdCA9IFsieG1sLnNheC5leHBhdHJlYWRlciJdCiAKICMgdGVsbCBtb2R1bGVmaW5kZXIgdGhhdCBpbXBvcnRpbmcgc2F4IHBvdGVudGlhbGx5IGltcG9ydHMgZXhwYXRyZWFkZXIKIF9mYWxzZSA9IDAKIGlmIF9mYWxzZToKLSAgICBpbXBvcnQgeG1sY29yZS5zYXguZXhwYXRyZWFkZXIKKyAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgogCiBpbXBvcnQgb3MsIHN5cwogaWYgb3MuZW52aXJvbi5oYXNfa2V5KCJQWV9TQVhfUEFSU0VSIik6CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvX2V4Y2VwdGlvbnMucHkgYi9MaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L19leGNlcHRpb25zLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvc2F4L2V4cGF0cmVhZGVyLnB5IGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L2V4cGF0cmVhZGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9leHBhdHJlYWRlci5weQppbmRleCA2ZmJkMjJlLi5iYjljMjk0IDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgvZXhwYXRyZWFkZXIucHkKKysrIGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKQEAgLTUsMjcgKzUsMjcgQEAKIAogdmVyc2lvbiA9ICIwLjIwIgogCi1mcm9tIHhtbGNvcmUuc2F4Ll9leGNlcHRpb25zIGltcG9ydCAqCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfdmFsaWRhdGlvbiwgZmVhdHVyZV9uYW1lc3BhY2VzCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfbmFtZXNwYWNlX3ByZWZpeGVzCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfZXh0ZXJuYWxfZ2VzLCBmZWF0dXJlX2V4dGVybmFsX3BlcwotZnJvbSB4bWxjb3JlLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcKLWZyb20geG1sY29yZS5zYXguaGFuZGxlciBpbXBvcnQgcHJvcGVydHlfeG1sX3N0cmluZywgcHJvcGVydHlfaW50ZXJuaW5nX2RpY3QKK2Zyb20geG1sLnNheC5fZXhjZXB0aW9ucyBpbXBvcnQgKgorZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfdmFsaWRhdGlvbiwgZmVhdHVyZV9uYW1lc3BhY2VzCitmcm9tIHhtbC5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX2V4dGVybmFsX2dlcywgZmVhdHVyZV9leHRlcm5hbF9wZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBwcm9wZXJ0eV94bWxfc3RyaW5nLCBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdAogCi0jIHhtbGNvcmUucGFyc2Vycy5leHBhdCBkb2VzIG5vdCByYWlzZSBJbXBvcnRFcnJvciBpbiBKeXRob24KKyMgeG1sLnBhcnNlcnMuZXhwYXQgZG9lcyBub3QgcmFpc2UgSW1wb3J0RXJyb3IgaW4gSnl0aG9uCiBpbXBvcnQgc3lzCiBpZiBzeXMucGxhdGZvcm1bOjRdID09ICJqYXZhIjoKICAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoImV4cGF0IG5vdCBhdmFpbGFibGUgaW4gSmF2YSIsIE5vbmUpCiBkZWwgc3lzCiAKIHRyeToKLSAgICBmcm9tIHhtbGNvcmUucGFyc2VycyBpbXBvcnQgZXhwYXQKKyAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCiBlbHNlOgogICAgIGlmIG5vdCBoYXNhdHRyKGV4cGF0LCAiUGFyc2VyQ3JlYXRlIik6CiAgICAgICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCi1mcm9tIHhtbGNvcmUuc2F4IGltcG9ydCB4bWxyZWFkZXIsIHNheHV0aWxzLCBoYW5kbGVyCitmcm9tIHhtbC5zYXggaW1wb3J0IHhtbHJlYWRlciwgc2F4dXRpbHMsIGhhbmRsZXIKIAogQXR0cmlidXRlc0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc0ltcGwKIEF0dHJpYnV0ZXNOU0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc05TSW1wbApAQCAtNDA3LDggKzQwNyw4IEBACiAjIC0tLQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCB4bWxjb3JlLnNheAorICAgIGltcG9ydCB4bWwuc2F4CiAgICAgcCA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIHAuc2V0Q29udGVudEhhbmRsZXIoeG1sY29yZS5zYXguWE1MR2VuZXJhdG9yKCkpCi0gICAgcC5zZXRFcnJvckhhbmRsZXIoeG1sY29yZS5zYXguRXJyb3JIYW5kbGVyKCkpCisgICAgcC5zZXRDb250ZW50SGFuZGxlcih4bWwuc2F4LlhNTEdlbmVyYXRvcigpKQorICAgIHAuc2V0RXJyb3JIYW5kbGVyKHhtbC5zYXguRXJyb3JIYW5kbGVyKCkpCiAgICAgcC5wYXJzZSgiLi4vLi4vLi4vaGFtbGV0LnhtbCIpCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvaGFuZGxlci5weSBiL0xpYi94bWwvc2F4L2hhbmRsZXIucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3NheC9oYW5kbGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9oYW5kbGVyLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvc2F4dXRpbHMucHkgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9zYXgvc2F4dXRpbHMucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L3NheHV0aWxzLnB5CmluZGV4IDg4MGRlODAuLmE0OTY1MTkgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL3NheC9zYXh1dGlscy5weQorKysgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQpAQCAtNCw4ICs0LDggQEAKICIiIgogCiBpbXBvcnQgb3MsIHVybHBhcnNlLCB1cmxsaWIsIHR5cGVzCi1mcm9tIC4gaW1wb3J0IGhhbmRsZXIKLWZyb20gLiBpbXBvcnQgeG1scmVhZGVyCitpbXBvcnQgaGFuZGxlcgoraW1wb3J0IHhtbHJlYWRlcgogCiB0cnk6CiAgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlXQpAQCAtNjgsNiArNjgsOCBAQAogICAgIHRoZSBvcHRpb25hbCBlbnRpdGllcyBwYXJhbWV0ZXIuICBUaGUga2V5cyBhbmQgdmFsdWVzIG11c3QgYWxsIGJlCiAgICAgc3RyaW5nczsgZWFjaCBrZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICIiIgorICAgIGVudGl0aWVzID0gZW50aXRpZXMuY29weSgpCisgICAgZW50aXRpZXMudXBkYXRlKHsnXG4nOiAnJiMxMDsnLCAnXHInOiAnJiMxMzsnLCAnXHQnOicmIzk7J30pCiAgICAgZGF0YSA9IGVzY2FwZShkYXRhLCBlbnRpdGllcykKICAgICBpZiAnIicgaW4gZGF0YToKICAgICAgICAgaWYgIiciIGluIGRhdGE6CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgveG1scmVhZGVyLnB5IGIvTGliL3htbC9zYXgveG1scmVhZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3NheC94bWxyZWFkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L3htbHJlYWRlci5weQppbmRleCAxY2FkZTY1Li45YTIzNjFlIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgveG1scmVhZGVyLnB5CisrKyBiL0xpYi94bWwvc2F4L3htbHJlYWRlci5weQpAQCAtMSw5ICsxLDkgQEAKICIiIkFuIFhNTCBSZWFkZXIgaXMgdGhlIFNBWCAyIG5hbWUgZm9yIGFuIFhNTCBwYXJzZXIuIFhNTCBQYXJzZXJzCiBzaG91bGQgYmUgYmFzZWQgb24gdGhpcyBjb2RlLiAiIiIKIAotZnJvbSAuIGltcG9ydCBoYW5kbGVyCitpbXBvcnQgaGFuZGxlcgogCi1mcm9tIC5fZXhjZXB0aW9ucyBpbXBvcnQgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uCitmcm9tIF9leGNlcHRpb25zIGltcG9ydCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KIAogCiAjID09PT09IFhNTFJFQURFUiA9PT09PQpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIFhNTFJlYWRlci5fX2luaXRfXyhzZWxmKQogCiAgICAgZGVmIHBhcnNlKHNlbGYsIHNvdXJjZSk6Ci0gICAgICAgIGZyb20gLiBpbXBvcnQgc2F4dXRpbHMKKyAgICAgICAgaW1wb3J0IHNheHV0aWxzCiAgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSkKIAogICAgICAgICBzZWxmLnByZXBhcmVQYXJzZXIoc291cmNlKQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvX19pbml0X18ucHkgYi9MaWIveG1sY29yZS9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2ZDhkZC4uMDAwMDAwMAotLS0gYS9MaWIveG1sY29yZS9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSIiIkNvcmUgWE1MIHN1cHBvcnQgZm9yIFB5dGhvbi4KLQotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGZvdXIgc3ViLXBhY2thZ2VzOgotCi1kb20gLS0gVGhlIFczQyBEb2N1bWVudCBPYmplY3QgTW9kZWwuICBUaGlzIHN1cHBvcnRzIERPTSBMZXZlbCAxICsKLSAgICAgICBOYW1lc3BhY2VzLgotCi1wYXJzZXJzIC0tIFB5dGhvbiB3cmFwcGVycyBmb3IgWE1MIHBhcnNlcnMgKGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEV4cGF0KS4KLQotc2F4IC0tIFRoZSBTaW1wbGUgQVBJIGZvciBYTUwsIGRldmVsb3BlZCBieSBYTUwtRGV2LCBsZWQgYnkgRGF2aWQKLSAgICAgICBNZWdnaW5zb24gYW5kIHBvcnRlZCB0byBQeXRob24gYnkgTGFycyBNYXJpdXMgR2Fyc2hvbC4gIFRoaXMKLSAgICAgICBzdXBwb3J0cyB0aGUgU0FYIDIgQVBJLgotCi1ldHJlZSAtLSBUaGUgRWxlbWVudFRyZWUgWE1MIGxpYnJhcnkuICBUaGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBmdWxsCi0gICAgICAgRWxlbWVudFRyZWUgWE1MIHJlbGVhc2UuCi0KLSIiIgotCi0KLV9fYWxsX18gPSBbImRvbSIsICJwYXJzZXJzIiwgInNheCIsICJldHJlZSJdCmRpZmYgLS1naXQgYS9MaWIvemlwZmlsZS5weSBiL0xpYi96aXBmaWxlLnB5CmluZGV4IDE2OGQyNDUuLjVjM2ZmZjMgMTAwNjQ0Ci0tLSBhL0xpYi96aXBmaWxlLnB5CisrKyBiL0xpYi96aXBmaWxlLnB5CkBAIC0xLDcgKzEsOCBAQAotIlJlYWQgYW5kIHdyaXRlIFpJUCBmaWxlcy4iCi0KKyIiIgorUmVhZCBhbmQgd3JpdGUgWklQIGZpbGVzLgorIiIiCiBpbXBvcnQgc3RydWN0LCBvcywgdGltZSwgc3lzCi1pbXBvcnQgYmluYXNjaWkKK2ltcG9ydCBiaW5hc2NpaSwgY1N0cmluZ0lPCiAKIHRyeToKICAgICBpbXBvcnQgemxpYiAjIFdlIG1heSBuZWVkIGl0cyBjb21wcmVzc2lvbiBtZXRob2QKQEAgLTksMTIgKzEwLDIyIEBACiAgICAgemxpYiA9IE5vbmUKIAogX19hbGxfXyA9IFsiQmFkWmlwZmlsZSIsICJlcnJvciIsICJaSVBfU1RPUkVEIiwgIlpJUF9ERUZMQVRFRCIsICJpc196aXBmaWxlIiwKLSAgICAgICAgICAgIlppcEluZm8iLCAiWmlwRmlsZSIsICJQeVppcEZpbGUiXQorICAgICAgICAgICAiWmlwSW5mbyIsICJaaXBGaWxlIiwgIlB5WmlwRmlsZSIsICJMYXJnZVppcEZpbGUiIF0KIAogY2xhc3MgQmFkWmlwZmlsZShFeGNlcHRpb24pOgogICAgIHBhc3MKKworCitjbGFzcyBMYXJnZVppcEZpbGUoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBSYWlzZWQgd2hlbiB3cml0aW5nIGEgemlwZmlsZSwgdGhlIHppcGZpbGUgcmVxdWlyZXMgWklQNjQgZXh0ZW5zaW9ucworICAgIGFuZCB0aG9zZSBleHRlbnNpb25zIGFyZSBkaXNhYmxlZC4KKyAgICAiIiIKKwogZXJyb3IgPSBCYWRaaXBmaWxlICAgICAgIyBUaGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGlzIG1vZHVsZQogCitaSVA2NF9MSU1JVD0gKDEgPDwgMzEpIC0gMQorCiAjIGNvbnN0YW50cyBmb3IgWmlwIGZpbGUgY29tcHJlc3Npb24gbWV0aG9kcwogWklQX1NUT1JFRCA9IDAKIFpJUF9ERUZMQVRFRCA9IDgKQEAgLTI3LDYgKzM4LDExIEBACiBzdHJpbmdDZW50cmFsRGlyID0gIlBLXDAwMVwwMDIiICAgIyBtYWdpYyBudW1iZXIgZm9yIGNlbnRyYWwgZGlyZWN0b3J5CiBzdHJ1Y3RGaWxlSGVhZGVyID0gIjw0czJCNEhsTEwySCIgICMgMTIgaXRlbXMsIGZpbGUgaGVhZGVyIHJlY29yZCwgMzAgYnl0ZXMKIHN0cmluZ0ZpbGVIZWFkZXIgPSAiUEtcMDAzXDAwNCIgICAjIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIKK3N0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IgPSAiPDRzbHFsIiAjIDQgaXRlbXMsIGxvY2F0ZSBaaXA2NCBoZWFkZXIsIDIwIGJ5dGVzCitzdHJpbmdFbmRBcmNoaXZlNjRMb2NhdG9yID0gIlBLXHgwNlx4MDciICMgbWFnaWMgdG9rZW4gZm9yIGxvY2F0b3IgaGVhZGVyCitzdHJ1Y3RFbmRBcmNoaXZlNjQgPSAiPDRzcWhobGxxcXFxIiAjIDEwIGl0ZW1zLCBlbmQgb2YgYXJjaGl2ZSAoWmlwNjQpLCA1NiBieXRlcworc3RyaW5nRW5kQXJjaGl2ZTY0ID0gIlBLXHgwNlx4MDYiICMgbWFnaWMgdG9rZW4gZm9yIFppcDY0IGhlYWRlcgorCiAKICMgaW5kZXhlcyBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKIF9DRF9TSUdOQVRVUkUgPSAwCkBAIC03NSw2ICs5MSw0MCBAQAogICAgICAgICBwYXNzCiAgICAgcmV0dXJuIEZhbHNlCiAKK2RlZiBfRW5kUmVjRGF0YTY0KGZwaW4sIG9mZnNldCwgZW5kcmVjKToKKyAgICAiIiIKKyAgICBSZWFkIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzIGFuZCB1c2UgdGhhdCB0byB1cGRhdGUgZW5kcmVjCisgICAgIiIiCisgICAgbG9jYXRvclNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvcikKKyAgICBmcGluLnNlZWsob2Zmc2V0IC0gbG9jYXRvclNpemUsIDIpCisgICAgZGF0YSA9IGZwaW4ucmVhZChsb2NhdG9yU2l6ZSkKKyAgICBzaWcsIGRpc2tubywgcmVsb2ZmLCBkaXNrcyA9IHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciwgZGF0YSkKKyAgICBpZiBzaWcgIT0gc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvcjoKKyAgICAgICAgcmV0dXJuIGVuZHJlYworCisgICAgaWYgZGlza25vICE9IDAgb3IgZGlza3MgIT0gMToKKyAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiemlwZmlsZXMgdGhhdCBzcGFuIG11bHRpcGxlIGRpc2tzIGFyZSBub3Qgc3VwcG9ydGVkIikKKworICAgICMgQXNzdW1lIG5vICd6aXA2NCBleHRlbnNpYmxlIGRhdGEnCisgICAgZW5kQXJjaGl2ZVNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0KQorICAgIGZwaW4uc2VlayhvZmZzZXQgLSBsb2NhdG9yU2l6ZSAtIGVuZEFyY2hpdmVTaXplLCAyKQorICAgIGRhdGEgPSBmcGluLnJlYWQoZW5kQXJjaGl2ZVNpemUpCisgICAgc2lnLCBzeiwgY3JlYXRlX3ZlcnNpb24sIHJlYWRfdmVyc2lvbiwgZGlza19udW0sIGRpc2tfZGlyLCBcCisgICAgICAgICAgICBkaXJjb3VudCwgZGlyY291bnQyLCBkaXJzaXplLCBkaXJvZmZzZXQgPSBcCisgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmU2NCwgZGF0YSkKKyAgICBpZiBzaWcgIT0gc3RyaW5nRW5kQXJjaGl2ZTY0OgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICAjIFVwZGF0ZSB0aGUgb3JpZ2luYWwgZW5kcmVjIHVzaW5nIGRhdGEgZnJvbSB0aGUgWklQNjQgcmVjb3JkCisgICAgZW5kcmVjWzFdID0gZGlza19udW0KKyAgICBlbmRyZWNbMl0gPSBkaXNrX2RpcgorICAgIGVuZHJlY1szXSA9IGRpcmNvdW50CisgICAgZW5kcmVjWzRdID0gZGlyY291bnQyCisgICAgZW5kcmVjWzVdID0gZGlyc2l6ZQorICAgIGVuZHJlY1s2XSA9IGRpcm9mZnNldAorICAgIHJldHVybiBlbmRyZWMKKworCiBkZWYgX0VuZFJlY0RhdGEoZnBpbik6CiAgICAgIiIiUmV0dXJuIGRhdGEgZnJvbSB0aGUgIkVuZCBvZiBDZW50cmFsIERpcmVjdG9yeSIgcmVjb3JkLCBvciBOb25lLgogCkBAIC04OCw2ICsxMzgsOCBAQAogICAgICAgICBlbmRyZWMgPSBsaXN0KGVuZHJlYykKICAgICAgICAgZW5kcmVjLmFwcGVuZCgiIikgICAgICAgICAgICAgICAjIEFwcGVuZCB0aGUgYXJjaGl2ZSBjb21tZW50CiAgICAgICAgIGVuZHJlYy5hcHBlbmQoZmlsZXNpemUgLSAyMikgICAgIyBBcHBlbmQgdGhlIHJlY29yZCBzdGFydCBvZmZzZXQKKyAgICAgICAgaWYgZW5kcmVjWy00XSA9PSAtMSBvciBlbmRyZWNbLTRdID09IDB4ZmZmZmZmZmY6CisgICAgICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCAtMjIsIGVuZHJlYykKICAgICAgICAgcmV0dXJuIGVuZHJlYwogICAgICMgU2VhcmNoIHRoZSBsYXN0IEVORF9CTE9DSyBieXRlcyBvZiB0aGUgZmlsZSBmb3IgdGhlIHJlY29yZCBzaWduYXR1cmUuCiAgICAgIyBUaGUgY29tbWVudCBpcyBhcHBlbmRlZCB0byB0aGUgWklQIGZpbGUgYW5kIGhhcyBhIDE2IGJpdCBsZW5ndGguCkBAIC0xMDYsMjUgKzE1OCw1MCBAQAogICAgICAgICAgICAgIyBBcHBlbmQgdGhlIGFyY2hpdmUgY29tbWVudCBhbmQgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAgICBlbmRyZWMuYXBwZW5kKGNvbW1lbnQpCiAgICAgICAgICAgICBlbmRyZWMuYXBwZW5kKGZpbGVzaXplIC0gRU5EX0JMT0NLICsgc3RhcnQpCisgICAgICAgICAgICBpZiBlbmRyZWNbLTRdID09IC0xIG9yIGVuZHJlY1stNF0gPT0gMHhmZmZmZmZmZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCAtIEVORF9CTE9DSyArIHN0YXJ0LCBlbmRyZWMpCiAgICAgICAgICAgICByZXR1cm4gZW5kcmVjCiAgICAgcmV0dXJuICAgICAgIyBFcnJvciwgcmV0dXJuIE5vbmUKIAogCi1jbGFzcyBaaXBJbmZvOgorY2xhc3MgWmlwSW5mbyAob2JqZWN0KToKICAgICAiIiJDbGFzcyB3aXRoIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyBlYWNoIGZpbGUgaW4gdGhlIFpJUCBhcmNoaXZlLiIiIgogCisgICAgX19zbG90c19fID0gKAorICAgICAgICAgICAgJ29yaWdfZmlsZW5hbWUnLAorICAgICAgICAgICAgJ2ZpbGVuYW1lJywKKyAgICAgICAgICAgICdkYXRlX3RpbWUnLAorICAgICAgICAgICAgJ2NvbXByZXNzX3R5cGUnLAorICAgICAgICAgICAgJ2NvbW1lbnQnLAorICAgICAgICAgICAgJ2V4dHJhJywKKyAgICAgICAgICAgICdjcmVhdGVfc3lzdGVtJywKKyAgICAgICAgICAgICdjcmVhdGVfdmVyc2lvbicsCisgICAgICAgICAgICAnZXh0cmFjdF92ZXJzaW9uJywKKyAgICAgICAgICAgICdyZXNlcnZlZCcsCisgICAgICAgICAgICAnZmxhZ19iaXRzJywKKyAgICAgICAgICAgICd2b2x1bWUnLAorICAgICAgICAgICAgJ2ludGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2V4dGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2hlYWRlcl9vZmZzZXQnLAorICAgICAgICAgICAgJ0NSQycsCisgICAgICAgICAgICAnY29tcHJlc3Nfc2l6ZScsCisgICAgICAgICAgICAnZmlsZV9zaXplJywKKyAgICAgICAgKQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPSJOb05hbWUiLCBkYXRlX3RpbWU9KDE5ODAsMSwxLDAsMCwwKSk6CiAgICAgICAgIHNlbGYub3JpZ19maWxlbmFtZSA9IGZpbGVuYW1lICAgIyBPcmlnaW5hbCBmaWxlIG5hbWUgaW4gYXJjaGl2ZQotIyBUZXJtaW5hdGUgdGhlIGZpbGUgbmFtZSBhdCB0aGUgZmlyc3QgbnVsbCBieXRlLiAgTnVsbCBieXRlcyBpbiBmaWxlCi0jIG5hbWVzIGFyZSB1c2VkIGFzIHRyaWNrcyBieSB2aXJ1c2VzIGluIGFyY2hpdmVzLgorCisgICAgICAgICMgVGVybWluYXRlIHRoZSBmaWxlIG5hbWUgYXQgdGhlIGZpcnN0IG51bGwgYnl0ZS4gIE51bGwgYnl0ZXMgaW4gZmlsZQorICAgICAgICAjIG5hbWVzIGFyZSB1c2VkIGFzIHRyaWNrcyBieSB2aXJ1c2VzIGluIGFyY2hpdmVzLgogICAgICAgICBudWxsX2J5dGUgPSBmaWxlbmFtZS5maW5kKGNocigwKSkKICAgICAgICAgaWYgbnVsbF9ieXRlID49IDA6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzA6bnVsbF9ieXRlXQotIyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHBhdGhzIGluIGdlbmVyYXRlZCBaSVAgZmlsZXMgYWx3YXlzIHVzZQotIyBmb3J3YXJkIHNsYXNoZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFzIHJlcXVpcmVkIGJ5IHRoZQotIyBaSVAgZm9ybWF0IHNwZWNpZmljYXRpb24uCi0gICAgICAgIGlmIG9zLnNlcCAhPSAiLyI6CisgICAgICAgICMgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSBwYXRocyBpbiBnZW5lcmF0ZWQgWklQIGZpbGVzIGFsd2F5cyB1c2UKKyAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAjIFpJUCBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgaWYgb3Muc2VwICE9ICIvIiBhbmQgb3Muc2VwIGluIGZpbGVuYW1lOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQorCiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZSAgICAgICAgIyBOb3JtYWxpemVkIGZpbGUgbmFtZQogICAgICAgICBzZWxmLmRhdGVfdGltZSA9IGRhdGVfdGltZSAgICAgICMgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMKICAgICAgICAgIyBTdGFuZGFyZCB2YWx1ZXM6CkBAIC0xNDUsNyArMjIyLDYgQEAKICAgICAgICAgc2VsZi5leHRlcm5hbF9hdHRyID0gMCAgICAgICAgICAjIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwogICAgICAgICAjIE90aGVyIGF0dHJpYnV0ZXMgYXJlIHNldCBieSBjbGFzcyBaaXBGaWxlOgogICAgICAgICAjIGhlYWRlcl9vZmZzZXQgICAgICAgICBCeXRlIG9mZnNldCB0byB0aGUgZmlsZSBoZWFkZXIKLSAgICAgICAgIyBmaWxlX29mZnNldCAgICAgICAgICAgQnl0ZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGRhdGEKICAgICAgICAgIyBDUkMgICAgICAgICAgICAgICAgICAgQ1JDLTMyIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZQogICAgICAgICAjIGNvbXByZXNzX3NpemUgICAgICAgICBTaXplIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUKICAgICAgICAgIyBmaWxlX3NpemUgICAgICAgICAgICAgU2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUKQEAgLTE2MiwyOSArMjM4LDg1IEBACiAgICAgICAgICAgICBDUkMgPSBzZWxmLkNSQwogICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IHNlbGYuY29tcHJlc3Nfc2l6ZQogICAgICAgICAgICAgZmlsZV9zaXplID0gc2VsZi5maWxlX3NpemUKKworICAgICAgICBleHRyYSA9IHNlbGYuZXh0cmEKKworICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAjIEZpbGUgaXMgbGFyZ2VyIHRoYW4gd2hhdCBmaXRzIGludG8gYSA0IGJ5dGUgaW50ZWdlciwKKyAgICAgICAgICAgICMgZmFsbCBiYWNrIHRvIHRoZSBaSVA2NCBleHRlbnNpb24KKyAgICAgICAgICAgIGZtdCA9ICc8aGhxcScKKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmEgKyBzdHJ1Y3QucGFjayhmbXQsCisgICAgICAgICAgICAgICAgICAgIDEsIHN0cnVjdC5jYWxjc2l6ZShmbXQpLTQsIGZpbGVfc2l6ZSwgY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IDB4ZmZmZmZmZmYgIyAtMQorICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYgIyAtMQorICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHNlbGYuZXh0cmFjdF92ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVfdmVyc2lvbiA9IG1heCg0NSwgc2VsZi5leHRyYWN0X3ZlcnNpb24pCisKICAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soc3RydWN0RmlsZUhlYWRlciwgc3RyaW5nRmlsZUhlYWRlciwKICAgICAgICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24sIHNlbGYucmVzZXJ2ZWQsIHNlbGYuZmxhZ19iaXRzLAogICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsIENSQywKICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICBsZW4oc2VsZi5maWxlbmFtZSksIGxlbihzZWxmLmV4dHJhKSkKLSAgICAgICAgcmV0dXJuIGhlYWRlciArIHNlbGYuZmlsZW5hbWUgKyBzZWxmLmV4dHJhCisgICAgICAgICAgICAgICAgIGxlbihzZWxmLmZpbGVuYW1lKSwgbGVuKGV4dHJhKSkKKyAgICAgICAgcmV0dXJuIGhlYWRlciArIHNlbGYuZmlsZW5hbWUgKyBleHRyYQorCisgICAgZGVmIF9kZWNvZGVFeHRyYShzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gZGVjb2RlIHRoZSBleHRyYSBmaWVsZC4KKyAgICAgICAgZXh0cmEgPSBzZWxmLmV4dHJhCisgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2sKKyAgICAgICAgd2hpbGUgZXh0cmE6CisgICAgICAgICAgICB0cCwgbG4gPSB1bnBhY2soJzxoaCcsIGV4dHJhWzo0XSkKKyAgICAgICAgICAgIGlmIHRwID09IDE6CisgICAgICAgICAgICAgICAgaWYgbG4gPj0gMjQ6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPHFxcScsIGV4dHJhWzQ6MjhdKQorICAgICAgICAgICAgICAgIGVsaWYgbG4gPT0gMTY6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPHFxJywgZXh0cmFbNDoyMF0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSA4OgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSB1bnBhY2soJzxxJywgZXh0cmFbNDoxMl0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSAoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNvcnJ1cHQgZXh0cmEgZmllbGQgJXMiJShsbiwpCisKKyAgICAgICAgICAgICAgICBpZHggPSAwCisKKyAgICAgICAgICAgICAgICAjIFpJUDY0IGV4dGVuc2lvbiAobGFyZ2UgZmlsZXMgYW5kL29yIGxhcmdlIGFyY2hpdmVzKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZV9zaXplID09IC0xIG9yIHNlbGYuZmlsZV9zaXplID09IDB4RkZGRkZGRkZMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfc2l6ZSA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCArPSAxCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbXByZXNzX3NpemUgPT0gLTEgb3Igc2VsZi5jb21wcmVzc19zaXplID09IDB4RkZGRkZGRkZMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3NpemUgPSBjb3VudHNbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZHggKz0gMQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJfb2Zmc2V0ID09IC0xIG9yIHNlbGYuaGVhZGVyX29mZnNldCA9PSAweGZmZmZmZmZmTDoKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gc2VsZi5oZWFkZXJfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyX29mZnNldCA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCs9MQorCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhW2xuKzQ6XQogCiAKIGNsYXNzIFppcEZpbGU6CiAgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgogCi0gICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQpCisgICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQsIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICAgIGZpbGU6IEVpdGhlciB0aGUgcGF0aCB0byB0aGUgZmlsZSwgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgIElmIGl0IGlzIGEgcGF0aCwgdGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQgYW5kIGNsb3NlZCBieSBaaXBGaWxlLgogICAgIG1vZGU6IFRoZSBtb2RlIGNhbiBiZSBlaXRoZXIgcmVhZCAiciIsIHdyaXRlICJ3IiBvciBhcHBlbmQgImEiLgogICAgIGNvbXByZXNzaW9uOiBaSVBfU1RPUkVEIChubyBjb21wcmVzc2lvbikgb3IgWklQX0RFRkxBVEVEIChyZXF1aXJlcyB6bGliKS4KKyAgICBhbGxvd1ppcDY0OiBpZiBUcnVlIFppcEZpbGUgd2lsbCBjcmVhdGUgZmlsZXMgd2l0aCBaSVA2NCBleHRlbnNpb25zIHdoZW4KKyAgICAgICAgICAgICAgICBuZWVkZWQsIG90aGVyd2lzZSBpdCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoaXMgd291bGQKKyAgICAgICAgICAgICAgICBiZSBuZWNlc3NhcnkuCisKICAgICAiIiIKIAogICAgIGZwID0gTm9uZSAgICAgICAgICAgICAgICAgICAjIFNldCBoZXJlIHNpbmNlIF9fZGVsX18gY2hlY2tzIGl0CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCwgYWxsb3daaXA2ND1GYWxzZSk6CiAgICAgICAgICIiIk9wZW4gdGhlIFpJUCBmaWxlIHdpdGggbW9kZSByZWFkICJyIiwgd3JpdGUgInciIG9yIGFwcGVuZCAiYSIuIiIiCisgICAgICAgIHNlbGYuX2FsbG93WmlwNjQgPSBhbGxvd1ppcDY0CisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IEZhbHNlCiAgICAgICAgIGlmIGNvbXByZXNzaW9uID09IFpJUF9TVE9SRUQ6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsaWYgY29tcHJlc3Npb24gPT0gWklQX0RFRkxBVEVEOgpAQCAtMjUwLDcgKzM4MiwxMCBAQAogICAgICAgICBvZmZzZXRfY2QgPSBlbmRyZWNbNl0gICAjIG9mZnNldCBvZiBjZW50cmFsIGRpcmVjdG9yeQogICAgICAgICBzZWxmLmNvbW1lbnQgPSBlbmRyZWNbOF0gICAgICAgICMgYXJjaGl2ZSBjb21tZW50CiAgICAgICAgICMgZW5kcmVjWzldIGlzIHRoZSBvZmZzZXQgb2YgdGhlICJFbmQgb2YgQ2VudHJhbCBEaXIiIHJlY29yZAotICAgICAgICB4ID0gZW5kcmVjWzldIC0gc2l6ZV9jZAorICAgICAgICBpZiBlbmRyZWNbOV0gPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgIHggPSBlbmRyZWNbOV0gLSBzaXplX2NkIC0gNTYgLSAyMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IGVuZHJlY1s5XSAtIHNpemVfY2QKICAgICAgICAgIyAiY29uY2F0IiBpcyB6ZXJvLCB1bmxlc3MgemlwIHdhcyBjb25jYXRlbmF0ZWQgdG8gYW5vdGhlciBmaWxlCiAgICAgICAgIGNvbmNhdCA9IHggLSBvZmZzZXRfY2QKICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+IDI6CkBAIC0yNTgsNiArMzkzLDggQEAKICAgICAgICAgIyBzZWxmLnN0YXJ0X2RpcjogIFBvc2l0aW9uIG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CiAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gb2Zmc2V0X2NkICsgY29uY2F0CiAgICAgICAgIGZwLnNlZWsoc2VsZi5zdGFydF9kaXIsIDApCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKHNpemVfY2QpCisgICAgICAgIGZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCiAgICAgICAgIHRvdGFsID0gMAogICAgICAgICB3aGlsZSB0b3RhbCA8IHNpemVfY2Q6CiAgICAgICAgICAgICBjZW50ZGlyID0gZnAucmVhZCg0NikKQEAgLTI3NSw4ICs0MTIsNyBAQAogICAgICAgICAgICAgdG90YWwgPSAodG90YWwgKyBjZW50ZGlyW19DRF9GSUxFTkFNRV9MRU5HVEhdCiAgICAgICAgICAgICAgICAgICAgICArIGNlbnRkaXJbX0NEX0VYVFJBX0ZJRUxEX0xFTkdUSF0KICAgICAgICAgICAgICAgICAgICAgICsgY2VudGRpcltfQ0RfQ09NTUVOVF9MRU5HVEhdKQotICAgICAgICAgICAgeC5oZWFkZXJfb2Zmc2V0ID0gY2VudGRpcltfQ0RfTE9DQUxfSEVBREVSX09GRlNFVF0gKyBjb25jYXQKLSAgICAgICAgICAgICMgZmlsZV9vZmZzZXQgbXVzdCBiZSBjb21wdXRlZCBiZWxvdy4uLgorICAgICAgICAgICAgeC5oZWFkZXJfb2Zmc2V0ID0gY2VudGRpcltfQ0RfTE9DQUxfSEVBREVSX09GRlNFVF0KICAgICAgICAgICAgICh4LmNyZWF0ZV92ZXJzaW9uLCB4LmNyZWF0ZV9zeXN0ZW0sIHguZXh0cmFjdF92ZXJzaW9uLCB4LnJlc2VydmVkLAogICAgICAgICAgICAgICAgIHguZmxhZ19iaXRzLCB4LmNvbXByZXNzX3R5cGUsIHQsIGQsCiAgICAgICAgICAgICAgICAgeC5DUkMsIHguY29tcHJlc3Nfc2l6ZSwgeC5maWxlX3NpemUpID0gY2VudGRpclsxOjEyXQpAQCAtMjg0LDI4ICs0MjAsMTQgQEAKICAgICAgICAgICAgICMgQ29udmVydCBkYXRlL3RpbWUgY29kZSB0byAoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpCiAgICAgICAgICAgICB4LmRhdGVfdGltZSA9ICggKGQ+PjkpKzE5ODAsIChkPj41KSYweEYsIGQmMHgxRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Pj4xMSwgKHQ+PjUpJjB4M0YsICh0JjB4MUYpICogMiApCisKKyAgICAgICAgICAgIHguX2RlY29kZUV4dHJhKCkKKyAgICAgICAgICAgIHguaGVhZGVyX29mZnNldCA9IHguaGVhZGVyX29mZnNldCArIGNvbmNhdAogICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoeCkKICAgICAgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t4LmZpbGVuYW1lXSA9IHgKICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPiAyOgogICAgICAgICAgICAgICAgIHByaW50ICJ0b3RhbCIsIHRvdGFsCi0gICAgICAgIGZvciBkYXRhIGluIHNlbGYuZmlsZWxpc3Q6Ci0gICAgICAgICAgICBmcC5zZWVrKGRhdGEuaGVhZGVyX29mZnNldCwgMCkKLSAgICAgICAgICAgIGZoZWFkZXIgPSBmcC5yZWFkKDMwKQotICAgICAgICAgICAgaWYgZmhlYWRlclswOjRdICE9IHN0cmluZ0ZpbGVIZWFkZXI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgIkJhZCBtYWdpYyBudW1iZXIgZm9yIGZpbGUgaGVhZGVyIgotICAgICAgICAgICAgZmhlYWRlciA9IHN0cnVjdC51bnBhY2soc3RydWN0RmlsZUhlYWRlciwgZmhlYWRlcikKLSAgICAgICAgICAgICMgZmlsZV9vZmZzZXQgaXMgY29tcHV0ZWQgaGVyZSwgc2luY2UgdGhlIGV4dHJhIGZpZWxkIGZvcgotICAgICAgICAgICAgIyB0aGUgY2VudHJhbCBkaXJlY3RvcnkgYW5kIGZvciB0aGUgbG9jYWwgZmlsZSBoZWFkZXIKLSAgICAgICAgICAgICMgcmVmZXIgdG8gZGlmZmVyZW50IGZpZWxkcywgYW5kIHRoZXkgY2FuIGhhdmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAjIGxlbmd0aHMKLSAgICAgICAgICAgIGRhdGEuZmlsZV9vZmZzZXQgPSAoZGF0YS5oZWFkZXJfb2Zmc2V0ICsgMzAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaGVhZGVyW19GSF9GSUxFTkFNRV9MRU5HVEhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKLSAgICAgICAgICAgIGZuYW1lID0gZnAucmVhZChmaGVhZGVyW19GSF9GSUxFTkFNRV9MRU5HVEhdKQotICAgICAgICAgICAgaWYgZm5hbWUgIT0gZGF0YS5vcmlnX2ZpbGVuYW1lOgotICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAotICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm9yaWdfZmlsZW5hbWUsIGZuYW1lKQorCiAKICAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4iIiIKQEAgLTMzNCw2ICs0NTYsNyBAQAogICAgICAgICAgICAgZXhjZXB0IEJhZFppcGZpbGU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHppbmZvLmZpbGVuYW1lCiAKKwogICAgIGRlZiBnZXRpbmZvKHNlbGYsIG5hbWUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGluc3RhbmNlIG9mIFppcEluZm8gZ2l2ZW4gJ25hbWUnLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5OYW1lVG9JbmZvW25hbWVdCkBAIC0zNDcsNyArNDcwLDI0IEBACiAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byByZWFkIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIgogICAgICAgICB6aW5mbyA9IHNlbGYuZ2V0aW5mbyhuYW1lKQogICAgICAgICBmaWxlcG9zID0gc2VsZi5mcC50ZWxsKCkKLSAgICAgICAgc2VsZi5mcC5zZWVrKHppbmZvLmZpbGVfb2Zmc2V0LCAwKQorCisgICAgICAgIHNlbGYuZnAuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQorCisgICAgICAgICMgU2tpcCB0aGUgZmlsZSBoZWFkZXI6CisgICAgICAgIGZoZWFkZXIgPSBzZWxmLmZwLnJlYWQoMzApCisgICAgICAgIGlmIGZoZWFkZXJbMDo0XSAhPSBzdHJpbmdGaWxlSGVhZGVyOgorICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgIkJhZCBtYWdpYyBudW1iZXIgZm9yIGZpbGUgaGVhZGVyIgorCisgICAgICAgIGZoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEZpbGVIZWFkZXIsIGZoZWFkZXIpCisgICAgICAgIGZuYW1lID0gc2VsZi5mcC5yZWFkKGZoZWFkZXJbX0ZIX0ZJTEVOQU1FX0xFTkdUSF0pCisgICAgICAgIGlmIGZoZWFkZXJbX0ZIX0VYVFJBX0ZJRUxEX0xFTkdUSF06CisgICAgICAgICAgICBzZWxmLmZwLnJlYWQoZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKKworICAgICAgICBpZiBmbmFtZSAhPSB6aW5mby5vcmlnX2ZpbGVuYW1lOgorICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5vcmlnX2ZpbGVuYW1lLCBmbmFtZSkKKwogICAgICAgICBieXRlcyA9IHNlbGYuZnAucmVhZCh6aW5mby5jb21wcmVzc19zaXplKQogICAgICAgICBzZWxmLmZwLnNlZWsoZmlsZXBvcywgMCkKICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfU1RPUkVEOgpAQCAtMzg4LDYgKzUyOCwxMiBAQAogICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlIG5vdCBpbiAoWklQX1NUT1JFRCwgWklQX0RFRkxBVEVEKToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAogICAgICAgICAgICAgICAgICAgIlRoYXQgY29tcHJlc3Npb24gbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQiCisgICAgICAgIGlmIHppbmZvLmZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQorICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIlppcGZpbGUgc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUsIGNvbXByZXNzX3R5cGU9Tm9uZSk6CiAgICAgICAgICIiIlB1dCB0aGUgYnl0ZXMgZnJvbSBmaWxlbmFtZSBpbnRvIHRoZSBhcmNoaXZlIHVuZGVyIHRoZSBuYW1lCkBAIC00MDcsMTYgKzU1MywxOSBAQAogICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCi0gICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgInJiIikKKworICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCiAgICAgICAgIHppbmZvLmZsYWdfYml0cyA9IDB4MDAKICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJyYiIpCiAgICAgICAgICMgTXVzdCBvdmVyd3JpdGUgQ1JDIGFuZCBzaXplcyB3aXRoIGNvcnJlY3QgZGF0YSBsYXRlcgogICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCiAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplID0gMAogICAgICAgICB6aW5mby5maWxlX3NpemUgPSBmaWxlX3NpemUgPSAwCiAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcigpKQotICAgICAgICB6aW5mby5maWxlX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICAgIyBTdGFydCBvZiBmaWxlIGJ5dGVzCiAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgogICAgICAgICAgICAgY21wciA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0RFRkFVTFRfQ09NUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgIHpsaWIuREVGTEFURUQsIC0xNSkKQEAgLTQ2MSw4ICs2MTAsMTAgQEAKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB6aW5mbyA9IHppbmZvX29yX2FyY25hbWUKLSAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKICAgICAgICAgemluZm8uZmlsZV9zaXplID0gbGVuKGJ5dGVzKSAgICAgICAgICAgICMgVW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKICAgICAgICAgemluZm8uQ1JDID0gYmluYXNjaWkuY3JjMzIoYnl0ZXMpICAgICAgICMgQ1JDLTMyIGNoZWNrc3VtCiAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgogICAgICAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9ERUZBVUxUX0NPTVBSRVNTSU9OLApAQCAtNDczLDggKzYyNCw4IEBACiAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gemluZm8uZmlsZV9zaXplCiAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBieXRlcwogICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoKSkKLSAgICAgICAgemluZm8uZmlsZV9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAgICMgU3RhcnQgb2YgZmlsZSBieXRlcwogICAgICAgICBzZWxmLmZwLndyaXRlKGJ5dGVzKQorICAgICAgICBzZWxmLmZwLmZsdXNoKCkKICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHgwODoKICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoc3RydWN0LnBhY2soIjxsTEwiLCB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsCkBAIC00OTEsNyArNjQyLDggQEAKICAgICAgICAgcmVjb3Jkcy4iIiIKICAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYubW9kZSBpbiAoInciLCAiYSIpOiAgICAgICAgICAgICAjIHdyaXRlIGVuZGluZyByZWNvcmRzCisKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICgidyIsICJhIikgYW5kIHNlbGYuX2RpZE1vZGlmeTogIyB3cml0ZSBlbmRpbmcgcmVjb3JkcwogICAgICAgICAgICAgY291bnQgPSAwCiAgICAgICAgICAgICBwb3MxID0gc2VsZi5mcC50ZWxsKCkKICAgICAgICAgICAgIGZvciB6aW5mbyBpbiBzZWxmLmZpbGVsaXN0OiAgICAgICAgICMgd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkKQEAgLTQ5OSwyMyArNjUxLDczIEBACiAgICAgICAgICAgICAgICAgZHQgPSB6aW5mby5kYXRlX3RpbWUKICAgICAgICAgICAgICAgICBkb3NkYXRlID0gKGR0WzBdIC0gMTk4MCkgPDwgOSB8IGR0WzFdIDw8IDUgfCBkdFsyXQogICAgICAgICAgICAgICAgIGRvc3RpbWUgPSBkdFszXSA8PCAxMSB8IGR0WzRdIDw8IDUgfCAoZHRbNV0gLy8gMikKKyAgICAgICAgICAgICAgICBleHRyYSA9IFtdCisgICAgICAgICAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3IgemluZm8uY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uZmlsZV9zaXplKQorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZiAjLTEKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYgIy0xCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gemluZm8uZmlsZV9zaXplCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSB6aW5mby5jb21wcmVzc19zaXplCisKKyAgICAgICAgICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5oZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0ID0gLTEgICMgc3RydWN0ICJsIiBmb3JtYXQ6ICAzMiBvbmUgYml0cworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQgPSB6aW5mby5oZWFkZXJfb2Zmc2V0CisKKyAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gemluZm8uZXh0cmEKKyAgICAgICAgICAgICAgICBpZiBleHRyYToKKyAgICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgYSBaSVA2NCBmaWVsZCB0byB0aGUgZXh0cmEncworICAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxoaCcgKyAncScqbGVuKGV4dHJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA4KmxlbihleHRyYSksICpleHRyYSkgKyBleHRyYV9kYXRhCisKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5leHRyYWN0X3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5jcmVhdGVfdmVyc2lvbikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSB6aW5mby5leHRyYWN0X3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3ZlcnNpb24gPSB6aW5mby5jcmVhdGVfdmVyc2lvbgorCiAgICAgICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC5wYWNrKHN0cnVjdENlbnRyYWxEaXIsCi0gICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCB6aW5mby5jcmVhdGVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIHppbmZvLmV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCiAgICAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCi0gICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsIHppbmZvLmZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGxlbih6aW5mby5maWxlbmFtZSksIGxlbih6aW5mby5leHRyYSksIGxlbih6aW5mby5jb21tZW50KSwKKyAgICAgICAgICAgICAgICAgIHppbmZvLkNSQywgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgbGVuKHppbmZvLmZpbGVuYW1lKSwgbGVuKGV4dHJhX2RhdGEpLCBsZW4oemluZm8uY29tbWVudCksCiAgICAgICAgICAgICAgICAgICAwLCB6aW5mby5pbnRlcm5hbF9hdHRyLCB6aW5mby5leHRlcm5hbF9hdHRyLAotICAgICAgICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShjZW50ZGlyKQogICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5leHRyYSkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGV4dHJhX2RhdGEpCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5jb21tZW50KQorCiAgICAgICAgICAgICBwb3MyID0gc2VsZi5mcC50ZWxsKCkKICAgICAgICAgICAgICMgV3JpdGUgZW5kLW9mLXppcC1hcmNoaXZlIHJlY29yZAotICAgICAgICAgICAgZW5kcmVjID0gc3RydWN0LnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgc3RyaW5nRW5kQXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGNvdW50LCBjb3VudCwgcG9zMiAtIHBvczEsIHBvczEsIDApCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKGVuZHJlYykKKyAgICAgICAgICAgIGlmIHBvczEgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAjIE5lZWQgdG8gd3JpdGUgdGhlIFpJUDY0IGVuZC1vZi1hcmNoaXZlIHJlY29yZHMKKyAgICAgICAgICAgICAgICB6aXA2NGVuZHJlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0LCBzdHJpbmdFbmRBcmNoaXZlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICA0NCwgNDUsIDQ1LCAwLCAwLCBjb3VudCwgY291bnQsIHBvczIgLSBwb3MxLCBwb3MxKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemlwNjRlbmRyZWMpCisKKyAgICAgICAgICAgICAgICB6aXA2NGxvY3JlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3IsIDAsIHBvczIsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGxvY3JlYykKKworICAgICAgICAgICAgICAgICMgWFhYIFdoeSBpcyBgcG9zM2AgY29tcHV0ZWQgbmV4dD8gIEl0J3MgbmV2ZXIgcmVmZXJlbmNlZC4KKyAgICAgICAgICAgICAgICBwb3MzID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgICAgICBlbmRyZWMgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCBzdHJpbmdFbmRBcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGNvdW50LCBjb3VudCwgcG9zMiAtIHBvczEsIC0xLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZW5kcmVjKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgY291bnQsIGNvdW50LCBwb3MyIC0gcG9zMSwgcG9zMSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGVuZHJlYykKICAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQogICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZVBhc3NlZDoKICAgICAgICAgICAgIHNlbGYuZnAuY2xvc2UoKQpAQCAtNjE5LDMgKzgyMSw4MCBAQAogICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgIGFyY2hpdmVuYW1lID0gIiVzLyVzIiAlIChiYXNlbmFtZSwgYXJjaGl2ZW5hbWUpCiAgICAgICAgIHJldHVybiAoZm5hbWUsIGFyY2hpdmVuYW1lKQorCisKK2RlZiBtYWluKGFyZ3MgPSBOb25lKToKKyAgICBpbXBvcnQgdGV4dHdyYXAKKyAgICBVU0FHRT10ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgIHppcGZpbGUucHkgLWwgemlwZmlsZS56aXAgICAgICAgICMgU2hvdyBsaXN0aW5nIG9mIGEgemlwZmlsZQorICAgICAgICAgICAgemlwZmlsZS5weSAtdCB6aXBmaWxlLnppcCAgICAgICAgIyBUZXN0IGlmIGEgemlwZmlsZSBpcyB2YWxpZAorICAgICAgICAgICAgemlwZmlsZS5weSAtZSB6aXBmaWxlLnppcCB0YXJnZXQgIyBFeHRyYWN0IHppcGZpbGUgaW50byB0YXJnZXQgZGlyCisgICAgICAgICAgICB6aXBmaWxlLnB5IC1jIHppcGZpbGUuemlwIHNyYyAuLi4gIyBDcmVhdGUgemlwZmlsZSBmcm9tIHNvdXJjZXMKKyAgICAgICAgIiIiKQorICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgaWYgbm90IGFyZ3Mgb3IgYXJnc1swXSBub3QgaW4gKCctbCcsICctYycsICctZScsICctdCcpOgorICAgICAgICBwcmludCBVU0FHRQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaWYgYXJnc1swXSA9PSAnLWwnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICB6ZiA9IFppcEZpbGUoYXJnc1sxXSwgJ3InKQorICAgICAgICB6Zi5wcmludGRpcigpCisgICAgICAgIHpmLmNsb3NlKCkKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLXQnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICB6ZiA9IFppcEZpbGUoYXJnc1sxXSwgJ3InKQorICAgICAgICB6Zi50ZXN0emlwKCkKKyAgICAgICAgcHJpbnQgIkRvbmUgdGVzdGluZyIKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLWUnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAncicpCisgICAgICAgIG91dCA9IGFyZ3NbMl0KKyAgICAgICAgZm9yIHBhdGggaW4gemYubmFtZWxpc3QoKToKKyAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLi8nKToKKyAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoWzI6XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGd0ID0gb3MucGF0aC5qb2luKG91dCwgcGF0aCkKKworICAgICAgICAgICAgdGd0ZGlyID0gb3MucGF0aC5kaXJuYW1lKHRndCkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0Z3RkaXIpOgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHRndGRpcikKKyAgICAgICAgICAgIGZwID0gb3Blbih0Z3QsICd3YicpCisgICAgICAgICAgICBmcC53cml0ZSh6Zi5yZWFkKHBhdGgpKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICB6Zi5jbG9zZSgpCisKKyAgICBlbGlmIGFyZ3NbMF0gPT0gJy1jJzoKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIGRlZiBhZGRUb1ppcCh6ZiwgcGF0aCwgemlwcGF0aCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICB6Zi53cml0ZShwYXRoLCB6aXBwYXRoLCBaSVBfREVGTEFURUQpCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIG5tIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGFkZFRvWmlwKHpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwYXRoLCBubSksIG9zLnBhdGguam9pbih6aXBwYXRoLCBubSkpCisgICAgICAgICAgICAjIGVsc2U6IGlnbm9yZQorCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAndycsIGFsbG93WmlwNjQ9VHJ1ZSkKKyAgICAgICAgZm9yIHNyYyBpbiBhcmdzWzI6XToKKyAgICAgICAgICAgIGFkZFRvWmlwKHpmLCBzcmMsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKKworICAgICAgICB6Zi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCg==