ZGlmZiAtLWdpdCBhL0xpYi9fTFdQQ29va2llSmFyLnB5IGIvTGliL19MV1BDb29raWVKYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViODNhNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9fTFdQQ29va2llSmFyLnB5CkBAIC0wLDAgKzEsMTcxIEBACisiIiJMb2FkIC8gc2F2ZSB0byBsaWJ3d3ctcGVybCAoTFdQKSBmb3JtYXQgZmlsZXMuCisKK0FjdHVhbGx5LCB0aGUgZm9ybWF0IGlzIHNsaWdodGx5IGV4dGVuZGVkIGZyb20gdGhhdCB1c2VkIGJ5IExXUCdzCisobGlid3d3LXBlcmwncykgSFRUUDo6Q29va2llcywgdG8gYXZvaWQgbG9zaW5nIHNvbWUgUkZDIDI5NjUgaW5mb3JtYXRpb24KK25vdCByZWNvcmRlZCBieSBMV1AuCisKK0l0IHVzZXMgdGhlIHZlcnNpb24gc3RyaW5nICIyLjAiLCB0aG91Z2ggcmVhbGx5IHRoZXJlIGlzbid0IGFuIExXUCBDb29raWVzCisyLjAgZm9ybWF0LiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBleHRyYSBpbmZvcm1hdGlvbiBpbiBoZXJlCisoZG9tYWluX2RvdCBhbmQgIyBwb3J0X3NwZWMpIHdoaWxlIHN0aWxsIGJlaW5nIGNvbXBhdGlibGUgd2l0aAorbGlid3d3LXBlcmwsIEkgaG9wZS4KKworIiIiCisKK2ltcG9ydCB0aW1lLCByZSwgbG9nZ2luZworZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucywgRmlsZUNvb2tpZUphciwgQ29va2llLCBcCisgICAgIE1JU1NJTkdfRklMRU5BTUVfVEVYVCwgam9pbl9oZWFkZXJfd29yZHMsIHNwbGl0X2hlYWRlcl93b3JkcywgXAorICAgICBpc28ydGltZSwgdGltZTJpc296CisKK2RlZiBsd3BfY29va2llX3N0cihjb29raWUpOgorICAgICIiIlJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQ29va2llIGluIGFuIHRoZSBMV1AgY29va2llIGZpbGUgZm9ybWF0LgorCisgICAgQWN0dWFsbHksIHRoZSBmb3JtYXQgaXMgZXh0ZW5kZWQgYSBiaXQgLS0gc2VlIG1vZHVsZSBkb2NzdHJpbmcuCisKKyAgICAiIiIKKyAgICBoID0gWyhjb29raWUubmFtZSwgY29va2llLnZhbHVlKSwKKyAgICAgICAgICgicGF0aCIsIGNvb2tpZS5wYXRoKSwKKyAgICAgICAgICgiZG9tYWluIiwgY29va2llLmRvbWFpbildCisgICAgaWYgY29va2llLnBvcnQgaXMgbm90IE5vbmU6IGguYXBwZW5kKCgicG9ydCIsIGNvb2tpZS5wb3J0KSkKKyAgICBpZiBjb29raWUucGF0aF9zcGVjaWZpZWQ6IGguYXBwZW5kKCgicGF0aF9zcGVjIiwgTm9uZSkpCisgICAgaWYgY29va2llLnBvcnRfc3BlY2lmaWVkOiBoLmFwcGVuZCgoInBvcnRfc3BlYyIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5kb21haW5faW5pdGlhbF9kb3Q6IGguYXBwZW5kKCgiZG9tYWluX2RvdCIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5zZWN1cmU6IGguYXBwZW5kKCgic2VjdXJlIiwgTm9uZSkpCisgICAgaWYgY29va2llLmV4cGlyZXM6IGguYXBwZW5kKCgiZXhwaXJlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTJpc296KGZsb2F0KGNvb2tpZS5leHBpcmVzKSkpKQorICAgIGlmIGNvb2tpZS5kaXNjYXJkOiBoLmFwcGVuZCgoImRpc2NhcmQiLCBOb25lKSkKKyAgICBpZiBjb29raWUuY29tbWVudDogaC5hcHBlbmQoKCJjb21tZW50IiwgY29va2llLmNvbW1lbnQpKQorICAgIGlmIGNvb2tpZS5jb21tZW50X3VybDogaC5hcHBlbmQoKCJjb21tZW50dXJsIiwgY29va2llLmNvbW1lbnRfdXJsKSkKKworICAgIGtleXMgPSBjb29raWUuX3Jlc3Qua2V5cygpCisgICAga2V5cy5zb3J0KCkKKyAgICBmb3IgayBpbiBrZXlzOgorICAgICAgICBoLmFwcGVuZCgoaywgc3RyKGNvb2tpZS5fcmVzdFtrXSkpKQorCisgICAgaC5hcHBlbmQoKCJ2ZXJzaW9uIiwgc3RyKGNvb2tpZS52ZXJzaW9uKSkpCisKKyAgICByZXR1cm4gam9pbl9oZWFkZXJfd29yZHMoW2hdKQorCitjbGFzcyBMV1BDb29raWVKYXIoRmlsZUNvb2tpZUphcik6CisgICAgIiIiCisgICAgVGhlIExXUENvb2tpZUphciBzYXZlcyBhIHNlcXVlbmNlIG9mIlNldC1Db29raWUzIiBsaW5lcy4KKyAgICAiU2V0LUNvb2tpZTMiIGlzIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgbGlid3d3LXBlcmwgbGliYXJ5LCBub3Qga25vd24KKyAgICB0byBiZSBjb21wYXRpYmxlIHdpdGggYW55IGJyb3dzZXIsIGJ1dCB3aGljaCBpcyBlYXN5IHRvIHJlYWQgYW5kCisgICAgZG9lc24ndCBsb3NlIGluZm9ybWF0aW9uIGFib3V0IFJGQyAyOTY1IGNvb2tpZXMuCisKKyAgICBBZGRpdGlvbmFsIG1ldGhvZHMKKworICAgIGFzX2x3cF9zdHIoaWdub3JlX2Rpc2NhcmQ9VHJ1ZSwgaWdub3JlX2V4cGlyZWQ9VHJ1ZSkKKworICAgICIiIgorCisgICAgZGVmIGFzX2x3cF9zdHIoc2VsZiwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSwgaWdub3JlX2V4cGlyZXM9VHJ1ZSk6CisgICAgICAgICIiIlJldHVybiBjb29raWVzIGFzIGEgc3RyaW5nIG9mICJcbiItc2VwYXJhdGVkICJTZXQtQ29va2llMyIgaGVhZGVycy4KKworICAgICAgICBpZ25vcmVfZGlzY2FyZCBhbmQgaWdub3JlX2V4cGlyZXM6IHNlZSBkb2NzdHJpbmcgZm9yIEZpbGVDb29raWVKYXIuc2F2ZQorCisgICAgICAgICIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjb29raWUuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjb29raWUuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByLmFwcGVuZCgiU2V0LUNvb2tpZTM6ICVzIiAlIGx3cF9jb29raWVfc3RyKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4ocitbIiJdKQorCisgICAgZGVmIHNhdmUoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6IGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBUaGVyZSByZWFsbHkgaXNuJ3QgYW4gTFdQIENvb2tpZXMgMi4wIGZvcm1hdCwgYnV0IHRoaXMgaW5kaWNhdGVzCisgICAgICAgICAgICAjIHRoYXQgdGhlcmUgaXMgZXh0cmEgaW5mb3JtYXRpb24gaW4gaGVyZSAoZG9tYWluX2RvdCBhbmQKKyAgICAgICAgICAgICMgcG9ydF9zcGVjKSB3aGlsZSBzdGlsbCBiZWluZyBjb21wYXRpYmxlIHdpdGggbGlid3d3LXBlcmwsIEkgaG9wZS4KKyAgICAgICAgICAgIGYud3JpdGUoIiNMV1AtQ29va2llcy0yLjBcbiIpCisgICAgICAgICAgICBmLndyaXRlKHNlbGYuYXNfbHdwX3N0cihpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgX3JlYWxseV9sb2FkKHNlbGYsIGYsIGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpOgorICAgICAgICBtYWdpYyA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHNlbGYubWFnaWNfcmUsIG1hZ2ljKToKKyAgICAgICAgICAgIG1zZyA9ICIlcyBkb2VzIG5vdCBzZWVtIHRvIGNvbnRhaW4gY29va2llcyIgJSBmaWxlbmFtZQorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCisKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKworICAgICAgICBoZWFkZXIgPSAiU2V0LUNvb2tpZTM6IgorICAgICAgICBib29sZWFuX2F0dHJzID0gKCJwb3J0X3NwZWMiLCAicGF0aF9zcGVjIiwgImRvbWFpbl9kb3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWN1cmUiLCAiZGlzY2FyZCIpCisgICAgICAgIHZhbHVlX2F0dHJzID0gKCJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAicGF0aCIsICJkb21haW4iLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwaXJlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICJjb21tZW50IiwgImNvbW1lbnR1cmwiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gIiI6IGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aChoZWFkZXIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2xlbihoZWFkZXIpOl0uc3RyaXAoKQorCisgICAgICAgICAgICAgICAgZm9yIGRhdGEgaW4gc3BsaXRfaGVhZGVyX3dvcmRzKFtsaW5lXSk6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gZGF0YVswXQorICAgICAgICAgICAgICAgICAgICAjIG5hbWUgYW5kIHZhbHVlIGFyZSBhbiBleGNlcHRpb24gaGVyZSwgc2luY2UgYSBwbGFpbiAiZm9vIgorICAgICAgICAgICAgICAgICAgICAjICh3aXRoIG5vICI9IiwgdW5saWtlICJiYXI9Zm9vIikgbWVhbnMgYSBjb29raWUgd2l0aCBubworICAgICAgICAgICAgICAgICAgICAjIG5hbWUgYW5kIHZhbHVlICJmb28iLiAgV2l0aCBhbGwgb3RoZXIgY29va2llLWF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNpdHVhdGlvbiBpcyByZXZlcnNlZDogImZvbyIgbWVhbnMgYW4gYXR0cmlidXRlIG5hbWVkCisgICAgICAgICAgICAgICAgICAgICMgImZvbyIgd2l0aCBubyB2YWx1ZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gdmFsdWUsIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSB7fQorICAgICAgICAgICAgICAgICAgICByZXN0ID0ge30KKyAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkW2tdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZGF0YVsxOl06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBsb3NlIGNhc2UgZGlzdGluY3Rpb24gZm9yIHVua25vd24gZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGMgaW4gdmFsdWVfYXR0cnMpIG9yIChsYyBpbiBib29sZWFuX2F0dHJzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gbGMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6IHYgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSB2CisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGsgaW4gdmFsdWVfYXR0cnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSB2CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Rba10gPSB2CisKKyAgICAgICAgICAgICAgICAgICAgaCA9IHN0YW5kYXJkLmdldAorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gaCgiZXhwaXJlcyIpCisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBoKCJkaXNjYXJkIikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwaXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBpc28ydGltZShleHBpcmVzKQorICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBoKCJkb21haW4iKQorICAgICAgICAgICAgICAgICAgICBkb21haW5fc3BlY2lmaWVkID0gZG9tYWluLnN0YXJ0c3dpdGgoIi4iKQorICAgICAgICAgICAgICAgICAgICBjID0gQ29va2llKGgoInZlcnNpb24iKSwgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgicG9ydCIpLCBoKCJwb3J0X3NwZWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIGgoImRvbWFpbl9kb3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJwYXRoIiksIGgoInBhdGhfc3BlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoInNlY3VyZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJjb21tZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgiY29tbWVudHVybCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGlzY2FyZCBhbmQgYy5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMoKElPRXJyb3IsKSkKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImludmFsaWQgU2V0LUNvb2tpZTMgZm9ybWF0IGZpbGUgJXMiICUgZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvX01vemlsbGFDb29raWVKYXIucHkgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxYTg3OQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtMCwwICsxLDE0NSBAQAorIiIiTW96aWxsYSAvIE5ldHNjYXBlIGNvb2tpZSBsb2FkaW5nIC8gc2F2aW5nLiIiIgorCitpbXBvcnQgcmUsIHRpbWUsIGxvZ2dpbmcKKworZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucywgRmlsZUNvb2tpZUphciwgQ29va2llLCBcCisgICAgIE1JU1NJTkdfRklMRU5BTUVfVEVYVAorCitjbGFzcyBNb3ppbGxhQ29va2llSmFyKEZpbGVDb29raWVKYXIpOgorICAgICIiIgorCisgICAgV0FSTklORzogeW91IG1heSB3YW50IHRvIGJhY2t1cCB5b3VyIGJyb3dzZXIncyBjb29raWVzIGZpbGUgaWYgeW91IHVzZQorICAgIHRoaXMgY2xhc3MgdG8gc2F2ZSBjb29raWVzLiAgSSAqdGhpbmsqIGl0IHdvcmtzLCBidXQgdGhlcmUgaGF2ZSBiZWVuCisgICAgYnVncyBpbiB0aGUgcGFzdCEKKworICAgIFRoaXMgY2xhc3MgZGlmZmVycyBmcm9tIENvb2tpZUphciBvbmx5IGluIHRoZSBmb3JtYXQgaXQgdXNlcyB0byBzYXZlIGFuZAorICAgIGxvYWQgY29va2llcyB0byBhbmQgZnJvbSBhIGZpbGUuICBUaGlzIGNsYXNzIHVzZXMgdGhlIE1vemlsbGEvTmV0c2NhcGUKKyAgICBgY29va2llcy50eHQnIGZvcm1hdC4gIGx5bnggdXNlcyB0aGlzIGZpbGUgZm9ybWF0LCB0b28uCisKKyAgICBEb24ndCBleHBlY3QgY29va2llcyBzYXZlZCB3aGlsZSB0aGUgYnJvd3NlciBpcyBydW5uaW5nIHRvIGJlIG5vdGljZWQgYnkKKyAgICB0aGUgYnJvd3NlciAoaW4gZmFjdCwgTW96aWxsYSBvbiB1bml4IHdpbGwgb3ZlcndyaXRlIHlvdXIgc2F2ZWQgY29va2llcyBpZgorICAgIHlvdSBjaGFuZ2UgdGhlbSBvbiBkaXNrIHdoaWxlIGl0J3MgcnVubmluZzsgb24gV2luZG93cywgeW91IHByb2JhYmx5IGNhbid0CisgICAgc2F2ZSBhdCBhbGwgd2hpbGUgdGhlIGJyb3dzZXIgaXMgcnVubmluZykuCisKKyAgICBOb3RlIHRoYXQgdGhlIE1vemlsbGEvTmV0c2NhcGUgZm9ybWF0IHdpbGwgZG93bmdyYWRlIFJGQzI5NjUgY29va2llcyB0bworICAgIE5ldHNjYXBlIGNvb2tpZXMgb24gc2F2aW5nLgorCisgICAgSW4gcGFydGljdWxhciwgdGhlIGNvb2tpZSB2ZXJzaW9uIGFuZCBwb3J0IG51bWJlciBpbmZvcm1hdGlvbiBpcyBsb3N0LAorICAgIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBvciBub3QgUGF0aCwgUG9ydCBhbmQgRGlzY2FyZCB3ZXJlCisgICAgc3BlY2lmaWVkIGJ5IHRoZSBTZXQtQ29va2llMiAob3IgU2V0LUNvb2tpZSkgaGVhZGVyLCBhbmQgd2hldGhlciBvciBub3QgdGhlCisgICAgZG9tYWluIGFzIHNldCBpbiB0aGUgSFRUUCBoZWFkZXIgc3RhcnRlZCB3aXRoIGEgZG90ICh5ZXMsIEknbSBhd2FyZSBzb21lCisgICAgZG9tYWlucyBpbiBOZXRzY2FwZSBmaWxlcyBzdGFydCB3aXRoIGEgZG90IGFuZCBzb21lIGRvbid0IC0tIHRydXN0IG1lLCB5b3UKKyAgICByZWFsbHkgZG9uJ3Qgd2FudCB0byBrbm93IGFueSBtb3JlIGFib3V0IHRoaXMpLgorCisgICAgTm90ZSB0aGF0IHRob3VnaCBNb3ppbGxhIGFuZCBOZXRzY2FwZSB1c2UgdGhlIHNhbWUgZm9ybWF0LCB0aGV5IHVzZQorICAgIHNsaWdodGx5IGRpZmZlcmVudCBoZWFkZXJzLiAgVGhlIGNsYXNzIHNhdmVzIGNvb2tpZXMgdXNpbmcgdGhlIE5ldHNjYXBlCisgICAgaGVhZGVyIGJ5IGRlZmF1bHQgKE1vemlsbGEgY2FuIGNvcGUgd2l0aCB0aGF0KS4KKworICAgICIiIgorICAgIG1hZ2ljX3JlID0gIiMoIE5ldHNjYXBlKT8gSFRUUCBDb29raWUgRmlsZSIKKyAgICBoZWFkZXIgPSAiIiJcCisgICAgIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlCisgICAgIyBodHRwOi8vd3d3Lm5ldHNjYXBlLmNvbS9uZXdzcmVmL3N0ZC9jb29raWVfc3BlYy5odG1sCisgICAgIyBUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGUhICBEbyBub3QgZWRpdC4KKworIiIiCisKKyAgICBkZWYgX3JlYWxseV9sb2FkKHNlbGYsIGYsIGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIG1hZ2ljID0gZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCByZS5zZWFyY2goc2VsZi5tYWdpY19yZSwgbWFnaWMpOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKAorICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBOZXRzY2FwZSBmb3JtYXQgY29va2llcyBmaWxlIiAlCisgICAgICAgICAgICAgICAgZmlsZW5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAiIjogYnJlYWsKKworICAgICAgICAgICAgICAgICMgbGFzdCBmaWVsZCBtYXkgYmUgYWJzZW50LCBzbyBrZWVwIGFueSB0cmFpbGluZyB0YWIKKyAgICAgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJcbiIpOiBsaW5lID0gbGluZVs6LTFdCisKKyAgICAgICAgICAgICAgICAjIHNraXAgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzIFhYWCB3aGF0IGlzICQgZm9yPworICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgiIyIpIG9yCisgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIkIikgb3IKKyAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpID09ICIiKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgcGF0aCwgc2VjdXJlLCBleHBpcmVzLCBuYW1lLCB2YWx1ZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3BsaXQoIlx0IikKKyAgICAgICAgICAgICAgICBzZWN1cmUgPSAoc2VjdXJlID09ICJUUlVFIikKKyAgICAgICAgICAgICAgICBkb21haW5fc3BlY2lmaWVkID0gKGRvbWFpbl9zcGVjaWZpZWQgPT0gIlRSVUUiKQorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKworICAgICAgICAgICAgICAgIGluaXRpYWxfZG90ID0gZG9tYWluLnN0YXJ0c3dpdGgoIi4iKQorICAgICAgICAgICAgICAgIGFzc2VydCBkb21haW5fc3BlY2lmaWVkID09IGluaXRpYWxfZG90CisKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBleHBpcmVzID09ICIiOgorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgIyBhc3N1bWUgcGF0aF9zcGVjaWZpZWQgaXMgZmFsc2UKKyAgICAgICAgICAgICAgICBjID0gQ29va2llKDAsIG5hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIGluaXRpYWxfZG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoYykKKworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMoKElPRXJyb3IsKSkKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImludmFsaWQgTmV0c2NhcGUgZm9ybWF0IGZpbGUgJXM6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwgbGluZSkpCisKKyAgICBkZWYgc2F2ZShzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZTogZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICAgICBlbHNlOiByYWlzZSBWYWx1ZUVycm9yKE1JU1NJTkdfRklMRU5BTUVfVEVYVCkKKworICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKHNlbGYuaGVhZGVyKQorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2Rpc2NhcmQgYW5kIGNvb2tpZS5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZXhwaXJlcyBhbmQgY29va2llLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuc2VjdXJlOiBzZWN1cmUgPSAiVFJVRSIKKyAgICAgICAgICAgICAgICBlbHNlOiBzZWN1cmUgPSAiRkFMU0UiCisgICAgICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbi5zdGFydHN3aXRoKCIuIik6IGluaXRpYWxfZG90ID0gIlRSVUUiCisgICAgICAgICAgICAgICAgZWxzZTogaW5pdGlhbF9kb3QgPSAiRkFMU0UiCisgICAgICAgICAgICAgICAgaWYgY29va2llLmV4cGlyZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBzdHIoY29va2llLmV4cGlyZXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9ICIiCisgICAgICAgICAgICAgICAgaWYgY29va2llLnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgY29va2llcy50eHQgcmVnYXJkcyAnU2V0LUNvb2tpZTogZm9vJyBhcyBhIGNvb2tpZQorICAgICAgICAgICAgICAgICAgICAjIHdpdGggbm8gbmFtZSwgd2hlcmVhcyBjb29raWVsaWIgcmVnYXJkcyBpdCBhcyBhCisgICAgICAgICAgICAgICAgICAgICMgY29va2llIHdpdGggbm8gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29va2llLnZhbHVlCisgICAgICAgICAgICAgICAgZi53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgIlx0Ii5qb2luKFtjb29raWUuZG9tYWluLCBpbml0aWFsX2RvdCwgY29va2llLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLCBleHBpcmVzLCBuYW1lLCB2YWx1ZV0pKworICAgICAgICAgICAgICAgICAgICAiXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvY29va2llbGliLnB5IGIvTGliL2Nvb2tpZWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODI4ODZhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2Nvb2tpZWxpYi5weQpAQCAtMCwwICsxLDE3NTYgQEAKKyIiIkhUVFAgY29va2llIGhhbmRsaW5nIGZvciB3ZWIgY2xpZW50cy4KKworVGhpcyBtb2R1bGUgaGFzIChub3cgZmFpcmx5IGRpc3RhbnQpIG9yaWdpbnMgaW4gR2lzbGUgQWFzJyBQZXJsIG1vZHVsZQorSFRUUDo6Q29va2llcywgZnJvbSB0aGUgbGlid3d3LXBlcmwgbGlicmFyeS4KKworRG9jc3RyaW5ncywgY29tbWVudHMgYW5kIGRlYnVnIHN0cmluZ3MgaW4gdGhpcyBjb2RlIHJlZmVyIHRvIHRoZQorYXR0cmlidXRlcyBvZiB0aGUgSFRUUCBjb29raWUgc3lzdGVtIGFzIGNvb2tpZS1hdHRyaWJ1dGVzLCB0byBkaXN0aW5ndWlzaAordGhlbSBjbGVhcmx5IGZyb20gUHl0aG9uIGF0dHJpYnV0ZXMuCisKK0NsYXNzIGRpYWdyYW0gKG5vdGUgdGhhdCB0aGUgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVyaXZlIGZyb20KK0ZpbGVDb29raWVKYXIgYXJlIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSwgYnV0CithcmUgYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3d3NlYXJjaC5zZi5uZXQvKToKKworICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llSmFyX19fXworICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgXCAgICAgIFwKKyAgICAgICAgICAgIEZpbGVDb29raWVKYXIgICAgICBcICAgICAgXAorICAgICAgICAgICAgIC8gICAgfCAgIFwgICAgICAgICBcICAgICAgXAorIE1vemlsbGFDb29raWVKYXIgfCBMV1BDb29raWVKYXIgXCAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgIC0tLU1TSUVCYXNlIHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgLyAgICAgIHwgICAgIHwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHwgLyAgIE1TSUVEQkNvb2tpZUphciBCU0REQkNvb2tpZUphcgorICAgICAgICAgICAgICAgICAgfC8KKyAgICAgICAgICAgICAgIE1TSUVDb29raWVKYXIKKworIiIiCisKK2ltcG9ydCBzeXMsIHJlLCB1cmxwYXJzZSwgY29weSwgdGltZSwgc3RydWN0LCB1cmxsaWIsIHR5cGVzLCBsb2dnaW5nCitmcm9tIHR5cGVzIGltcG9ydCBTdHJpbmdUeXBlcwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcgYXMgX3RocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgX3RocmVhZGluZworaW1wb3J0IGh0dHBsaWIgICMgb25seSBmb3IgdGhlIGRlZmF1bHQgSFRUUCBwb3J0Citmcm9tIGNhbGVuZGFyIGltcG9ydCB0aW1lZ20KKworbG9nZ2luZy5nZXRMb2dnZXIoImNvb2tpZWxpYiIpLmFkZEhhbmRsZXIobG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkpCitkZWJ1ZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb29raWVsaWIiKS5kZWJ1ZworCitERUZBVUxUX0hUVFBfUE9SVCA9IHN0cihodHRwbGliLkhUVFBfUE9SVCkKK01JU1NJTkdfRklMRU5BTUVfVEVYVCA9ICgiYSBmaWxlbmFtZSB3YXMgbm90IHN1cHBsaWVkIChub3Igd2FzIHRoZSBDb29raWVKYXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBpbml0aWFsaXNlZCB3aXRoIG9uZSkiKQorCitkZWYgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zKHVubWFza2VkPSgpKToKKyAgICAjIFRoZXJlIGFyZSBhIGZldyBjYXRjaC1hbGwgZXhjZXB0OiBzdGF0ZW1lbnRzIGluIHRoaXMgbW9kdWxlLCBmb3IKKyAgICAjIGNhdGNoaW5nIGlucHV0IHRoYXQncyBiYWQgaW4gdW5leHBlY3RlZCB3YXlzLgorICAgICMgVGhpcyBmdW5jdGlvbiByZS1yYWlzZXMgc29tZSBleGNlcHRpb25zIHdlIGRvbid0IHdhbnQgdG8gdHJhcC4KKyAgICB1bm1hc2tlZCA9IHVubWFza2VkICsgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0LCBNZW1vcnlFcnJvcikKKyAgICBldHlwZSA9IHN5cy5leGNfaW5mbygpWzBdCisgICAgaWYgaXNzdWJjbGFzcyhldHlwZSwgdW5tYXNrZWQpOgorICAgICAgICByYWlzZQorICAgICMgc3dhbGxvd2VkIGFuIGV4Y2VwdGlvbgorICAgIGltcG9ydCB3YXJuaW5ncworICAgIHdhcm5pbmdzLndhcm4oImNvb2tpZWxpYiBidWchIiwgc3RhY2tsZXZlbD0yKQorICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKworCisjIERhdGUvdGltZSBjb252ZXJzaW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQT0NIX1lFQVIgPSAxOTcwCitkZWYgX3RpbWVnbSh0dCk6CisgICAgeWVhciwgbW9udGgsIG1kYXksIGhvdXIsIG1pbiwgc2VjID0gdHRbOjZdCisgICAgaWYgKCh5ZWFyID49IEVQT0NIX1lFQVIpIGFuZCAoMSA8PSBtb250aCA8PSAxMikgYW5kICgxIDw9IG1kYXkgPD0gMzEpIGFuZAorICAgICAgICAoMCA8PSBob3VyIDw9IDI0KSBhbmQgKDAgPD0gbWluIDw9IDU5KSBhbmQgKDAgPD0gc2VjIDw9IDYxKSk6CisgICAgICAgIHJldHVybiB0aW1lZ20odHQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworREFZUyA9IFsiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIl0KK01PTlRIUyA9IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdCitNT05USFNfTE9XRVIgPSBbXQorZm9yIG1vbnRoIGluIE1PTlRIUzogTU9OVEhTX0xPV0VSLmFwcGVuZChtb250aC5sb3dlcigpKQorCitkZWYgdGltZTJpc296KHQ9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aW1lIGluIHNlY29uZHMgc2luY2UgZXBvY2gsIHQuCisKKyAgICBJZiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIGl0IHdpbGwgdXNlIHRoZSBjdXJyZW50CisgICAgdGltZS4KKworICAgIFRoZSBmb3JtYXQgb2YgdGhlIHJldHVybmVkIHN0cmluZyBpcyBsaWtlICJZWVlZLU1NLUREIGhoOm1tOnNzWiIsCisgICAgcmVwcmVzZW50aW5nIFVuaXZlcnNhbCBUaW1lIChVVEMsIGFrYSBHTVQpLiAgQW4gZXhhbXBsZSBvZiB0aGlzIGZvcm1hdCBpczoKKworICAgIDE5OTQtMTEtMjQgMDg6NDk6MzdaCisKKyAgICAiIiIKKyAgICBpZiB0IGlzIE5vbmU6IHQgPSB0aW1lLnRpbWUoKQorICAgIHllYXIsIG1vbiwgbWRheSwgaG91ciwgbWluLCBzZWMgPSB0aW1lLmdtdGltZSh0KVs6Nl0KKyAgICByZXR1cm4gIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkWiIgJSAoCisgICAgICAgIHllYXIsIG1vbiwgbWRheSwgaG91ciwgbWluLCBzZWMpCisKK2RlZiB0aW1lMm5ldHNjYXBlKHQ9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aW1lIGluIHNlY29uZHMgc2luY2UgZXBvY2gsIHQuCisKKyAgICBJZiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIGl0IHdpbGwgdXNlIHRoZSBjdXJyZW50CisgICAgdGltZS4KKworICAgIFRoZSBmb3JtYXQgb2YgdGhlIHJldHVybmVkIHN0cmluZyBpcyBsaWtlIHRoaXM6CisKKyAgICBXZWQsIERELU1vbi1ZWVlZIEhIOk1NOlNTIEdNVAorCisgICAgIiIiCisgICAgaWYgdCBpcyBOb25lOiB0ID0gdGltZS50aW1lKCkKKyAgICB5ZWFyLCBtb24sIG1kYXksIGhvdXIsIG1pbiwgc2VjLCB3ZGF5ID0gdGltZS5nbXRpbWUodClbOjddCisgICAgcmV0dXJuICIlcyAlMDJkLSVzLSUwNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgREFZU1t3ZGF5XSwgbWRheSwgTU9OVEhTW21vbi0xXSwgeWVhciwgaG91ciwgbWluLCBzZWMpCisKKworVVRDX1pPTkVTID0geyJHTVQiOiBOb25lLCAiVVRDIjogTm9uZSwgIlVUIjogTm9uZSwgIloiOiBOb25lfQorCitUSU1FWk9ORV9SRSA9IHJlLmNvbXBpbGUociJeKFstK10pPyhcZFxkPyk6PyhcZFxkKT8kIikKK2RlZiBvZmZzZXRfZnJvbV90el9zdHJpbmcodHopOgorICAgIG9mZnNldCA9IE5vbmUKKyAgICBpZiB0eiBpbiBVVENfWk9ORVM6CisgICAgICAgIG9mZnNldCA9IDAKKyAgICBlbHNlOgorICAgICAgICBtID0gVElNRVpPTkVfUkUuc2VhcmNoKHR6KQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgb2Zmc2V0ID0gMzYwMCAqIGludChtLmdyb3VwKDIpKQorICAgICAgICAgICAgaWYgbS5ncm91cCgzKToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyA2MCAqIGludChtLmdyb3VwKDMpKQorICAgICAgICAgICAgaWYgbS5ncm91cCgxKSA9PSAnLSc6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldAorICAgIHJldHVybiBvZmZzZXQKKworZGVmIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopOgorICAgICMgdHJhbnNsYXRlIG1vbnRoIG5hbWUgdG8gbnVtYmVyCisgICAgIyBtb250aCBudW1iZXJzIHN0YXJ0IHdpdGggMSAoSmFudWFyeSkKKyAgICB0cnk6CisgICAgICAgIG1vbiA9IE1PTlRIU19MT1dFUi5pbmRleChtb24ubG93ZXIoKSkrMQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAjIG1heWJlIGl0J3MgYWxyZWFkeSBhIG51bWJlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbW9uID0gaW50KG1vbikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiAxIDw9IGltb24gPD0gMTI6CisgICAgICAgICAgICBtb24gPSBpbW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBtYWtlIHN1cmUgY2xvY2sgZWxlbWVudHMgYXJlIGRlZmluZWQKKyAgICBpZiBociBpcyBOb25lOiBociA9IDAKKyAgICBpZiBtaW4gaXMgTm9uZTogbWluID0gMAorICAgIGlmIHNlYyBpcyBOb25lOiBzZWMgPSAwCisKKyAgICB5ciA9IGludCh5cikKKyAgICBkYXkgPSBpbnQoZGF5KQorICAgIGhyID0gaW50KGhyKQorICAgIG1pbiA9IGludChtaW4pCisgICAgc2VjID0gaW50KHNlYykKKworICAgIGlmIHlyIDwgMTAwMDoKKyAgICAgICAgIyBmaW5kICJvYnZpb3VzIiB5ZWFyCisgICAgICAgIGN1cl95ciA9IHRpbWUubG9jYWx0aW1lKHRpbWUudGltZSgpKVswXQorICAgICAgICBtID0gY3VyX3lyICUgMTAwCisgICAgICAgIHRtcCA9IHlyCisgICAgICAgIHlyID0geXIgKyBjdXJfeXIgLSBtCisgICAgICAgIG0gPSBtIC0gdG1wCisgICAgICAgIGlmIGFicyhtKSA+IDUwOgorICAgICAgICAgICAgaWYgbSA+IDA6IHlyID0geXIgKyAxMDAKKyAgICAgICAgICAgIGVsc2U6IHlyID0geXIgLSAxMDAKKworICAgICMgY29udmVydCBVVEMgdGltZSB0dXBsZSB0byBzZWNvbmRzIHNpbmNlIGVwb2NoIChub3QgdGltZXpvbmUtYWRqdXN0ZWQpCisgICAgdCA9IF90aW1lZ20oKHlyLCBtb24sIGRheSwgaHIsIG1pbiwgc2VjLCB0eikpCisKKyAgICBpZiB0IGlzIG5vdCBOb25lOgorICAgICAgICAjIGFkanVzdCB0aW1lIHVzaW5nIHRpbWV6b25lIHN0cmluZywgdG8gZ2V0IGFic29sdXRlIHRpbWUgc2luY2UgZXBvY2gKKyAgICAgICAgaWYgdHogaXMgTm9uZToKKyAgICAgICAgICAgIHR6ID0gIlVUQyIKKyAgICAgICAgdHogPSB0ei51cHBlcigpCisgICAgICAgIG9mZnNldCA9IG9mZnNldF9mcm9tX3R6X3N0cmluZyh0eikKKyAgICAgICAgaWYgb2Zmc2V0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0ID0gdCAtIG9mZnNldAorCisgICAgcmV0dXJuIHQKKworU1RSSUNUX0RBVEVfUkUgPSByZS5jb21waWxlKAorICAgIHIiXltTTVRXRl1bYS16XVthLXpdLCAoXGRcZCkgKFtKRk1BU09ORF1bYS16XVthLXpdKSAiCisgICAgIihcZFxkXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJCIpCitXRUVLREFZX1JFID0gcmUuY29tcGlsZSgKKyAgICByIl4oPzpTdW58TW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXQpW2Etel0qLD9ccyoiLCByZS5JKQorTE9PU0VfSFRUUF9EQVRFX1JFID0gcmUuY29tcGlsZSgKKyAgICByIiIiXgorICAgIChcZFxkPykgICAgICAgICAgICAjIGRheQorICAgICAgICg/OlxzK3xbLVwvXSkKKyAgICAoXHcrKSAgICAgICAgICAgICAgIyBtb250aAorICAgICAgICAoPzpccyt8Wy1cL10pCisgICAgKFxkKykgICAgICAgICAgICAgICMgeWVhcgorICAgICg/OgorICAgICAgICAgICg/OlxzK3w6KSAgICAjIHNlcGFyYXRvciBiZWZvcmUgY2xvY2sKKyAgICAgICAoXGRcZD8pOihcZFxkKSAgIyBob3VyOm1pbgorICAgICAgICg/OjooXGRcZCkpPyAgICAjIG9wdGlvbmFsIHNlY29uZHMKKyAgICApPyAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCBjbG9jaworICAgICAgIFxzKgorICAgIChbLStdP1xkezIsNH18KD8hW0FQYXBdW01tXVxiKVtBLVphLXpdKyk/ICMgdGltZXpvbmUKKyAgICAgICBccyoKKyAgICAoPzpcKFx3K1wpKT8gICAgICAgIyBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aW1lem9uZSBpbiBwYXJlbnMuCisgICAgICAgXHMqJCIiIiwgcmUuWCkKK2RlZiBodHRwMnRpbWUodGV4dCk6CisgICAgIiIiUmV0dXJucyB0aW1lIGluIHNlY29uZHMgc2luY2UgZXBvY2ggb2YgdGltZSByZXByZXNlbnRlZCBieSBhIHN0cmluZy4KKworICAgIFJldHVybiB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgorCisgICAgTm9uZSBpcyByZXR1cm5lZCBpZiB0aGUgZm9ybWF0IG9mIHN0ciBpcyB1bnJlY29nbml6ZWQsIHRoZSB0aW1lIGlzIG91dHNpZGUKKyAgICB0aGUgcmVwcmVzZW50YWJsZSByYW5nZSwgb3IgdGhlIHRpbWV6b25lIHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4gIElmIHRoZQorICAgIHN0cmluZyBjb250YWlucyBubyB0aW1lem9uZSwgVVRDIGlzIGFzc3VtZWQuCisKKyAgICBUaGUgdGltZXpvbmUgaW4gdGhlIHN0cmluZyBtYXkgYmUgbnVtZXJpY2FsIChsaWtlICItMDgwMCIgb3IgIiswMTAwIikgb3IgYQorICAgIHN0cmluZyB0aW1lem9uZSAobGlrZSAiVVRDIiwgIkdNVCIsICJCU1QiIG9yICJFU1QiKS4gIEN1cnJlbnRseSwgb25seSB0aGUKKyAgICB0aW1lem9uZSBzdHJpbmdzIGVxdWl2YWxlbnQgdG8gVVRDICh6ZXJvIG9mZnNldCkgYXJlIGtub3duIHRvIHRoZSBmdW5jdGlvbi4KKworICAgIFRoZSBmdW5jdGlvbiBsb29zZWx5IHBhcnNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisKKyAgICBXZWQsIDA5IEZlYiAxOTk0IDIyOjIzOjMyIEdNVCAgICAgICAtLSBIVFRQIGZvcm1hdAorICAgIFR1ZXNkYXksIDA4LUZlYi05NCAxNDoxNToyOSBHTVQgICAgIC0tIG9sZCByZmM4NTAgSFRUUCBmb3JtYXQKKyAgICBUdWVzZGF5LCAwOC1GZWItMTk5NCAxNDoxNToyOSBHTVQgICAtLSBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0CisgICAgMDkgRmViIDE5OTQgMjI6MjM6MzIgR01UICAgICAgICAgICAgLS0gSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXkpCisgICAgMDgtRmViLTk0IDE0OjE1OjI5IEdNVCAgICAgICAgICAgICAgLS0gcmZjODUwIGZvcm1hdCAobm8gd2Vla2RheSkKKyAgICAwOC1GZWItMTk5NCAxNDoxNToyOSBHTVQgICAgICAgICAgICAtLSBicm9rZW4gcmZjODUwIGZvcm1hdCAobm8gd2Vla2RheSkKKworICAgIFRoZSBwYXJzZXIgaWdub3JlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgVGhlIHRpbWUgbWF5IGJlCisgICAgYWJzZW50LgorCisgICAgSWYgdGhlIHllYXIgaXMgZ2l2ZW4gd2l0aCBvbmx5IDIgZGlnaXRzLCB0aGUgZnVuY3Rpb24gd2lsbCBzZWxlY3QgdGhlCisgICAgY2VudHVyeSB0aGF0IG1ha2VzIHRoZSB5ZWFyIGNsb3Nlc3QgdG8gdGhlIGN1cnJlbnQgZGF0ZS4KKworICAgICIiIgorICAgICMgZmFzdCBleGl0IGZvciBzdHJpY3RseSBjb25mb3JtaW5nIHN0cmluZworICAgIG0gPSBTVFJJQ1RfREFURV9SRS5zZWFyY2godGV4dCkKKyAgICBpZiBtOgorICAgICAgICBnID0gbS5ncm91cHMoKQorICAgICAgICBtb24gPSBNT05USFNfTE9XRVIuaW5kZXgoZ1sxXS5sb3dlcigpKSArIDEKKyAgICAgICAgdHQgPSAoaW50KGdbMl0pLCBtb24sIGludChnWzBdKSwKKyAgICAgICAgICAgICAgaW50KGdbM10pLCBpbnQoZ1s0XSksIGZsb2F0KGdbNV0pKQorICAgICAgICByZXR1cm4gX3RpbWVnbSh0dCkKKworICAgICMgTm8sIHdlIG5lZWQgc29tZSBtZXNzeSBwYXJzaW5nLi4uCisKKyAgICAjIGNsZWFuIHVwCisgICAgdGV4dCA9IHRleHQubHN0cmlwKCkKKyAgICB0ZXh0ID0gV0VFS0RBWV9SRS5zdWIoIiIsIHRleHQsIDEpICAjIFVzZWxlc3Mgd2Vla2RheQorCisgICAgIyB0eiBpcyB0aW1lIHpvbmUgc3BlY2lmaWVyIHN0cmluZworICAgIGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eiA9IFtOb25lXSo3CisKKyAgICAjIGxvb3NlIHJlZ2V4cCBwYXJzZQorICAgIG0gPSBMT09TRV9IVFRQX0RBVEVfUkUuc2VhcmNoKHRleHQpCisgICAgaWYgbSBpcyBub3QgTm9uZToKKyAgICAgICAgZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6ID0gbS5ncm91cHMoKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lICAjIGJhZCBmb3JtYXQKKworICAgIHJldHVybiBfc3RyMnRpbWUoZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6KQorCitJU09fREFURV9SRSA9IHJlLmNvbXBpbGUoCisgICAgIiIiXgorICAgIChcZHs0fSkgICAgICAgICAgICAgICMgeWVhcgorICAgICAgIFstXC9dPworICAgIChcZFxkPykgICAgICAgICAgICAgICMgbnVtZXJpY2FsIG1vbnRoCisgICAgICAgWy1cL10/CisgICAgKFxkXGQ/KSAgICAgICAgICAgICAgIyBkYXkKKyAgICg/OgorICAgICAgICAgKD86XHMrfFstOlR0XSkgICMgc2VwYXJhdG9yIGJlZm9yZSBjbG9jaworICAgICAgKFxkXGQ/KTo/KFxkXGQpICAgICMgaG91cjptaW4KKyAgICAgICg/Ojo/KFxkXGQoPzpcLlxkKik/KSk/ICAjIG9wdGlvbmFsIHNlY29uZHMgKGFuZCBmcmFjdGlvbmFsKQorICAgKT8gICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgY2xvY2sKKyAgICAgIFxzKgorICAgKFstK10/XGRcZD86Pyg6P1xkXGQpPworICAgIHxafHopPyAgICAgICAgICAgICAgICMgdGltZXpvbmUgIChaIGlzICJ6ZXJvIG1lcmlkaWFuIiwgaS5lLiBHTVQpCisgICAgICBccyokIiIiLCByZS5YKQorZGVmIGlzbzJ0aW1lKHRleHQpOgorICAgICIiIgorICAgIEFzIGZvciBodHRwMnRpbWUsIGJ1dCBwYXJzZXMgdGhlIElTTyA4NjAxIGZvcm1hdHM6CisKKyAgICAxOTk0LTAyLTAzIDE0OjE1OjI5IC0wMTAwICAgIC0tIElTTyA4NjAxIGZvcm1hdAorICAgIDE5OTQtMDItMDMgMTQ6MTU6MjkgICAgICAgICAgLS0gem9uZSBpcyBvcHRpb25hbAorICAgIDE5OTQtMDItMDMgICAgICAgICAgICAgICAgICAgLS0gb25seSBkYXRlCisgICAgMTk5NC0wMi0wM1QxNDoxNToyOSAgICAgICAgICAtLSBVc2UgVCBhcyBzZXBhcmF0b3IKKyAgICAxOTk0MDIwM1QxNDE1MjlaICAgICAgICAgICAgIC0tIElTTyA4NjAxIGNvbXBhY3QgZm9ybWF0CisgICAgMTk5NDAyMDMgICAgICAgICAgICAgICAgICAgICAtLSBvbmx5IGRhdGUKKworICAgICIiIgorICAgICMgY2xlYW4gdXAKKyAgICB0ZXh0ID0gdGV4dC5sc3RyaXAoKQorCisgICAgIyB0eiBpcyB0aW1lIHpvbmUgc3BlY2lmaWVyIHN0cmluZworICAgIGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eiA9IFtOb25lXSo3CisKKyAgICAjIGxvb3NlIHJlZ2V4cCBwYXJzZQorICAgIG0gPSBJU09fREFURV9SRS5zZWFyY2godGV4dCkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAjIFhYWCB0aGVyZSdzIGFuIGV4dHJhIGJpdCBvZiB0aGUgdGltZXpvbmUgSSdtIGlnbm9yaW5nIGhlcmU6IGlzCisgICAgICAgICMgICB0aGlzIHRoZSByaWdodCB0aGluZyB0byBkbz8KKyAgICAgICAgeXIsIG1vbiwgZGF5LCBociwgbWluLCBzZWMsIHR6LCBfID0gbS5ncm91cHMoKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lICAjIGJhZCBmb3JtYXQKKworICAgIHJldHVybiBfc3RyMnRpbWUoZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6KQorCisKKyMgSGVhZGVyIHBhcnNpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHVubWF0Y2hlZChtYXRjaCk6CisgICAgIiIiUmV0dXJuIHVubWF0Y2hlZCBwYXJ0IG9mIHJlLk1hdGNoIG9iamVjdC4iIiIKKyAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigwKQorICAgIHJldHVybiBtYXRjaC5zdHJpbmdbOnN0YXJ0XSttYXRjaC5zdHJpbmdbZW5kOl0KKworSEVBREVSX1RPS0VOX1JFID0gICAgICAgIHJlLmNvbXBpbGUociJeXHMqKFtePVxzOyxdKykiKQorSEVBREVSX1FVT1RFRF9WQUxVRV9SRSA9IHJlLmNvbXBpbGUociJeXHMqPVxzKlwiKFteXCJcXF0qKD86XFwuW15cIlxcXSopKilcIiIpCitIRUFERVJfVkFMVUVfUkUgPSAgICAgICAgcmUuY29tcGlsZShyIl5ccyo9XHMqKFteXHM7LF0qKSIpCitIRUFERVJfRVNDQVBFX1JFID0gcmUuY29tcGlsZShyIlxcKC4pIikKK2RlZiBzcGxpdF9oZWFkZXJfd29yZHMoaGVhZGVyX3ZhbHVlcyk6CisgICAgciIiIlBhcnNlIGhlYWRlciB2YWx1ZXMgaW50byBhIGxpc3Qgb2YgbGlzdHMgY29udGFpbmluZyBrZXksdmFsdWUgcGFpcnMuCisKKyAgICBUaGUgZnVuY3Rpb24ga25vd3MgaG93IHRvIGRlYWwgd2l0aCAiLCIsICI7IiBhbmQgIj0iIGFzIHdlbGwgYXMgcXVvdGVkCisgICAgdmFsdWVzIGFmdGVyICI9Ii4gIEEgbGlzdCBvZiBzcGFjZSBzZXBhcmF0ZWQgdG9rZW5zIGFyZSBwYXJzZWQgYXMgaWYgdGhleQorICAgIHdlcmUgc2VwYXJhdGVkIGJ5ICI7Ii4KKworICAgIElmIHRoZSBoZWFkZXJfdmFsdWVzIHBhc3NlZCBhcyBhcmd1bWVudCBjb250YWlucyBtdWx0aXBsZSB2YWx1ZXMsIHRoZW4gdGhleQorICAgIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhIHNpbmdsZSB2YWx1ZSBzZXBhcmF0ZWQgYnkgY29tbWEgIiwiLgorCisgICAgVGhpcyBtZWFucyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBwYXJzaW5nIGhlYWRlciBmaWVsZHMgdGhhdAorICAgIGZvbGxvdyB0aGlzIHN5bnRheCAoQk5GIGFzIGZyb20gdGhlIEhUVFAvMS4xIHNwZWNpZmljYXRpb24sIGJ1dCB3ZSByZWxheAorICAgIHRoZSByZXF1aXJlbWVudCBmb3IgdG9rZW5zKS4KKworICAgICAgaGVhZGVycyAgICAgICAgICAgPSAjaGVhZGVyCisgICAgICBoZWFkZXIgICAgICAgICAgICA9ICh0b2tlbiB8IHBhcmFtZXRlcikgKiggWyI7Il0gKHRva2VuIHwgcGFyYW1ldGVyKSkKKworICAgICAgdG9rZW4gICAgICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPgorICAgICAgc2VwYXJhdG9ycyAgICAgICAgPSAiKCIgfCAiKSIgfCAiPCIgfCAiPiIgfCAiQCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgIiwiIHwgIjsiIHwgIjoiIHwgIlwiIHwgPCI+CisgICAgICAgICAgICAgICAgICAgICAgICB8ICIvIiB8ICJbIiB8ICJdIiB8ICI/IiB8ICI9IgorICAgICAgICAgICAgICAgICAgICAgICAgfCAieyIgfCAifSIgfCBTUCB8IEhUCisKKyAgICAgIHF1b3RlZC1zdHJpbmcgICAgID0gKCA8Ij4gKihxZHRleHQgfCBxdW90ZWQtcGFpciApIDwiPiApCisgICAgICBxZHRleHQgICAgICAgICAgICA9IDxhbnkgVEVYVCBleGNlcHQgPCI+PgorICAgICAgcXVvdGVkLXBhaXIgICAgICAgPSAiXCIgQ0hBUgorCisgICAgICBwYXJhbWV0ZXIgICAgICAgICA9IGF0dHJpYnV0ZSAiPSIgdmFsdWUKKyAgICAgIGF0dHJpYnV0ZSAgICAgICAgID0gdG9rZW4KKyAgICAgIHZhbHVlICAgICAgICAgICAgID0gdG9rZW4gfCBxdW90ZWQtc3RyaW5nCisKKyAgICBFYWNoIGhlYWRlciBpcyByZXByZXNlbnRlZCBieSBhIGxpc3Qgb2Yga2V5L3ZhbHVlIHBhaXJzLiAgVGhlIHZhbHVlIGZvciBhCisgICAgc2ltcGxlIHRva2VuIChub3QgcGFydCBvZiBhIHBhcmFtZXRlcikgaXMgTm9uZS4gIFN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0CisgICAgaGVhZGVycyB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBwYXJzZWQgYXMgeW91IHdvdWxkIHdhbnQuCisKKyAgICBUaGlzIGlzIGVhc2llciB0byBkZXNjcmliZSB3aXRoIHNvbWUgZXhhbXBsZXM6CisKKyAgICA+Pj4gc3BsaXRfaGVhZGVyX3dvcmRzKFsnZm9vPSJiYXIiOyBwb3J0PSI4MCw4MSI7IGRpc2NhcmQsIGJhcj1iYXonXSkKKyAgICBbWygnZm9vJywgJ2JhcicpLCAoJ3BvcnQnLCAnODAsODEnKSwgKCdkaXNjYXJkJywgTm9uZSldLCBbKCdiYXInLCAnYmF6JyldXQorICAgID4+PiBzcGxpdF9oZWFkZXJfd29yZHMoWyd0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiJ10pCisgICAgW1soJ3RleHQvaHRtbCcsIE5vbmUpLCAoJ2NoYXJzZXQnLCAnaXNvLTg4NTktMScpXV0KKyAgICA+Pj4gc3BsaXRfaGVhZGVyX3dvcmRzKFtyJ0Jhc2ljIHJlYWxtPSJcImZvb1xiYXJcIiInXSkKKyAgICBbWygnQmFzaWMnLCBOb25lKSwgKCdyZWFsbScsICciZm9vYmFyIicpXV0KKworICAgICIiIgorICAgIGFzc2VydCB0eXBlKGhlYWRlcl92YWx1ZXMpIG5vdCBpbiBTdHJpbmdUeXBlcworICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIHRleHQgaW4gaGVhZGVyX3ZhbHVlczoKKyAgICAgICAgb3JpZ190ZXh0ID0gdGV4dAorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIHdoaWxlIHRleHQ6CisgICAgICAgICAgICBtID0gSEVBREVSX1RPS0VOX1JFLnNlYXJjaCh0ZXh0KQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdW5tYXRjaGVkKG0pCisgICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBtID0gSEVBREVSX1FVT1RFRF9WQUxVRV9SRS5zZWFyY2godGV4dCkKKyAgICAgICAgICAgICAgICBpZiBtOiAgIyBxdW90ZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHVubWF0Y2hlZChtKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBIRUFERVJfRVNDQVBFX1JFLnN1YihyIlwxIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbSA9IEhFQURFUl9WQUxVRV9SRS5zZWFyY2godGV4dCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbTogICMgdW5xdW90ZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB1bm1hdGNoZWQobSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBubyB2YWx1ZSwgYSBsb25lIHRva2VuCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBwYWlycy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGVsaWYgdGV4dC5sc3RyaXAoKS5zdGFydHN3aXRoKCIsIik6CisgICAgICAgICAgICAgICAgIyBjb25jYXRlbmF0ZWQgaGVhZGVycywgYXMgcGVyIFJGQyAyNjE2IHNlY3Rpb24gNC4yCisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQubHN0cmlwKClbMTpdCisgICAgICAgICAgICAgICAgaWYgcGFpcnM6IHJlc3VsdC5hcHBlbmQocGFpcnMpCisgICAgICAgICAgICAgICAgcGFpcnMgPSBbXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHNraXAganVuaworICAgICAgICAgICAgICAgIG5vbl9qdW5rLCBucl9qdW5rX2NoYXJzID0gcmUuc3VibigiXls9XHM7XSoiLCAiIiwgdGV4dCkKKyAgICAgICAgICAgICAgICBhc3NlcnQgbnJfanVua19jaGFycyA+IDAsICgKKyAgICAgICAgICAgICAgICAgICAgInNwbGl0X2hlYWRlcl93b3JkcyBidWc6ICclcycsICclcycsICVzIiAlCisgICAgICAgICAgICAgICAgICAgIChvcmlnX3RleHQsIHRleHQsIHBhaXJzKSkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gbm9uX2p1bmsKKyAgICAgICAgaWYgcGFpcnM6IHJlc3VsdC5hcHBlbmQocGFpcnMpCisgICAgcmV0dXJuIHJlc3VsdAorCitIRUFERVJfSk9JTl9FU0NBUEVfUkUgPSByZS5jb21waWxlKHIiKFtcIlxcXSkiKQorZGVmIGpvaW5faGVhZGVyX3dvcmRzKGxpc3RzKToKKyAgICAiIiJEbyB0aGUgaW52ZXJzZSAoYWxtb3N0KSBvZiB0aGUgY29udmVyc2lvbiBkb25lIGJ5IHNwbGl0X2hlYWRlcl93b3Jkcy4KKworICAgIFRha2VzIGEgbGlzdCBvZiBsaXN0cyBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgYW5kIHByb2R1Y2VzIGEgc2luZ2xlIGhlYWRlcgorICAgIHZhbHVlLiAgQXR0cmlidXRlIHZhbHVlcyBhcmUgcXVvdGVkIGlmIG5lZWRlZC4KKworICAgID4+PiBqb2luX2hlYWRlcl93b3JkcyhbWygidGV4dC9wbGFpbiIsIE5vbmUpLCAoImNoYXJzZXQiLCAiaXNvLTg4NTkvMSIpXV0pCisgICAgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LzEiJworICAgID4+PiBqb2luX2hlYWRlcl93b3JkcyhbWygidGV4dC9wbGFpbiIsIE5vbmUpXSwgWygiY2hhcnNldCIsICJpc28tODg1OS8xIildXSkKKyAgICAndGV4dC9wbGFpbiwgY2hhcnNldD0iaXNvLTg4NTkvMSInCisKKyAgICAiIiIKKyAgICBoZWFkZXJzID0gW10KKyAgICBmb3IgcGFpcnMgaW4gbGlzdHM6CisgICAgICAgIGF0dHIgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiBwYWlyczoKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlLnNlYXJjaChyIl5cdyskIiwgdik6CisgICAgICAgICAgICAgICAgICAgIHYgPSBIRUFERVJfSk9JTl9FU0NBUEVfUkUuc3ViKHIiXFxcMSIsIHYpICAjIGVzY2FwZSAiIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHYgPSAnIiVzIicgJSB2CisgICAgICAgICAgICAgICAgayA9ICIlcz0lcyIgJSAoaywgdikKKyAgICAgICAgICAgIGF0dHIuYXBwZW5kKGspCisgICAgICAgIGlmIGF0dHI6IGhlYWRlcnMuYXBwZW5kKCI7ICIuam9pbihhdHRyKSkKKyAgICByZXR1cm4gIiwgIi5qb2luKGhlYWRlcnMpCisKK2RlZiBwYXJzZV9uc19oZWFkZXJzKG5zX2hlYWRlcnMpOgorICAgICIiIkFkLWhvYyBwYXJzZXIgZm9yIE5ldHNjYXBlIHByb3RvY29sIGNvb2tpZS1hdHRyaWJ1dGVzLgorCisgICAgVGhlIG9sZCBOZXRzY2FwZSBjb29raWUgZm9ybWF0IGZvciBTZXQtQ29va2llIGNhbiBmb3IgaW5zdGFuY2UgY29udGFpbgorICAgIGFuIHVucXVvdGVkICIsIiBpbiB0aGUgZXhwaXJlcyBmaWVsZCwgc28gd2UgaGF2ZSB0byB1c2UgdGhpcyBhZC1ob2MKKyAgICBwYXJzZXIgaW5zdGVhZCBvZiBzcGxpdF9oZWFkZXJfd29yZHMuCisKKyAgICBYWFggVGhpcyBtYXkgbm90IG1ha2UgdGhlIGJlc3QgcG9zc2libGUgZWZmb3J0IHRvIHBhcnNlIGFsbCB0aGUgY3JhcAorICAgIHRoYXQgTmV0c2NhcGUgQ29va2llIGhlYWRlcnMgY29udGFpbi4gIFJvbmFsZCBUc2NoYWxhcidzIEhUVFBDbGllbnQKKyAgICBwYXJzZXIgaXMgcHJvYmFibHkgYmV0dGVyLCBzbyBjb3VsZCBkbyB3b3JzZSB0aGFuIGZvbGxvd2luZyB0aGF0IGlmCisgICAgdGhpcyBldmVyIGdpdmVzIGFueSB0cm91YmxlLgorCisgICAgQ3VycmVudGx5LCB0aGlzIGlzIGFsc28gdXNlZCBmb3IgcGFyc2luZyBSRkMgMjEwOSBjb29raWVzLgorCisgICAgIiIiCisgICAga25vd25fYXR0cnMgPSAoImV4cGlyZXMiLCAiZG9tYWluIiwgInBhdGgiLCAic2VjdXJlIiwKKyAgICAgICAgICAgICAgICAgICAjIFJGQyAyMTA5IGF0dHJzIChtYXkgdHVybiB1cCBpbiBOZXRzY2FwZSBjb29raWVzLCB0b28pCisgICAgICAgICAgICAgICAgICAgInBvcnQiLCAibWF4LWFnZSIpCisKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBuc19oZWFkZXIgaW4gbnNfaGVhZGVyczoKKyAgICAgICAgcGFpcnMgPSBbXQorICAgICAgICB2ZXJzaW9uX3NldCA9IEZhbHNlCisgICAgICAgIGZvciBwYXJhbSBpbiByZS5zcGxpdChyIjtccyoiLCBuc19oZWFkZXIpOgorICAgICAgICAgICAgcGFyYW0gPSBwYXJhbS5yc3RyaXAoKQorICAgICAgICAgICAgaWYgcGFyYW0gPT0gIiI6IGNvbnRpbnVlCisgICAgICAgICAgICBpZiAiPSIgbm90IGluIHBhcmFtOgorICAgICAgICAgICAgICAgIGlmIHBhcmFtLmxvd2VyKCkgaW4ga25vd25fYXR0cnM6CisgICAgICAgICAgICAgICAgICAgIGssIHYgPSBwYXJhbSwgTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgY29va2llIHdpdGggbWlzc2luZyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBrLCB2ID0gcGFyYW0sIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaywgdiA9IHJlLnNwbGl0KHIiXHMqPVxzKiIsIHBhcmFtLCAxKQorICAgICAgICAgICAgICAgIGsgPSBrLmxzdHJpcCgpCisgICAgICAgICAgICBpZiBrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgbGMgaW4ga25vd25fYXR0cnM6CisgICAgICAgICAgICAgICAgICAgIGsgPSBsYworICAgICAgICAgICAgICAgIGlmIGsgPT0gInZlcnNpb24iOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gUkZDIDIxMDkgY29va2llLiAgV2lsbCBiZSB0cmVhdGVkIGFzIFJGQyAyOTY1CisgICAgICAgICAgICAgICAgICAgICMgY29va2llIGluIHJlc3Qgb2YgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgIyBQcm9iYWJseSBpdCBzaG91bGQgYmUgcGFyc2VkIHdpdGggc3BsaXRfaGVhZGVyX3dvcmRzLCBidXQKKyAgICAgICAgICAgICAgICAgICAgIyB0aGF0J3MgdG9vIG11Y2ggaGFzc2xlLgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX3NldCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBrID09ICJleHBpcmVzIjoKKyAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IGV4cGlyZXMgZGF0ZSB0byBzZWNvbmRzIHNpbmNlIGVwb2NoCisgICAgICAgICAgICAgICAgICAgIGlmIHYuc3RhcnRzd2l0aCgnIicpOiB2ID0gdlsxOl0KKyAgICAgICAgICAgICAgICAgICAgaWYgdi5lbmRzd2l0aCgnIicpOiB2ID0gdls6LTFdCisgICAgICAgICAgICAgICAgICAgIHYgPSBodHRwMnRpbWUodikgICMgTm9uZSBpZiBpbnZhbGlkCisgICAgICAgICAgICBwYWlycy5hcHBlbmQoKGssIHYpKQorCisgICAgICAgIGlmIHBhaXJzOgorICAgICAgICAgICAgaWYgbm90IHZlcnNpb25fc2V0OgorICAgICAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoInZlcnNpb24iLCAiMCIpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwYWlycykKKworICAgIHJldHVybiByZXN1bHQKKworCitJUFY0X1JFID0gcmUuY29tcGlsZShyIlwuXGQrJCIpCitkZWYgaXNfSEROKHRleHQpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRleHQgaXMgYSBob3N0IGRvbWFpbiBuYW1lLiIiIgorICAgICMgWFhYCisgICAgIyBUaGlzIG1heSB3ZWxsIGJlIHdyb25nLiAgV2hpY2ggUkZDIGlzIEhETiBkZWZpbmVkIGluLCBpZiBhbnkgKGZvcgorICAgICMgIHRoZSBwdXJwb3NlcyBvZiBSRkMgMjk2NSk/CisgICAgIyBGb3IgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdoYXQgYWJvdXQgSVB2Nj8gIFJlbWVtYmVyIHRvIGxvb2sKKyAgICAjICBhdCBvdGhlciB1c2VzIG9mIElQVjRfUkUgYWxzbywgaWYgY2hhbmdlIHRoaXMuCisgICAgaWYgSVBWNF9SRS5zZWFyY2godGV4dCk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIHRleHQgPT0gIiI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIHRleHRbMF0gPT0gIi4iIG9yIHRleHRbLTFdID09ICIuIjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIGRvbWFpbl9tYXRjaChBLCBCKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBkb21haW4gQSBkb21haW4tbWF0Y2hlcyBkb21haW4gQiwgYWNjb3JkaW5nIHRvIFJGQyAyOTY1LgorCisgICAgQSBhbmQgQiBtYXkgYmUgaG9zdCBkb21haW4gbmFtZXMgb3IgSVAgYWRkcmVzc2VzLgorCisgICAgUkZDIDI5NjUsIHNlY3Rpb24gMToKKworICAgIEhvc3QgbmFtZXMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYW4gSVAgYWRkcmVzcyBvciBhIEhETiBzdHJpbmcuCisgICAgU29tZXRpbWVzIHdlIGNvbXBhcmUgb25lIGhvc3QgbmFtZSB3aXRoIGFub3RoZXIuICAoU3VjaCBjb21wYXJpc29ucyBTSEFMTAorICAgIGJlIGNhc2UtaW5zZW5zaXRpdmUuKSAgSG9zdCBBJ3MgbmFtZSBkb21haW4tbWF0Y2hlcyBob3N0IEIncyBpZgorCisgICAgICAgICAqICB0aGVpciBob3N0IG5hbWUgc3RyaW5ncyBzdHJpbmctY29tcGFyZSBlcXVhbDsgb3IKKworICAgICAgICAgKiBBIGlzIGEgSEROIHN0cmluZyBhbmQgaGFzIHRoZSBmb3JtIE5CLCB3aGVyZSBOIGlzIGEgbm9uLWVtcHR5CisgICAgICAgICAgICBuYW1lIHN0cmluZywgQiBoYXMgdGhlIGZvcm0gLkInLCBhbmQgQicgaXMgYSBIRE4gc3RyaW5nLiAgKFNvLAorICAgICAgICAgICAgeC55LmNvbSBkb21haW4tbWF0Y2hlcyAuWS5jb20gYnV0IG5vdCBZLmNvbS4pCisKKyAgICBOb3RlIHRoYXQgZG9tYWluLW1hdGNoIGlzIG5vdCBhIGNvbW11dGF0aXZlIG9wZXJhdGlvbjogYS5iLmMuY29tCisgICAgZG9tYWluLW1hdGNoZXMgLmMuY29tLCBidXQgbm90IHRoZSByZXZlcnNlLgorCisgICAgIiIiCisgICAgIyBOb3RlIHRoYXQsIGlmIEEgb3IgQiBhcmUgSVAgYWRkcmVzc2VzLCB0aGUgb25seSByZWxldmFudCBwYXJ0IG9mIHRoZQorICAgICMgZGVmaW5pdGlvbiBvZiB0aGUgZG9tYWluLW1hdGNoIGFsZ29yaXRobSBpcyB0aGUgZGlyZWN0IHN0cmluZy1jb21wYXJlLgorICAgIEEgPSBBLmxvd2VyKCkKKyAgICBCID0gQi5sb3dlcigpCisgICAgaWYgQSA9PSBCOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBpc19IRE4oQSk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGkgPSBBLnJmaW5kKEIpCisgICAgaWYgaSA9PSAtMSBvciBpID09IDA6CisgICAgICAgICMgQSBkb2VzIG5vdCBoYXZlIGZvcm0gTkIsIG9yIE4gaXMgdGhlIGVtcHR5IHN0cmluZworICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3QgQi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG5vdCBpc19IRE4oQlsxOl0pOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgbGliZXJhbF9pc19IRE4odGV4dCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGV4dCBpcyBhIHNvcnQtb2YtbGlrZSBhIGhvc3QgZG9tYWluIG5hbWUuCisKKyAgICBGb3IgYWNjZXB0aW5nL2Jsb2NraW5nIGRvbWFpbnMuCisKKyAgICAiIiIKKyAgICBpZiBJUFY0X1JFLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIHVzZXJfZG9tYWluX21hdGNoKEEsIEIpOgorICAgICIiIkZvciBibG9ja2luZy9hY2NlcHRpbmcgZG9tYWlucy4KKworICAgIEEgYW5kIEIgbWF5IGJlIGhvc3QgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy4KKworICAgICIiIgorICAgIEEgPSBBLmxvd2VyKCkKKyAgICBCID0gQi5sb3dlcigpCisgICAgaWYgbm90IChsaWJlcmFsX2lzX0hETihBKSBhbmQgbGliZXJhbF9pc19IRE4oQikpOgorICAgICAgICBpZiBBID09IEI6CisgICAgICAgICAgICAjIGVxdWFsIElQIGFkZHJlc3NlcworICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaW5pdGlhbF9kb3QgPSBCLnN0YXJ0c3dpdGgoIi4iKQorICAgIGlmIGluaXRpYWxfZG90IGFuZCBBLmVuZHN3aXRoKEIpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBpbml0aWFsX2RvdCBhbmQgQSA9PSBCOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitjdXRfcG9ydF9yZSA9IHJlLmNvbXBpbGUociI6XGQrJCIpCitkZWYgcmVxdWVzdF9ob3N0KHJlcXVlc3QpOgorICAgICIiIlJldHVybiByZXF1ZXN0LWhvc3QsIGFzIGRlZmluZWQgYnkgUkZDIDI5NjUuCisKKyAgICBWYXJpYXRpb24gZnJvbSBSRkM6IHJldHVybmVkIHZhbHVlIGlzIGxvd2VyY2FzZWQsIGZvciBjb252ZW5pZW50CisgICAgY29tcGFyaXNvbi4KKworICAgICIiIgorICAgIHVybCA9IHJlcXVlc3QuZ2V0X2Z1bGxfdXJsKCkKKyAgICBob3N0ID0gdXJscGFyc2UudXJscGFyc2UodXJsKVsxXQorICAgIGlmIGhvc3QgPT0gIiI6CisgICAgICAgIGhvc3QgPSByZXF1ZXN0LmdldF9oZWFkZXIoIkhvc3QiLCAiIikKKworICAgICMgcmVtb3ZlIHBvcnQsIGlmIHByZXNlbnQKKyAgICBob3N0ID0gY3V0X3BvcnRfcmUuc3ViKCIiLCBob3N0LCAxKQorICAgIHJldHVybiBob3N0Lmxvd2VyKCkKKworZGVmIGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCk6CisgICAgIiIiUmV0dXJuIGEgdHVwbGUgKHJlcXVlc3QtaG9zdCwgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lKS4KKworICAgIEFzIGRlZmluZWQgYnkgUkZDIDI5NjUsIGV4Y2VwdCBib3RoIGFyZSBsb3dlcmNhc2VkLgorCisgICAgIiIiCisgICAgZXJobiA9IHJlcV9ob3N0ID0gcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgaWYgcmVxX2hvc3QuZmluZCgiLiIpID09IC0xIGFuZCBub3QgSVBWNF9SRS5zZWFyY2gocmVxX2hvc3QpOgorICAgICAgICBlcmhuID0gcmVxX2hvc3QgKyAiLmxvY2FsIgorICAgIHJldHVybiByZXFfaG9zdCwgZXJobgorCitkZWYgcmVxdWVzdF9wYXRoKHJlcXVlc3QpOgorICAgICIiInJlcXVlc3QtVVJJLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LiIiIgorICAgIHVybCA9IHJlcXVlc3QuZ2V0X2Z1bGxfdXJsKCkKKyAgICAjc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtZXRlcnMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICNyZXFfcGF0aCA9IGVzY2FwZV9wYXRoKCIiLmpvaW4odXJscGFyc2UudXJscGFyc2UodXJsKVsyOl0pKQorICAgIHBhdGgsIHBhcmFtZXRlcnMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJscGFyc2UodXJsKVsyOl0KKyAgICBpZiBwYXJhbWV0ZXJzOgorICAgICAgICBwYXRoID0gIiVzOyVzIiAlIChwYXRoLCBwYXJhbWV0ZXJzKQorICAgIHBhdGggPSBlc2NhcGVfcGF0aChwYXRoKQorICAgIHJlcV9wYXRoID0gdXJscGFyc2UudXJsdW5wYXJzZSgoIiIsICIiLCBwYXRoLCAiIiwgcXVlcnksIGZyYWcpKQorICAgIGlmIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICMgZml4IGJhZCBSRkMgMjM5NiBhYnNvbHV0ZVVSSQorICAgICAgICByZXFfcGF0aCA9ICIvIityZXFfcGF0aAorICAgIHJldHVybiByZXFfcGF0aAorCitkZWYgcmVxdWVzdF9wb3J0KHJlcXVlc3QpOgorICAgIGhvc3QgPSByZXF1ZXN0LmdldF9ob3N0KCkKKyAgICBpID0gaG9zdC5maW5kKCc6JykKKyAgICBpZiBpID49IDA6CisgICAgICAgIHBvcnQgPSBob3N0W2krMTpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGludChwb3J0KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGRlYnVnKCJub25udW1lcmljIHBvcnQ6ICclcyciLCBwb3J0KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICBwb3J0ID0gREVGQVVMVF9IVFRQX1BPUlQKKyAgICByZXR1cm4gcG9ydAorCisjIENoYXJhY3RlcnMgaW4gYWRkaXRpb24gdG8gQS1aLCBhLXosIDAtOSwgJ18nLCAnLicsIGFuZCAnLScgdGhhdCBkb24ndAorIyBuZWVkIHRvIGJlIGVzY2FwZWQgdG8gZm9ybSBhIHZhbGlkIEhUVFAgVVJMIChSRkNzIDIzOTYgYW5kIDE3MzgpLgorSFRUUF9QQVRIX1NBRkUgPSAiJS87OkAmPSskLCF+KicoKSIKK0VTQ0FQRURfQ0hBUl9SRSA9IHJlLmNvbXBpbGUociIlKFswLTlhLWZBLUZdWzAtOWEtZkEtRl0pIikKK2RlZiB1cHBlcmNhc2VfZXNjYXBlZF9jaGFyKG1hdGNoKToKKyAgICByZXR1cm4gIiUlJXMiICUgbWF0Y2guZ3JvdXAoMSkudXBwZXIoKQorZGVmIGVzY2FwZV9wYXRoKHBhdGgpOgorICAgICIiIkVzY2FwZSBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzIGluIEhUVFAgVVJMLCBhbmQgdXBwZXJjYXNlIGFsbCBlc2NhcGVzLiIiIgorICAgICMgVGhlcmUncyBubyBrbm93aW5nIHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHdhcyB1c2VkIHRvIGNyZWF0ZSBVUkxzCisgICAgIyBjb250YWluaW5nICUtZXNjYXBlcywgYnV0IHNpbmNlIHdlIGhhdmUgdG8gcGljayBvbmUgdG8gZXNjYXBlIGludmFsaWQKKyAgICAjIHBhdGggY2hhcmFjdGVycywgd2UgcGljayBVVEYtOCwgYXMgcmVjb21tZW5kZWQgaW4gdGhlIEhUTUwgNC4wCisgICAgIyBzcGVjaWZpY2F0aW9uOgorICAgICMgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9hcHBlbmRpeC9ub3Rlcy5odG1sI2gtQi4yLjEKKyAgICAjIEFuZCBoZXJlLCBraW5kIG9mOiBkcmFmdC1maWVsZGluZy11cmktcmZjMjM5NmJpcy0wMworICAgICMgKEFuZCBpbiBkcmFmdCBJUkkgc3BlY2lmaWNhdGlvbjogZHJhZnQtZHVlcnN0LWlyaS0wNSkKKyAgICAjIChBbmQgaGVyZSwgZm9yIG5ldyBVUkkgc2NoZW1lczogUkZDIDI3MTgpCisgICAgaWYgaXNpbnN0YW5jZShwYXRoLCB0eXBlcy5Vbmljb2RlVHlwZSk6CisgICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgidXRmLTgiKQorICAgIHBhdGggPSB1cmxsaWIucXVvdGUocGF0aCwgSFRUUF9QQVRIX1NBRkUpCisgICAgcGF0aCA9IEVTQ0FQRURfQ0hBUl9SRS5zdWIodXBwZXJjYXNlX2VzY2FwZWRfY2hhciwgcGF0aCkKKyAgICByZXR1cm4gcGF0aAorCitkZWYgcmVhY2goaCk6CisgICAgIiIiUmV0dXJuIHJlYWNoIG9mIGhvc3QgaCwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NSwgc2VjdGlvbiAxLgorCisgICAgVGhlIHJlYWNoIFIgb2YgYSBob3N0IG5hbWUgSCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKyAgICAgICAqICBJZgorCisgICAgICAgICAgLSAgSCBpcyB0aGUgaG9zdCBkb21haW4gbmFtZSBvZiBhIGhvc3Q7IGFuZCwKKworICAgICAgICAgIC0gIEggaGFzIHRoZSBmb3JtIEEuQjsgYW5kCisKKyAgICAgICAgICAtICBBIGhhcyBubyBlbWJlZGRlZCAodGhhdCBpcywgaW50ZXJpb3IpIGRvdHM7IGFuZAorCisgICAgICAgICAgLSAgQiBoYXMgYXQgbGVhc3Qgb25lIGVtYmVkZGVkIGRvdCwgb3IgQiBpcyB0aGUgc3RyaW5nICJsb2NhbCIuCisgICAgICAgICAgICAgdGhlbiB0aGUgcmVhY2ggb2YgSCBpcyAuQi4KKworICAgICAgICogIE90aGVyd2lzZSwgdGhlIHJlYWNoIG9mIEggaXMgSC4KKworICAgID4+PiByZWFjaCgid3d3LmFjbWUuY29tIikKKyAgICAnLmFjbWUuY29tJworICAgID4+PiByZWFjaCgiYWNtZS5jb20iKQorICAgICdhY21lLmNvbScKKyAgICA+Pj4gcmVhY2goImFjbWUubG9jYWwiKQorICAgICcubG9jYWwnCisKKyAgICAiIiIKKyAgICBpID0gaC5maW5kKCIuIikKKyAgICBpZiBpID49IDA6CisgICAgICAgICNhID0gaFs6aV0gICMgdGhpcyBsaW5lIGlzIG9ubHkgaGVyZSB0byBzaG93IHdoYXQgYSBpcworICAgICAgICBiID0gaFtpKzE6XQorICAgICAgICBpID0gYi5maW5kKCIuIikKKyAgICAgICAgaWYgaXNfSEROKGgpIGFuZCAoaSA+PSAwIG9yIGIgPT0gImxvY2FsIik6CisgICAgICAgICAgICByZXR1cm4gIi4iK2IKKyAgICByZXR1cm4gaAorCitkZWYgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgIiIiCisKKyAgICBSRkMgMjk2NSwgc2VjdGlvbiAzLjMuNjoKKworICAgICAgICBBbiB1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24gaXMgdG8gYSB0aGlyZC1wYXJ0eSBob3N0IGlmIGl0cyByZXF1ZXN0LQorICAgICAgICBob3N0IFUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZSByZWFjaCBSIG9mIHRoZSByZXF1ZXN0LWhvc3QgTyBpbiB0aGUKKyAgICAgICAgb3JpZ2luIHRyYW5zYWN0aW9uLgorCisgICAgIiIiCisgICAgcmVxX2hvc3QgPSByZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICBpZiBub3QgZG9tYWluX21hdGNoKHJlcV9ob3N0LCByZWFjaChyZXF1ZXN0LmdldF9vcmlnaW5fcmVxX2hvc3QoKSkpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIENvb2tpZToKKyAgICAiIiJIVFRQIENvb2tpZS4KKworICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBib3RoIE5ldHNjYXBlIGFuZCBSRkMgMjk2NSBjb29raWVzLgorCisgICAgVGhpcyBpcyBkZWxpYmVyYXRlbHkgYSB2ZXJ5IHNpbXBsZSBjbGFzcy4gIEl0IGp1c3QgaG9sZHMgYXR0cmlidXRlcy4gIEl0J3MKKyAgICBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgQ29va2llIGluc3RhbmNlcyB0aGF0IGRvbid0IGNvbXBseSB3aXRoIHRoZSBjb29raWUKKyAgICBzdGFuZGFyZHMuICBDb29raWVKYXIubWFrZV9jb29raWVzIGlzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBDb29raWUKKyAgICBvYmplY3RzIC0tIGl0IGRlYWxzIHdpdGggY29va2llIHBhcnNpbmcsIHN1cHBseWluZyBkZWZhdWx0cywgYW5kCisgICAgbm9ybWFsaXNpbmcgdG8gdGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhpcyBjbGFzcy4gIENvb2tpZVBvbGljeSBpcworICAgIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGVtIHRvIHNlZSB3aGV0aGVyIHRoZXkgc2hvdWxkIGJlIGFjY2VwdGVkIGZyb20KKyAgICBhbmQgcmV0dXJuZWQgdG8gdGhlIHNlcnZlci4KKworICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgaGVhZGVycywgYnV0IHVuc3BlY2lmaWVkICgiUG9ydCIKKyAgICByYXRoZXIgdGhhbiJQb3J0PTgwIiwgZm9yIGV4YW1wbGUpOyBpZiB0aGlzIGlzIHRoZSBjYXNlLCBwb3J0IGlzIE5vbmUuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uLCBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgcG9ydCwgcG9ydF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgZG9tYWluX2luaXRpYWxfZG90LAorICAgICAgICAgICAgICAgICBwYXRoLCBwYXRoX3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgc2VjdXJlLAorICAgICAgICAgICAgICAgICBleHBpcmVzLAorICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICBjb21tZW50LAorICAgICAgICAgICAgICAgICBjb21tZW50X3VybCwKKyAgICAgICAgICAgICAgICAgcmVzdCk6CisKKyAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZTogdmVyc2lvbiA9IGludCh2ZXJzaW9uKQorICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOiBleHBpcmVzID0gaW50KGV4cGlyZXMpCisgICAgICAgIGlmIHBvcnQgaXMgTm9uZSBhbmQgcG9ydF9zcGVjaWZpZWQgaXMgVHJ1ZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIHBvcnQgaXMgTm9uZSwgcG9ydF9zcGVjaWZpZWQgbXVzdCBiZSBmYWxzZSIpCisKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYucG9ydF9zcGVjaWZpZWQgPSBwb3J0X3NwZWNpZmllZAorICAgICAgICAjIG5vcm1hbGlzZSBjYXNlLCBhcyBwZXIgUkZDIDI5NjUgc2VjdGlvbiAzLjMuMworICAgICAgICBzZWxmLmRvbWFpbiA9IGRvbWFpbi5sb3dlcigpCisgICAgICAgIHNlbGYuZG9tYWluX3NwZWNpZmllZCA9IGRvbWFpbl9zcGVjaWZpZWQKKyAgICAgICAgIyBTaWdoLiAgV2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhlIGRvbWFpbiBnaXZlbiBpbiB0aGUKKyAgICAgICAgIyBjb29raWUtYXR0cmlidXRlIGhhZCBhbiBpbml0aWFsIGRvdCwgaW4gb3JkZXIgdG8gZm9sbG93IFJGQyAyOTY1CisgICAgICAgICMgKGFzIGNsYXJpZmllZCBpbiBkcmFmdCBlcnJhdGEpLiAgTmVlZGVkIGZvciB0aGUgcmV0dXJuZWQgJERvbWFpbgorICAgICAgICAjIHZhbHVlLgorICAgICAgICBzZWxmLmRvbWFpbl9pbml0aWFsX2RvdCA9IGRvbWFpbl9pbml0aWFsX2RvdAorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYucGF0aF9zcGVjaWZpZWQgPSBwYXRoX3NwZWNpZmllZAorICAgICAgICBzZWxmLnNlY3VyZSA9IHNlY3VyZQorICAgICAgICBzZWxmLmV4cGlyZXMgPSBleHBpcmVzCisgICAgICAgIHNlbGYuZGlzY2FyZCA9IGRpc2NhcmQKKyAgICAgICAgc2VsZi5jb21tZW50ID0gY29tbWVudAorICAgICAgICBzZWxmLmNvbW1lbnRfdXJsID0gY29tbWVudF91cmwKKworICAgICAgICBzZWxmLl9yZXN0ID0gY29weS5jb3B5KHJlc3QpCisKKyAgICBkZWYgaGFzX25vbnN0YW5kYXJkX2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX3Jlc3QKKyAgICBkZWYgZ2V0X25vbnN0YW5kYXJkX2F0dHIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3QuZ2V0KG5hbWUsIGRlZmF1bHQpCisgICAgZGVmIHNldF9ub25zdGFuZGFyZF9hdHRyKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fcmVzdFtuYW1lXSA9IHZhbHVlCisKKyAgICBkZWYgaXNfZXhwaXJlZChzZWxmLCBub3c9Tm9uZSk6CisgICAgICAgIGlmIG5vdyBpcyBOb25lOiBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBpZiAoc2VsZi5leHBpcmVzIGlzIG5vdCBOb25lKSBhbmQgKHNlbGYuZXhwaXJlcyA8PSBub3cpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0IGlzIE5vbmU6IHAgPSAiIgorICAgICAgICBlbHNlOiBwID0gIjoiK3NlbGYucG9ydAorICAgICAgICBsaW1pdCA9IHNlbGYuZG9tYWluICsgcCArIHNlbGYucGF0aAorICAgICAgICBpZiBzZWxmLnZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmFtZXZhbHVlID0gIiVzPSVzIiAlIChzZWxmLm5hbWUsIHNlbGYudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1ldmFsdWUgPSBzZWxmLm5hbWUKKyAgICAgICAgcmV0dXJuICI8Q29va2llICVzIGZvciAlcz4iICUgKG5hbWV2YWx1ZSwgbGltaXQpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBbInZlcnNpb24iLCAibmFtZSIsICJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICJwb3J0X3NwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAiZG9tYWluIiwgImRvbWFpbl9zcGVjaWZpZWQiLCAiZG9tYWluX2luaXRpYWxfZG90IiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXRoIiwgInBhdGhfc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICJzZWN1cmUiLCAiZXhwaXJlcyIsICJkaXNjYXJkIiwgImNvbW1lbnQiLCAiY29tbWVudF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGF0dHIgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCisgICAgICAgICAgICBhcmdzLmFwcGVuZCgiJXM9JXMiICUgKG5hbWUsIHJlcHIoYXR0cikpKQorICAgICAgICBhcmdzLmFwcGVuZCgicmVzdD0lcyIgJSByZXByKHNlbGYuX3Jlc3QpKQorICAgICAgICByZXR1cm4gIkNvb2tpZSglcykiICUgIiwgIi5qb2luKGFyZ3MpCisKKworY2xhc3MgQ29va2llUG9saWN5OgorICAgICIiIkRlZmluZXMgd2hpY2ggY29va2llcyBnZXQgYWNjZXB0ZWQgZnJvbSBhbmQgcmV0dXJuZWQgdG8gc2VydmVyLgorCisgICAgTWF5IGFsc28gbW9kaWZ5IGNvb2tpZXMsIHRob3VnaCB0aGlzIGlzIHByb2JhYmx5IGEgYmFkIGlkZWEuCisKKyAgICBUaGUgc3ViY2xhc3MgRGVmYXVsdENvb2tpZVBvbGljeSBkZWZpbmVzIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgTmV0c2NhcGUKKyAgICBhbmQgUkZDIDI5NjUgY29va2llcyAtLSBvdmVycmlkZSB0aGF0IGlmIHlvdSB3YW50IGEgY3VzdG9taXNlZCBwb2xpY3kuCisKKyAgICAiIiIKKyAgICBkZWYgc2V0X29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIChhbmQgb25seSBpZikgY29va2llIHNob3VsZCBiZSBhY2NlcHRlZCBmcm9tIHNlcnZlci4KKworICAgICAgICBDdXJyZW50bHksIHByZS1leHBpcmVkIGNvb2tpZXMgbmV2ZXIgZ2V0IHRoaXMgZmFyIC0tIHRoZSBDb29raWVKYXIKKyAgICAgICAgY2xhc3MgZGVsZXRlcyBzdWNoIGNvb2tpZXMgaXRzZWxmLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiByZXR1cm5fb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBjb29raWUgc2hvdWxkIGJlIHJldHVybmVkIHRvIHNlcnZlci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgZG9tYWluX3JldHVybl9vayhzZWxmLCBkb21haW4sIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgZG9tYWluLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwYXRoX3JldHVybl9vayhzZWxmLCBwYXRoLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIGZhbHNlIGlmIGNvb2tpZXMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCwgZ2l2ZW4gY29va2llIHBhdGguCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIERlZmF1bHRDb29raWVQb2xpY3koQ29va2llUG9saWN5KToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYWNjZXB0aW5nIGFuZCByZXR1cm5pbmcgY29va2llcy4iIiIKKworICAgIERvbWFpblN0cmljdE5vRG90cyA9IDEKKyAgICBEb21haW5TdHJpY3ROb25Eb21haW4gPSAyCisgICAgRG9tYWluUkZDMjk2NU1hdGNoID0gNAorCisgICAgRG9tYWluTGliZXJhbCA9IDAKKyAgICBEb21haW5TdHJpY3QgPSBEb21haW5TdHJpY3ROb0RvdHN8RG9tYWluU3RyaWN0Tm9uRG9tYWluCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgYmxvY2tlZF9kb21haW5zPU5vbmUsIGFsbG93ZWRfZG9tYWlucz1Ob25lLAorICAgICAgICAgICAgICAgICBuZXRzY2FwZT1UcnVlLCByZmMyOTY1PUZhbHNlLAorICAgICAgICAgICAgICAgICBoaWRlX2Nvb2tpZTI9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0cmljdF9kb21haW49RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZT1UcnVlLAorICAgICAgICAgICAgICAgICBzdHJpY3RfbnNfdW52ZXJpZmlhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgICBzdHJpY3RfbnNfZG9tYWluPURvbWFpbkxpYmVyYWwsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc19zZXRfaW5pdGlhbF9kb2xsYXI9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc19zZXRfcGF0aD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgYXJndW1lbnRzIHNob3VsZCBiZSBwYXNzZWQgYXMga2V5d29yZCBhcmd1bWVudHMgb25seS4iIiIKKyAgICAgICAgc2VsZi5uZXRzY2FwZSA9IG5ldHNjYXBlCisgICAgICAgIHNlbGYucmZjMjk2NSA9IHJmYzI5NjUKKyAgICAgICAgc2VsZi5oaWRlX2Nvb2tpZTIgPSBoaWRlX2Nvb2tpZTIKKyAgICAgICAgc2VsZi5zdHJpY3RfZG9tYWluID0gc3RyaWN0X2RvbWFpbgorICAgICAgICBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZSA9IHN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZQorICAgICAgICBzZWxmLnN0cmljdF9uc191bnZlcmlmaWFibGUgPSBzdHJpY3RfbnNfdW52ZXJpZmlhYmxlCisgICAgICAgIHNlbGYuc3RyaWN0X25zX2RvbWFpbiA9IHN0cmljdF9uc19kb21haW4KKyAgICAgICAgc2VsZi5zdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyID0gc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhcgorICAgICAgICBzZWxmLnN0cmljdF9uc19zZXRfcGF0aCA9IHN0cmljdF9uc19zZXRfcGF0aAorCisgICAgICAgIGlmIGJsb2NrZWRfZG9tYWlucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2Jsb2NrZWRfZG9tYWlucyA9IHR1cGxlKGJsb2NrZWRfZG9tYWlucykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Jsb2NrZWRfZG9tYWlucyA9ICgpCisKKyAgICAgICAgaWYgYWxsb3dlZF9kb21haW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWxsb3dlZF9kb21haW5zID0gdHVwbGUoYWxsb3dlZF9kb21haW5zKQorICAgICAgICBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgPSBhbGxvd2VkX2RvbWFpbnMKKworICAgIGRlZiBibG9ja2VkX2RvbWFpbnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zIChhcyBhIHR1cGxlKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Jsb2NrZWRfZG9tYWlucworICAgIGRlZiBzZXRfYmxvY2tlZF9kb21haW5zKHNlbGYsIGJsb2NrZWRfZG9tYWlucyk6CisgICAgICAgICIiIlNldCB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zLiIiIgorICAgICAgICBzZWxmLl9ibG9ja2VkX2RvbWFpbnMgPSB0dXBsZShibG9ja2VkX2RvbWFpbnMpCisKKyAgICBkZWYgaXNfYmxvY2tlZChzZWxmLCBkb21haW4pOgorICAgICAgICBmb3IgYmxvY2tlZF9kb21haW4gaW4gc2VsZi5fYmxvY2tlZF9kb21haW5zOgorICAgICAgICAgICAgaWYgdXNlcl9kb21haW5fbWF0Y2goZG9tYWluLCBibG9ja2VkX2RvbWFpbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYWxsb3dlZF9kb21haW5zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gTm9uZSwgb3IgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucyAoYXMgYSB0dXBsZSkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9hbGxvd2VkX2RvbWFpbnMKKyAgICBkZWYgc2V0X2FsbG93ZWRfZG9tYWlucyhzZWxmLCBhbGxvd2VkX2RvbWFpbnMpOgorICAgICAgICAiIiJTZXQgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucywgb3IgTm9uZS4iIiIKKyAgICAgICAgaWYgYWxsb3dlZF9kb21haW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWxsb3dlZF9kb21haW5zID0gdHVwbGUoYWxsb3dlZF9kb21haW5zKQorICAgICAgICBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgPSBhbGxvd2VkX2RvbWFpbnMKKworICAgIGRlZiBpc19ub3RfYWxsb3dlZChzZWxmLCBkb21haW4pOgorICAgICAgICBpZiBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgYWxsb3dlZF9kb21haW4gaW4gc2VsZi5fYWxsb3dlZF9kb21haW5zOgorICAgICAgICAgICAgaWYgdXNlcl9kb21haW5fbWF0Y2goZG9tYWluLCBhbGxvd2VkX2RvbWFpbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIgorICAgICAgICBJZiB5b3Ugb3ZlcnJpZGUgLnNldF9vaygpLCBiZSBzdXJlIHRvIGNhbGwgdGhpcyBtZXRob2QuICBJZiBpdCByZXR1cm5zCisgICAgICAgIGZhbHNlLCBzbyBzaG91bGQgeW91ciBzdWJjbGFzcyAoYXNzdW1pbmcgeW91ciBzdWJjbGFzcyB3YW50cyB0byBiZSBtb3JlCisgICAgICAgIHN0cmljdCBhYm91dCB3aGljaCBjb29raWVzIHRvIGFjY2VwdCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGRlYnVnKCIgLSBjaGVja2luZyBjb29raWUgJXM9JXMiLCBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorCisgICAgICAgIGFzc2VydCBjb29raWUubmFtZSBpcyBub3QgTm9uZQorCisgICAgICAgIGZvciBuIGluICJ2ZXJzaW9uIiwgInZlcmlmaWFiaWxpdHkiLCAibmFtZSIsICJwYXRoIiwgImRvbWFpbiIsICJwb3J0IjoKKyAgICAgICAgICAgIGZuX25hbWUgPSAic2V0X29rXyIrbgorICAgICAgICAgICAgZm4gPSBnZXRhdHRyKHNlbGYsIGZuX25hbWUpCisgICAgICAgICAgICBpZiBub3QgZm4oY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va192ZXJzaW9uKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uIGlzIE5vbmU6CisgICAgICAgICAgICAjIFZlcnNpb24gaXMgYWx3YXlzIHNldCB0byAwIGJ5IHBhcnNlX25zX2hlYWRlcnMgaWYgaXQncyBhIE5ldHNjYXBlCisgICAgICAgICAgICAjIGNvb2tpZSwgc28gdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgUkZDIDI5NjUgY29va2llLgorICAgICAgICAgICAgZGVidWcoIiAgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgKCVzPSVzKSIsCisgICAgICAgICAgICAgICAgICBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgbm90IHNlbGYucmZjMjk2NToKKyAgICAgICAgICAgIGRlYnVnKCIgICBSRkMgMjk2NSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgbm90IHNlbGYubmV0c2NhcGU6CisgICAgICAgICAgICBkZWJ1ZygiICAgTmV0c2NhcGUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va192ZXJpZmlhYmlsaXR5KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIHJlcXVlc3QuaXNfdW52ZXJpZmlhYmxlKCkgYW5kIGlzX3RoaXJkX3BhcnR5KHJlcXVlc3QpOgorICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgUkZDIDI5NjUgY29va2llIGR1cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc191bnZlcmlmaWFibGU6CisgICAgICAgICAgICAgICAgZGVidWcoIiAgIHRoaXJkLXBhcnR5IE5ldHNjYXBlIGNvb2tpZSBkdXJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9uIikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2tfbmFtZShzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAjIFRyeSBhbmQgc3RvcCBzZXJ2ZXJzIHNldHRpbmcgVjAgY29va2llcyBkZXNpZ25lZCB0byBoYWNrIG90aGVyCisgICAgICAgICMgc2VydmVycyB0aGF0IGtub3cgYm90aCBWMCBhbmQgVjEgcHJvdG9jb2xzLgorICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyIGFuZAorICAgICAgICAgICAgY29va2llLm5hbWUuc3RhcnRzd2l0aCgiJCIpKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBpbGxlZ2FsIG5hbWUgKHN0YXJ0cyB3aXRoICckJyk6ICclcyciLCBjb29raWUubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19wYXRoKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5wYXRoX3NwZWNpZmllZDoKKyAgICAgICAgICAgIHJlcV9wYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgICAgICBpZiAoKGNvb2tpZS52ZXJzaW9uID4gMCBvcgorICAgICAgICAgICAgICAgICAoY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfc2V0X3BhdGgpKSBhbmQKKyAgICAgICAgICAgICAgICBub3QgcmVxX3BhdGguc3RhcnRzd2l0aChjb29raWUucGF0aCkpOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICBwYXRoIGF0dHJpYnV0ZSAlcyBpcyBub3QgYSBwcmVmaXggb2YgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgInBhdGggJXMiLCBjb29raWUucGF0aCwgcmVxX3BhdGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX2RvbWFpbihzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBzZWxmLmlzX2Jsb2NrZWQoY29va2llLmRvbWFpbik6CisgICAgICAgICAgICBkZWJ1ZygiICAgZG9tYWluICVzIGlzIGluIHVzZXIgYmxvY2stbGlzdCIsIGNvb2tpZS5kb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5pc19ub3RfYWxsb3dlZChjb29raWUuZG9tYWluKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgbm90IGluIHVzZXIgYWxsb3ctbGlzdCIsIGNvb2tpZS5kb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29va2llLmRvbWFpbl9zcGVjaWZpZWQ6CisgICAgICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5kb21haW4KKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0X2RvbWFpbiBhbmQgKGRvbWFpbi5jb3VudCgiLiIpID49IDIpOgorICAgICAgICAgICAgICAgIGkgPSBkb21haW4ucmZpbmQoIi4iKQorICAgICAgICAgICAgICAgIGogPSBkb21haW4ucmZpbmQoIi4iLCAwLCBpKQorICAgICAgICAgICAgICAgIGlmIGogPT0gMDogICMgZG9tYWluIGxpa2UgLmZvby5iYXIKKyAgICAgICAgICAgICAgICAgICAgdGxkID0gZG9tYWluW2krMTpdCisgICAgICAgICAgICAgICAgICAgIHNsZCA9IGRvbWFpbltqKzE6aV0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsZC5sb3dlcigpIGluIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbyIsICJhYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tIiwgImVkdSIsICJvcmciLCAibmV0IiwgImdvdiIsICJtaWwiLCAiaW50Il0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4odGxkKSA9PSAyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIGxpa2UgLmNvLnVrCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgY291bnRyeS1jb2RlIHNlY29uZCBsZXZlbCBkb21haW4gJXMiLCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIGRvbWFpbi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICAgICAgdW5kb3R0ZWRfZG9tYWluID0gZG9tYWluWzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bmRvdHRlZF9kb21haW4gPSBkb21haW4KKyAgICAgICAgICAgIGVtYmVkZGVkX2RvdHMgPSAodW5kb3R0ZWRfZG9tYWluLmZpbmQoIi4iKSA+PSAwKQorICAgICAgICAgICAgaWYgbm90IGVtYmVkZGVkX2RvdHMgYW5kIGRvbWFpbiAhPSAiLmxvY2FsIjoKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbm9uLWxvY2FsIGRvbWFpbiAlcyBjb250YWlucyBubyBlbWJlZGRlZCBkb3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID09IDA6CisgICAgICAgICAgICAgICAgaWYgKG5vdCBlcmhuLmVuZHN3aXRoKGRvbWFpbikgYW5kCisgICAgICAgICAgICAgICAgICAgIChub3QgZXJobi5zdGFydHN3aXRoKCIuIikgYW5kCisgICAgICAgICAgICAgICAgICAgICBub3QgKCIuIitlcmhuKS5lbmRzd2l0aChkb21haW4pKSk6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIChldmVuIHdpdGggYWRkZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbCBkb3QpIGRvZXMgbm90IGVuZCBlbmQgd2l0aCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluUkZDMjk2NU1hdGNoKSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGRvbWFpbl9tYXRjaChlcmhuLCBkb21haW4pOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCAlcyBkb2VzIG5vdCBkb21haW4tbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBlcmhuLCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID4gMCBvcgorICAgICAgICAgICAgICAgIChzZWxmLnN0cmljdF9uc19kb21haW4gJiBzZWxmLkRvbWFpblN0cmljdE5vRG90cykpOgorICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4ID0gcmVxX2hvc3RbOi1sZW4oZG9tYWluKV0KKyAgICAgICAgICAgICAgICBpZiAoaG9zdF9wcmVmaXguZmluZCgiLiIpID49IDAgYW5kCisgICAgICAgICAgICAgICAgICAgIG5vdCBJUFY0X1JFLnNlYXJjaChyZXFfaG9zdCkpOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgaG9zdCBwcmVmaXggJXMgZm9yIGRvbWFpbiAlcyBjb250YWlucyBhIGRvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4LCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19wb3J0KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5wb3J0X3NwZWNpZmllZDoKKyAgICAgICAgICAgIHJlcV9wb3J0ID0gcmVxdWVzdF9wb3J0KHJlcXVlc3QpCisgICAgICAgICAgICBpZiByZXFfcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJlcV9wb3J0ID0gIjgwIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXFfcG9ydCA9IHN0cihyZXFfcG9ydCkKKyAgICAgICAgICAgIGZvciBwIGluIGNvb2tpZS5wb3J0LnNwbGl0KCIsIik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbnQocCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIGJhZCBwb3J0ICVzIChub3QgbnVtZXJpYykiLCBwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBwID09IHJlcV9wb3J0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICglcykgbm90IGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXFfcG9ydCwgY29va2llLnBvcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIgorICAgICAgICBJZiB5b3Ugb3ZlcnJpZGUgLnJldHVybl9vaygpLCBiZSBzdXJlIHRvIGNhbGwgdGhpcyBtZXRob2QuICBJZiBpdAorICAgICAgICByZXR1cm5zIGZhbHNlLCBzbyBzaG91bGQgeW91ciBzdWJjbGFzcyAoYXNzdW1pbmcgeW91ciBzdWJjbGFzcyB3YW50cyB0bworICAgICAgICBiZSBtb3JlIHN0cmljdCBhYm91dCB3aGljaCBjb29raWVzIHRvIHJldHVybikuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgUGF0aCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYnkgLnBhdGhfcmV0dXJuX29rKCksIGFuZCBkb21haW4KKyAgICAgICAgIyBibG9ja2luZyBkb25lIGJ5IC5kb21haW5fcmV0dXJuX29rKCkuCisgICAgICAgIGRlYnVnKCIgLSBjaGVja2luZyBjb29raWUgJXM9JXMiLCBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorCisgICAgICAgIGZvciBuIGluICJ2ZXJzaW9uIiwgInZlcmlmaWFiaWxpdHkiLCAic2VjdXJlIiwgImV4cGlyZXMiLCAicG9ydCIsICJkb21haW4iOgorICAgICAgICAgICAgZm5fbmFtZSA9ICJyZXR1cm5fb2tfIituCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc2VsZiwgZm5fbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBmbihjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va192ZXJzaW9uKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgbm90IHNlbGYucmZjMjk2NToKKyAgICAgICAgICAgIGRlYnVnKCIgICBSRkMgMjk2NSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgbm90IHNlbGYubmV0c2NhcGU6CisgICAgICAgICAgICBkZWJ1ZygiICAgTmV0c2NhcGUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va192ZXJpZmlhYmlsaXR5KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIHJlcXVlc3QuaXNfdW52ZXJpZmlhYmxlKCkgYW5kIGlzX3RoaXJkX3BhcnR5KHJlcXVlc3QpOgorICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgUkZDIDI5NjUgY29va2llIGR1cmluZyB1bnZlcmlmaWFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgTmV0c2NhcGUgY29va2llIGR1cmluZyB1bnZlcmlmaWFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3NlY3VyZShzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUuc2VjdXJlIGFuZCByZXF1ZXN0LmdldF90eXBlKCkgIT0gImh0dHBzIjoKKyAgICAgICAgICAgIGRlYnVnKCIgICBzZWN1cmUgY29va2llIHdpdGggbm9uLXNlY3VyZSByZXF1ZXN0IikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va19leHBpcmVzKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5pc19leHBpcmVkKHNlbGYuX25vdyk6CisgICAgICAgICAgICBkZWJ1ZygiICAgY29va2llIGV4cGlyZWQiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3BvcnQoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnBvcnQ6CisgICAgICAgICAgICByZXFfcG9ydCA9IHJlcXVlc3RfcG9ydChyZXF1ZXN0KQorICAgICAgICAgICAgaWYgcmVxX3BvcnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXFfcG9ydCA9ICI4MCIKKyAgICAgICAgICAgIGZvciBwIGluIGNvb2tpZS5wb3J0LnNwbGl0KCIsIik6CisgICAgICAgICAgICAgICAgaWYgcCA9PSByZXFfcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVidWcoIiAgIHJlcXVlc3QgcG9ydCAlcyBkb2VzIG5vdCBtYXRjaCBjb29raWUgcG9ydCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va19kb21haW4oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5kb21haW4KKworICAgICAgICAjIHN0cmljdCBjaGVjayBvZiBub24tZG9tYWluIGNvb2tpZXM6IE1vemlsbGEgZG9lcyB0aGlzLCBNU0lFNSBkb2Vzbid0CisgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA9PSAwIGFuZAorICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluU3RyaWN0Tm9uRG9tYWluKSBhbmQKKyAgICAgICAgICAgIG5vdCBjb29raWUuZG9tYWluX3NwZWNpZmllZCBhbmQgZG9tYWluICE9IGVyaG4pOgorICAgICAgICAgICAgZGVidWcoIiAgIGNvb2tpZSB3aXRoIHVuc3BlY2lmaWVkIGRvbWFpbiBkb2VzIG5vdCBzdHJpbmctY29tcGFyZSAiCisgICAgICAgICAgICAgICAgICAiZXF1YWwgdG8gcmVxdWVzdCBkb21haW4iKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3QgZG9tYWluX21hdGNoKGVyaG4sIGRvbWFpbik6CisgICAgICAgICAgICBkZWJ1ZygiICAgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCisgICAgICAgICAgICAgICAgICAiUkZDIDI5NjUgY29va2llIGRvbWFpbiAlcyIsIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3QgKCIuIitlcmhuKS5lbmRzd2l0aChkb21haW4pOgorICAgICAgICAgICAgZGVidWcoIiAgIHJlcXVlc3QtaG9zdCAlcyBkb2VzIG5vdCBtYXRjaCBOZXRzY2FwZSBjb29raWUgZG9tYWluICIKKyAgICAgICAgICAgICAgICAgICIlcyIsIHJlcV9ob3N0LCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb21haW5fcmV0dXJuX29rKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgICMgTGliZXJhbCBjaGVjayBvZi4gIFRoaXMgaXMgaGVyZSBhcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQKKyAgICAgICAgIyBoYXZpbmcgdG8gbG9hZCBsb3RzIG9mIE1TSUUgY29va2llIGZpbGVzIHVubGVzcyBuZWNlc3NhcnkuCisgICAgICAgIHJlcV9ob3N0LCBlcmhuID0gZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgICAgICBpZiBub3QgcmVxX2hvc3Quc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgZG90dGVkX3JlcV9ob3N0ID0gIi4iK3JlcV9ob3N0CisgICAgICAgIGlmIG5vdCBlcmhuLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgIGRvdHRlZF9lcmhuID0gIi4iK2VyaG4KKyAgICAgICAgaWYgbm90IChkb3R0ZWRfcmVxX2hvc3QuZW5kc3dpdGgoZG9tYWluKSBvcgorICAgICAgICAgICAgICAgIGRvdHRlZF9lcmhuLmVuZHN3aXRoKGRvbWFpbikpOgorICAgICAgICAgICAgI2RlYnVnKCIgICByZXF1ZXN0IGRvbWFpbiAlcyBkb2VzIG5vdCBtYXRjaCBjb29raWUgZG9tYWluICVzIiwKKyAgICAgICAgICAgICMgICAgICByZXFfaG9zdCwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgc2VsZi5pc19ibG9ja2VkKGRvbWFpbik6CisgICAgICAgICAgICBkZWJ1ZygiICAgZG9tYWluICVzIGlzIGluIHVzZXIgYmxvY2stbGlzdCIsIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmlzX25vdF9hbGxvd2VkKGRvbWFpbik6CisgICAgICAgICAgICBkZWJ1ZygiICAgZG9tYWluICVzIGlzIG5vdCBpbiB1c2VyIGFsbG93LWxpc3QiLCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhdGhfcmV0dXJuX29rKHNlbGYsIHBhdGgsIHJlcXVlc3QpOgorICAgICAgICBkZWJ1ZygiLSBjaGVja2luZyBjb29raWUgcGF0aD0lcyIsIHBhdGgpCisgICAgICAgIHJlcV9wYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgIGlmIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKHBhdGgpOgorICAgICAgICAgICAgZGVidWcoIiAgJXMgZG9lcyBub3QgcGF0aC1tYXRjaCAlcyIsIHJlcV9wYXRoLCBwYXRoKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKworZGVmIHZhbHNfc29ydGVkX2J5X2tleShhZGljdCk6CisgICAga2V5cyA9IGFkaWN0LmtleXMoKQorICAgIGtleXMuc29ydCgpCisgICAgcmV0dXJuIG1hcChhZGljdC5nZXQsIGtleXMpCisKK2RlZiBkZWVwdmFsdWVzKG1hcHBpbmcpOgorICAgICIiIkl0ZXJhdGVzIG92ZXIgbmVzdGVkIG1hcHBpbmcsIGRlcHRoLWZpcnN0LCBpbiBzb3J0ZWQgb3JkZXIgYnkga2V5LiIiIgorICAgIHZhbHVlcyA9IHZhbHNfc29ydGVkX2J5X2tleShtYXBwaW5nKQorICAgIGZvciBvYmogaW4gdmFsdWVzOgorICAgICAgICBtYXBwaW5nID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqLml0ZW1zCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBUcnVlCisgICAgICAgICAgICBmb3Igc3Vib2JqIGluIGRlZXB2YWx1ZXMob2JqKToKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJvYmoKKyAgICAgICAgaWYgbm90IG1hcHBpbmc6CisgICAgICAgICAgICB5aWVsZCBvYmoKKworCisjIFVzZWQgYXMgc2Vjb25kIHBhcmFtZXRlciB0byBkaWN0LmdldCgpIG1ldGhvZCwgdG8gZGlzdGluZ3Vpc2ggYWJzZW50CisjIGRpY3Qga2V5IGZyb20gb25lIHdpdGggYSBOb25lIHZhbHVlLgorY2xhc3MgQWJzZW50OiBwYXNzCisKK2NsYXNzIENvb2tpZUphcjoKKyAgICAiIiJDb2xsZWN0aW9uIG9mIEhUVFAgY29va2llcy4KKworICAgIFlvdSBtYXkgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGlzIGNsYXNzOiB0cnkKKyAgICB1cmxsaWIyLmJ1aWxkX29wZW5lcihIVFRQQ29va2llUHJvY2Vzc29yKS5vcGVuKHVybCkuCisKKyAgICAiIiIKKworICAgIG5vbl93b3JkX3JlID0gcmUuY29tcGlsZShyIlxXIikKKyAgICBxdW90ZV9yZSA9IHJlLmNvbXBpbGUociIoW1wiXFxdKSIpCisgICAgc3RyaWN0X2RvbWFpbl9yZSA9IHJlLmNvbXBpbGUociJcLj9bXi5dKiIpCisgICAgZG9tYWluX3JlID0gcmUuY29tcGlsZShyIlteLl0qIikKKyAgICBkb3RzX3JlID0gcmUuY29tcGlsZShyIl5cLisiKQorCisgICAgbWFnaWNfcmUgPSByIl5cI0xXUC1Db29raWVzLShcZCtcLlxkKykiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9saWN5PU5vbmUpOgorICAgICAgICBpZiBwb2xpY3kgaXMgTm9uZToKKyAgICAgICAgICAgIHBvbGljeSA9IERlZmF1bHRDb29raWVQb2xpY3koKQorICAgICAgICBzZWxmLl9wb2xpY3kgPSBwb2xpY3kKKworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sgPSBfdGhyZWFkaW5nLlJMb2NrKCkKKyAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CisKKyAgICBkZWYgc2V0X3BvbGljeShzZWxmLCBwb2xpY3kpOgorICAgICAgICBzZWxmLl9wb2xpY3kgPSBwb2xpY3kKKworICAgIGRlZiBfY29va2llc19mb3JfZG9tYWluKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgIGNvb2tpZXMgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5fcG9saWN5LmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBkZWJ1ZygiQ2hlY2tpbmcgJXMgZm9yIGNvb2tpZXMgdG8gcmV0dXJuIiwgZG9tYWluKQorICAgICAgICBjb29raWVzX2J5X3BhdGggPSBzZWxmLl9jb29raWVzW2RvbWFpbl0KKyAgICAgICAgZm9yIHBhdGggaW4gY29va2llc19ieV9wYXRoLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9wb2xpY3kucGF0aF9yZXR1cm5fb2socGF0aCwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGNvb2tpZXNfYnlfbmFtZSA9IGNvb2tpZXNfYnlfcGF0aFtwYXRoXQorICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzX2J5X25hbWUudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5yZXR1cm5fb2soY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIG5vdCByZXR1cm5pbmcgY29va2llIikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgaXQncyBhIG1hdGNoIikKKyAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZChjb29raWUpCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgX2Nvb2tpZXNfZm9yX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29va2llcyB0byBiZSByZXR1cm5lZCB0byBzZXJ2ZXIuIiIiCisgICAgICAgIGNvb2tpZXMgPSBbXQorICAgICAgICBmb3IgZG9tYWluIGluIHNlbGYuX2Nvb2tpZXMua2V5cygpOgorICAgICAgICAgICAgY29va2llcy5leHRlbmQoc2VsZi5fY29va2llc19mb3JfZG9tYWluKGRvbWFpbiwgcmVxdWVzdCkpCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgX2Nvb2tpZV9hdHRycyhzZWxmLCBjb29raWVzKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb29raWUtYXR0cmlidXRlcyB0byBiZSByZXR1cm5lZCB0byBzZXJ2ZXIuCisKKyAgICAgICAgbGlrZSBbJ2Zvbz0iYmFyIjsgJFBhdGg9Ii8iJywgLi4uXQorCisgICAgICAgIFRoZSAkVmVyc2lvbiBhdHRyaWJ1dGUgaXMgYWxzbyBhZGRlZCB3aGVuIGFwcHJvcHJpYXRlIChjdXJyZW50bHkgb25seQorICAgICAgICBvbmNlIHBlciByZXF1ZXN0KS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBhZGQgY29va2llcyBpbiBvcmRlciBvZiBtb3N0IHNwZWNpZmljIChpZS4gbG9uZ2VzdCkgcGF0aCBmaXJzdAorICAgICAgICBkZWYgZGVjcmVhc2luZ19zaXplKGEsIGIpOiByZXR1cm4gY21wKGxlbihiLnBhdGgpLCBsZW4oYS5wYXRoKSkKKyAgICAgICAgY29va2llcy5zb3J0KGRlY3JlYXNpbmdfc2l6ZSkKKworICAgICAgICB2ZXJzaW9uX3NldCA9IEZhbHNlCisKKyAgICAgICAgYXR0cnMgPSBbXQorICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXM6CisgICAgICAgICAgICAjIHNldCB2ZXJzaW9uIG9mIENvb2tpZSBoZWFkZXIKKyAgICAgICAgICAgICMgWFhYCisgICAgICAgICAgICAjIFdoYXQgc2hvdWxkIGl0IGJlIGlmIG11bHRpcGxlIG1hdGNoaW5nIFNldC1Db29raWUgaGVhZGVycyBoYXZlCisgICAgICAgICAgICAjICBkaWZmZXJlbnQgdmVyc2lvbnMgdGhlbXNlbHZlcz8KKyAgICAgICAgICAgICMgQW5zd2VyOiB0aGVyZSBpcyBubyBhbnN3ZXI7IHdhcyBzdXBwb3NlZCB0byBiZSBzZXR0bGVkIGJ5CisgICAgICAgICAgICAjICBSRkMgMjk2NSBlcnJhdGEsIGJ1dCB0aGF0IG1heSBuZXZlciBhcHBlYXIuLi4KKyAgICAgICAgICAgIHZlcnNpb24gPSBjb29raWUudmVyc2lvbgorICAgICAgICAgICAgaWYgbm90IHZlcnNpb25fc2V0OgorICAgICAgICAgICAgICAgIHZlcnNpb25fc2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPiAwOgorICAgICAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoIiRWZXJzaW9uPSVzIiAlIHZlcnNpb24pCisKKyAgICAgICAgICAgICMgcXVvdGUgY29va2llIHZhbHVlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgIyAobm90IGZvciBOZXRzY2FwZSBwcm90b2NvbCwgd2hpY2ggYWxyZWFkeSBoYXMgYW55IHF1b3RlcworICAgICAgICAgICAgIyAgaW50YWN0LCBkdWUgdG8gdGhlIHBvb3JseS1zcGVjaWZpZWQgTmV0c2NhcGUgQ29va2llOiBzeW50YXgpCisgICAgICAgICAgICBpZiAoKGNvb2tpZS52YWx1ZSBpcyBub3QgTm9uZSkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5ub25fd29yZF9yZS5zZWFyY2goY29va2llLnZhbHVlKSBhbmQgdmVyc2lvbiA+IDApOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5xdW90ZV9yZS5zdWIociJcXFwxIiwgY29va2llLnZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvb2tpZS52YWx1ZQorCisgICAgICAgICAgICAjIGFkZCBjb29raWUtYXR0cmlidXRlcyB0byBiZSByZXR1cm5lZCBpbiBDb29raWUgaGVhZGVyCisgICAgICAgICAgICBpZiBjb29raWUudmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoY29va2llLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgiJXM9JXMiICUgKGNvb2tpZS5uYW1lLCB2YWx1ZSkpCisgICAgICAgICAgICBpZiB2ZXJzaW9uID4gMDoKKyAgICAgICAgICAgICAgICBpZiBjb29raWUucGF0aF9zcGVjaWZpZWQ6CisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgnJFBhdGg9IiVzIicgJSBjb29raWUucGF0aCkKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuZG9tYWluLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gY29va2llLmRvbWFpbgorICAgICAgICAgICAgICAgICAgICBpZiAobm90IGNvb2tpZS5kb21haW5faW5pdGlhbF9kb3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4uc3RhcnRzd2l0aCgiLiIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpblsxOl0KKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCckRG9tYWluPSIlcyInICUgZG9tYWluKQorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5wb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwID0gIiRQb3J0IgorICAgICAgICAgICAgICAgICAgICBpZiBjb29raWUucG9ydF9zcGVjaWZpZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gcCArICgnPSIlcyInICUgY29va2llLnBvcnQpCisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZChwKQorCisgICAgICAgIHJldHVybiBhdHRycworCisgICAgZGVmIGFkZF9jb29raWVfaGVhZGVyKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAiIiJBZGQgY29ycmVjdCBDb29raWU6IGhlYWRlciB0byByZXF1ZXN0ICh1cmxsaWIyLlJlcXVlc3Qgb2JqZWN0KS4KKworICAgICAgICBUaGUgQ29va2llMiBoZWFkZXIgaXMgYWxzbyBhZGRlZCB1bmxlc3MgcG9saWN5LmhpZGVfY29va2llMiBpcyB0cnVlLgorCisgICAgICAgICIiIgorICAgICAgICBkZWJ1ZygiYWRkX2Nvb2tpZV9oZWFkZXIiKQorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisKKyAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCisKKyAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgIHN0cmljdF9ub25fZG9tYWluID0gKAorICAgICAgICAgICAgc2VsZi5fcG9saWN5LnN0cmljdF9uc19kb21haW4gJiBzZWxmLl9wb2xpY3kuRG9tYWluU3RyaWN0Tm9uRG9tYWluKQorCisgICAgICAgIGNvb2tpZXMgPSBzZWxmLl9jb29raWVzX2Zvcl9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICAgICAgYXR0cnMgPSBzZWxmLl9jb29raWVfYXR0cnMoY29va2llcykKKyAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCJDb29raWUiKToKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAiQ29va2llIiwgIjsgIi5qb2luKGF0dHJzKSkKKworICAgICAgICAjIGlmIG5lY2Vzc2FyeSwgYWR2ZXJ0aXNlIHRoYXQgd2Uga25vdyBSRkMgMjk2NQorICAgICAgICBpZiAoc2VsZi5fcG9saWN5LnJmYzI5NjUgYW5kIG5vdCBzZWxmLl9wb2xpY3kuaGlkZV9jb29raWUyIGFuZAorICAgICAgICAgICAgbm90IHJlcXVlc3QuaGFzX2hlYWRlcigiQ29va2llMiIpKToKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKKyAgICAgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiAhPSAxOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb29raWUyIiwgJyRWZXJzaW9uPSIxIicpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgICAgIHNlbGYuY2xlYXJfZXhwaXJlZF9jb29raWVzKCkKKworICAgIGRlZiBfbm9ybWFsaXplZF9jb29raWVfdHVwbGVzKHNlbGYsIGF0dHJzX3NldCk6CisgICAgICAgICIiIlJldHVybiBsaXN0IG9mIHR1cGxlcyBjb250YWluaW5nIG5vcm1hbGlzZWQgY29va2llIGluZm9ybWF0aW9uLgorCisgICAgICAgIGF0dHJzX3NldCBpcyB0aGUgbGlzdCBvZiBsaXN0cyBvZiBrZXksdmFsdWUgcGFpcnMgZXh0cmFjdGVkIGZyb20KKyAgICAgICAgdGhlIFNldC1Db29raWUgb3IgU2V0LUNvb2tpZTIgaGVhZGVycy4KKworICAgICAgICBUdXBsZXMgYXJlIG5hbWUsIHZhbHVlLCBzdGFuZGFyZCwgcmVzdCwgd2hlcmUgbmFtZSBhbmQgdmFsdWUgYXJlIHRoZQorICAgICAgICBjb29raWUgbmFtZSBhbmQgdmFsdWUsIHN0YW5kYXJkIGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBzdGFuZGFyZAorICAgICAgICBjb29raWUtYXR0cmlidXRlcyAoZGlzY2FyZCwgc2VjdXJlLCB2ZXJzaW9uLCBleHBpcmVzIG9yIG1heC1hZ2UsCisgICAgICAgIGRvbWFpbiwgcGF0aCBhbmQgcG9ydCkgYW5kIHJlc3QgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHJlc3Qgb2YKKyAgICAgICAgdGhlIGNvb2tpZS1hdHRyaWJ1dGVzLgorCisgICAgICAgICIiIgorICAgICAgICBjb29raWVfdHVwbGVzID0gW10KKworICAgICAgICBib29sZWFuX2F0dHJzID0gImRpc2NhcmQiLCAic2VjdXJlIgorICAgICAgICB2YWx1ZV9hdHRycyA9ICgidmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBpcmVzIiwgIm1heC1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAiZG9tYWluIiwgInBhdGgiLCAicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICJjb21tZW50IiwgImNvbW1lbnR1cmwiKQorCisgICAgICAgIGZvciBjb29raWVfYXR0cnMgaW4gYXR0cnNfc2V0OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBjb29raWVfYXR0cnNbMF0KKworICAgICAgICAgICAgIyBCdWlsZCBkaWN0aW9uYXJ5IG9mIHN0YW5kYXJkIGNvb2tpZS1hdHRyaWJ1dGVzIChzdGFuZGFyZCkgYW5kCisgICAgICAgICAgICAjIGRpY3Rpb25hcnkgb2Ygb3RoZXIgY29va2llLWF0dHJpYnV0ZXMgKHJlc3QpLgorCisgICAgICAgICAgICAjIE5vdGU6IGV4cGlyeSB0aW1lIGlzIG5vcm1hbGlzZWQgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaC4gIFYwCisgICAgICAgICAgICAjIGNvb2tpZXMgc2hvdWxkIGhhdmUgdGhlIEV4cGlyZXMgY29va2llLWF0dHJpYnV0ZSwgYW5kIFYxIGNvb2tpZXMKKyAgICAgICAgICAgICMgc2hvdWxkIGhhdmUgTWF4LUFnZSwgYnV0IHNpbmNlIFYxIGluY2x1ZGVzIFJGQyAyMTA5IGNvb2tpZXMgKGFuZAorICAgICAgICAgICAgIyBzaW5jZSBWMCBjb29raWVzIG1heSBiZSBhIG1pc2gtbWFzaCBvZiBOZXRzY2FwZSBhbmQgUkZDIDIxMDkpLCB3ZQorICAgICAgICAgICAgIyBhY2NlcHQgZWl0aGVyIChidXQgcHJlZmVyIE1heC1BZ2UpLgorICAgICAgICAgICAgbWF4X2FnZV9zZXQgPSBGYWxzZQorCisgICAgICAgICAgICBiYWRfY29va2llID0gRmFsc2UKKworICAgICAgICAgICAgc3RhbmRhcmQgPSB7fQorICAgICAgICAgICAgcmVzdCA9IHt9CisgICAgICAgICAgICBmb3IgaywgdiBpbiBjb29raWVfYXR0cnNbMTpdOgorICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgIyBkb24ndCBsb3NlIGNhc2UgZGlzdGluY3Rpb24gZm9yIHVua25vd24gZmllbGRzCisgICAgICAgICAgICAgICAgaWYgbGMgaW4gdmFsdWVfYXR0cnMgb3IgbGMgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgayA9IGxjCisgICAgICAgICAgICAgICAgaWYgayBpbiBib29sZWFuX2F0dHJzIGFuZCB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgYm9vbGVhbiBjb29raWUtYXR0cmlidXRlIGlzIHByZXNlbnQsIGJ1dCBoYXMgbm8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgIyAobGlrZSAiZGlzY2FyZCIsIHJhdGhlciB0aGFuICJwb3J0PTgwIikKKyAgICAgICAgICAgICAgICAgICAgdiA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBrIGluIHN0YW5kYXJkOgorICAgICAgICAgICAgICAgICAgICAjIG9ubHkgZmlyc3QgdmFsdWUgaXMgc2lnbmlmaWNhbnQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBrID09ICJkb21haW4iOgorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbWlzc2luZyB2YWx1ZSBmb3IgZG9tYWluIGF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBSRkMgMjk2NSBzZWN0aW9uIDMuMy4zCisgICAgICAgICAgICAgICAgICAgIHYgPSB2Lmxvd2VyKCkKKyAgICAgICAgICAgICAgICBpZiBrID09ICJleHBpcmVzIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4X2FnZV9zZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFByZWZlciBtYXgtYWdlIHRvIGV4cGlyZXMgKGxpa2UgTW96aWxsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWUgZm9yIGV4cGlyZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZTogdHJlYXRpbmcgYXMgc2Vzc2lvbiBjb29raWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBrID09ICJtYXgtYWdlIjoKKyAgICAgICAgICAgICAgICAgICAgbWF4X2FnZV9zZXQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBpbnQodikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbWlzc2luZyBvciBpbnZhbGlkIChub24tbnVtZXJpYykgdmFsdWUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtYWdlIGF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IFJGQyAyOTY1IE1heC1BZ2UgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaAorICAgICAgICAgICAgICAgICAgICAjIFhYWCBTdHJpY3RseSB5b3UncmUgc3VwcG9zZWQgdG8gZm9sbG93IFJGQyAyNjE2CisgICAgICAgICAgICAgICAgICAgICMgICBhZ2UtY2FsY3VsYXRpb24gcnVsZXMuICBSZW1lbWJlciB0aGF0IHplcm8gTWF4LUFnZSBpcyBhCisgICAgICAgICAgICAgICAgICAgICMgICBpcyBhIHJlcXVlc3QgdG8gZGlzY2FyZCAob2xkIGFuZCBuZXcpIGNvb2tpZSwgdGhvdWdoLgorICAgICAgICAgICAgICAgICAgICBrID0gImV4cGlyZXMiCisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9ub3cgKyB2CisgICAgICAgICAgICAgICAgaWYgKGsgaW4gdmFsdWVfYXR0cnMpIG9yIChrIGluIGJvb2xlYW5fYXR0cnMpOgorICAgICAgICAgICAgICAgICAgICBpZiAodiBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgayBub3QgaW4gWyJwb3J0IiwgImNvbW1lbnQiLCAiY29tbWVudHVybCJdKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBtaXNzaW5nIHZhbHVlIGZvciAlcyBhdHRyaWJ1dGUiICUgaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9jb29raWUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXN0W2tdID0gdgorCisgICAgICAgICAgICBpZiBiYWRfY29va2llOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGNvb2tpZV90dXBsZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSwgc3RhbmRhcmQsIHJlc3QpKQorCisgICAgICAgIHJldHVybiBjb29raWVfdHVwbGVzCisKKyAgICBkZWYgX2Nvb2tpZV9mcm9tX2Nvb2tpZV90dXBsZShzZWxmLCB0dXAsIHJlcXVlc3QpOgorICAgICAgICAjIHN0YW5kYXJkIGlzIGRpY3Qgb2Ygc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMsIHJlc3QgaXMgZGljdCBvZiB0aGUKKyAgICAgICAgIyByZXN0IG9mIHRoZW0KKyAgICAgICAgbmFtZSwgdmFsdWUsIHN0YW5kYXJkLCByZXN0ID0gdHVwCisKKyAgICAgICAgZG9tYWluID0gc3RhbmRhcmQuZ2V0KCJkb21haW4iLCBBYnNlbnQpCisgICAgICAgIHBhdGggPSBzdGFuZGFyZC5nZXQoInBhdGgiLCBBYnNlbnQpCisgICAgICAgIHBvcnQgPSBzdGFuZGFyZC5nZXQoInBvcnQiLCBBYnNlbnQpCisgICAgICAgIGV4cGlyZXMgPSBzdGFuZGFyZC5nZXQoImV4cGlyZXMiLCBBYnNlbnQpCisKKyAgICAgICAgIyBzZXQgdGhlIGVhc3kgZGVmYXVsdHMKKyAgICAgICAgdmVyc2lvbiA9IHN0YW5kYXJkLmdldCgidmVyc2lvbiIsIE5vbmUpCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6IHZlcnNpb24gPSBpbnQodmVyc2lvbikKKyAgICAgICAgc2VjdXJlID0gc3RhbmRhcmQuZ2V0KCJzZWN1cmUiLCBGYWxzZSkKKyAgICAgICAgIyAoZGlzY2FyZCBpcyBhbHNvIHNldCBpZiBleHBpcmVzIGlzIEFic2VudCkKKyAgICAgICAgZGlzY2FyZCA9IHN0YW5kYXJkLmdldCgiZGlzY2FyZCIsIEZhbHNlKQorICAgICAgICBjb21tZW50ID0gc3RhbmRhcmQuZ2V0KCJjb21tZW50IiwgTm9uZSkKKyAgICAgICAgY29tbWVudF91cmwgPSBzdGFuZGFyZC5nZXQoImNvbW1lbnR1cmwiLCBOb25lKQorCisgICAgICAgICMgc2V0IGRlZmF1bHQgcGF0aAorICAgICAgICBpZiBwYXRoIGlzIG5vdCBBYnNlbnQgYW5kIHBhdGggIT0gIiI6CisgICAgICAgICAgICBwYXRoX3NwZWNpZmllZCA9IFRydWUKKyAgICAgICAgICAgIHBhdGggPSBlc2NhcGVfcGF0aChwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aF9zcGVjaWZpZWQgPSBGYWxzZQorICAgICAgICAgICAgcGF0aCA9IHJlcXVlc3RfcGF0aChyZXF1ZXN0KQorICAgICAgICAgICAgaSA9IHBhdGgucmZpbmQoIi8iKQorICAgICAgICAgICAgaWYgaSAhPSAtMToKKyAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uID09IDA6CisgICAgICAgICAgICAgICAgICAgICMgTmV0c2NhcGUgc3BlYyBwYXJ0cyBjb21wYW55IGZyb20gcmVhbGl0eSBoZXJlCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzppXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzppKzFdCisgICAgICAgICAgICBpZiBsZW4ocGF0aCkgPT0gMDogcGF0aCA9ICIvIgorCisgICAgICAgICMgc2V0IGRlZmF1bHQgZG9tYWluCisgICAgICAgIGRvbWFpbl9zcGVjaWZpZWQgPSBkb21haW4gaXMgbm90IEFic2VudAorICAgICAgICAjIGJ1dCBmaXJzdCB3ZSBoYXZlIHRvIHJlbWVtYmVyIHdoZXRoZXIgaXQgc3RhcnRzIHdpdGggYSBkb3QKKyAgICAgICAgZG9tYWluX2luaXRpYWxfZG90ID0gRmFsc2UKKyAgICAgICAgaWYgZG9tYWluX3NwZWNpZmllZDoKKyAgICAgICAgICAgIGRvbWFpbl9pbml0aWFsX2RvdCA9IGJvb2woZG9tYWluLnN0YXJ0c3dpdGgoIi4iKSkKKyAgICAgICAgaWYgZG9tYWluIGlzIEFic2VudDoKKyAgICAgICAgICAgIHJlcV9ob3N0LCBlcmhuID0gZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgICAgICAgICAgZG9tYWluID0gZXJobgorICAgICAgICBlbGlmIG5vdCBkb21haW4uc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgZG9tYWluID0gIi4iK2RvbWFpbgorCisgICAgICAgICMgc2V0IGRlZmF1bHQgcG9ydAorICAgICAgICBwb3J0X3NwZWNpZmllZCA9IEZhbHNlCisgICAgICAgIGlmIHBvcnQgaXMgbm90IEFic2VudDoKKyAgICAgICAgICAgIGlmIHBvcnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIFBvcnQgYXR0ciBwcmVzZW50LCBidXQgaGFzIG5vIHZhbHVlOiBkZWZhdWx0IHRvIHJlcXVlc3QgcG9ydC4KKyAgICAgICAgICAgICAgICAjIENvb2tpZSBzaG91bGQgdGhlbiBvbmx5IGJlIHNlbnQgYmFjayBvbiB0aGF0IHBvcnQuCisgICAgICAgICAgICAgICAgcG9ydCA9IHJlcXVlc3RfcG9ydChyZXF1ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3J0X3NwZWNpZmllZCA9IFRydWUKKyAgICAgICAgICAgICAgICBwb3J0ID0gcmUuc3ViKHIiXHMrIiwgIiIsIHBvcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vIHBvcnQgYXR0ciBwcmVzZW50LiAgQ29va2llIGNhbiBiZSBzZW50IGJhY2sgb24gYW55IHBvcnQuCisgICAgICAgICAgICBwb3J0ID0gTm9uZQorCisgICAgICAgICMgc2V0IGRlZmF1bHQgZXhwaXJlcyBhbmQgZGlzY2FyZAorICAgICAgICBpZiBleHBpcmVzIGlzIEFic2VudDoKKyAgICAgICAgICAgIGV4cGlyZXMgPSBOb25lCisgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorICAgICAgICBlbGlmIGV4cGlyZXMgPD0gc2VsZi5fbm93OgorICAgICAgICAgICAgIyBFeHBpcnkgZGF0ZSBpbiBwYXN0IGlzIHJlcXVlc3QgdG8gZGVsZXRlIGNvb2tpZS4gIFRoaXMgY2FuJ3QgYmUKKyAgICAgICAgICAgICMgaW4gRGVmYXVsdENvb2tpZVBvbGljeSwgYmVjYXVzZSBjYW4ndCBkZWxldGUgY29va2llcyB0aGVyZS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGRvbWFpbiwgcGF0aCwgbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWJ1ZygiRXhwaXJpbmcgY29va2llLCBkb21haW49JyVzJywgcGF0aD0nJXMnLCBuYW1lPSclcyciLAorICAgICAgICAgICAgICAgICAgZG9tYWluLCBwYXRoLCBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXR1cm4gQ29va2llKHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgcG9ydF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBkb21haW5faW5pdGlhbF9kb3QsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgcGF0aF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfdXJsLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3QpCisKKyAgICBkZWYgX2Nvb2tpZXNfZnJvbV9hdHRyc19zZXQoc2VsZiwgYXR0cnNfc2V0LCByZXF1ZXN0KToKKyAgICAgICAgY29va2llX3R1cGxlcyA9IHNlbGYuX25vcm1hbGl6ZWRfY29va2llX3R1cGxlcyhhdHRyc19zZXQpCisKKyAgICAgICAgY29va2llcyA9IFtdCisgICAgICAgIGZvciB0dXAgaW4gY29va2llX3R1cGxlczoKKyAgICAgICAgICAgIGNvb2tpZSA9IHNlbGYuX2Nvb2tpZV9mcm9tX2Nvb2tpZV90dXBsZSh0dXAsIHJlcXVlc3QpCisgICAgICAgICAgICBpZiBjb29raWU6IGNvb2tpZXMuYXBwZW5kKGNvb2tpZSkKKyAgICAgICAgcmV0dXJuIGNvb2tpZXMKKworICAgIGRlZiBtYWtlX2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gc2VxdWVuY2Ugb2YgQ29va2llIG9iamVjdHMgZXh0cmFjdGVkIGZyb20gcmVzcG9uc2Ugb2JqZWN0LiIiIgorICAgICAgICAjIGdldCBjb29raWUtYXR0cmlidXRlcyBmb3IgUkZDIDI5NjUgYW5kIE5ldHNjYXBlIHByb3RvY29scworICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaW5mbygpCisgICAgICAgIHJmYzI5NjVfaGRycyA9IGhlYWRlcnMuZ2V0aGVhZGVycygiU2V0LUNvb2tpZTIiKQorICAgICAgICBuc19oZHJzID0gaGVhZGVycy5nZXRoZWFkZXJzKCJTZXQtQ29va2llIikKKworICAgICAgICByZmMyOTY1ID0gc2VsZi5fcG9saWN5LnJmYzI5NjUKKyAgICAgICAgbmV0c2NhcGUgPSBzZWxmLl9wb2xpY3kubmV0c2NhcGUKKworICAgICAgICBpZiAoKG5vdCByZmMyOTY1X2hkcnMgYW5kIG5vdCBuc19oZHJzKSBvcgorICAgICAgICAgICAgKG5vdCBuc19oZHJzIGFuZCBub3QgcmZjMjk2NSkgb3IKKyAgICAgICAgICAgIChub3QgcmZjMjk2NV9oZHJzIGFuZCBub3QgbmV0c2NhcGUpIG9yCisgICAgICAgICAgICAobm90IG5ldHNjYXBlIGFuZCBub3QgcmZjMjk2NSkpOgorICAgICAgICAgICAgcmV0dXJuIFtdICAjIG5vIHJlbGV2YW50IGNvb2tpZSBoZWFkZXJzOiBxdWljayBleGl0CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29va2llcyA9IHNlbGYuX2Nvb2tpZXNfZnJvbV9hdHRyc19zZXQoCisgICAgICAgICAgICAgICAgc3BsaXRfaGVhZGVyX3dvcmRzKHJmYzI5NjVfaGRycyksIHJlcXVlc3QpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucygpCisgICAgICAgICAgICBjb29raWVzID0gW10KKworICAgICAgICBpZiBuc19oZHJzIGFuZCBuZXRzY2FwZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuc19jb29raWVzID0gc2VsZi5fY29va2llc19mcm9tX2F0dHJzX3NldCgKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhuc19oZHJzKSwgcmVxdWVzdCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMoKQorICAgICAgICAgICAgICAgIG5zX2Nvb2tpZXMgPSBbXQorCisgICAgICAgICAgICAjIExvb2sgZm9yIE5ldHNjYXBlIGNvb2tpZXMgKGZyb20gU2V0LUNvb2tpZSBoZWFkZXJzKSB0aGF0IG1hdGNoCisgICAgICAgICAgICAjIGNvcnJlc3BvbmRpbmcgUkZDIDI5NjUgY29va2llcyAoZnJvbSBTZXQtQ29va2llMiBoZWFkZXJzKS4KKyAgICAgICAgICAgICMgRm9yIGVhY2ggbWF0Y2gsIGtlZXAgdGhlIFJGQyAyOTY1IGNvb2tpZSBhbmQgaWdub3JlIHRoZSBOZXRzY2FwZQorICAgICAgICAgICAgIyBjb29raWUgKFJGQyAyOTY1IHNlY3Rpb24gOS4xKS4gIEFjdHVhbGx5LCBSRkMgMjEwOSBjb29raWVzIGFyZQorICAgICAgICAgICAgIyBidW5kbGVkIGluIHdpdGggdGhlIE5ldHNjYXBlIGNvb2tpZXMgZm9yIHRoaXMgcHVycG9zZSwgd2hpY2ggaXMKKyAgICAgICAgICAgICMgcmVhc29uYWJsZSBiZWhhdmlvdXIuCisgICAgICAgICAgICBpZiByZmMyOTY1OgorICAgICAgICAgICAgICAgIGxvb2t1cCA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzOgorICAgICAgICAgICAgICAgICAgICBsb29rdXBbKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSldID0gTm9uZQorCisgICAgICAgICAgICAgICAgZGVmIG5vX21hdGNoaW5nX3JmYzI5NjUobnNfY29va2llLCBsb29rdXA9bG9va3VwKToKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gbnNfY29va2llLmRvbWFpbiwgbnNfY29va2llLnBhdGgsIG5zX2Nvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkgbm90IGluIGxvb2t1cAorICAgICAgICAgICAgICAgIG5zX2Nvb2tpZXMgPSBmaWx0ZXIobm9fbWF0Y2hpbmdfcmZjMjk2NSwgbnNfY29va2llcykKKworICAgICAgICAgICAgaWYgbnNfY29va2llczoKKyAgICAgICAgICAgICAgICBjb29raWVzLmV4dGVuZChuc19jb29raWVzKQorCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgc2V0X2Nvb2tpZV9pZl9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiJTZXQgYSBjb29raWUgaWYgcG9saWN5IHNheXMgaXQncyBPSyB0byBkbyBzby4iIiIKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKKworICAgICAgICBpZiBzZWxmLl9wb2xpY3kuc2V0X29rKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBzZXRfY29va2llKHNlbGYsIGNvb2tpZSk6CisgICAgICAgICIiIlNldCBhIGNvb2tpZSwgd2l0aG91dCBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgYmUgc2V0LiIiIgorICAgICAgICBjID0gc2VsZi5fY29va2llcworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gbm90IGluIGM6IGNbY29va2llLmRvbWFpbl0gPSB7fQorICAgICAgICAgICAgYzIgPSBjW2Nvb2tpZS5kb21haW5dCisgICAgICAgICAgICBpZiBjb29raWUucGF0aCBub3QgaW4gYzI6IGMyW2Nvb2tpZS5wYXRoXSA9IHt9CisgICAgICAgICAgICBjMyA9IGMyW2Nvb2tpZS5wYXRoXQorICAgICAgICAgICAgYzNbY29va2llLm5hbWVdID0gY29va2llCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgZXh0cmFjdF9jb29raWVzKHNlbGYsIHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgIiIiRXh0cmFjdCBjb29raWVzIGZyb20gcmVzcG9uc2UsIHdoZXJlIGFsbG93YWJsZSBnaXZlbiB0aGUgcmVxdWVzdC4iIiIKKyAgICAgICAgZGVidWcoImV4dHJhY3RfY29va2llczogJXMiLCByZXNwb25zZS5pbmZvKCkpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCisKKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmLm1ha2VfY29va2llcyhyZXNwb25zZSwgcmVxdWVzdCk6CisgICAgICAgICAgICBpZiBzZWxmLl9wb2xpY3kuc2V0X29rKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgZGVidWcoIiBzZXR0aW5nIGNvb2tpZTogJXMiLCBjb29raWUpCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGNvb2tpZSkKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGNsZWFyKHNlbGYsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNsZWFyIHNvbWUgY29va2llcy4KKworICAgICAgICBJbnZva2luZyB0aGlzIG1ldGhvZCB3aXRob3V0IGFyZ3VtZW50cyB3aWxsIGNsZWFyIGFsbCBjb29raWVzLiAgSWYKKyAgICAgICAgZ2l2ZW4gYSBzaW5nbGUgYXJndW1lbnQsIG9ubHkgY29va2llcyBiZWxvbmdpbmcgdG8gdGhhdCBkb21haW4gd2lsbCBiZQorICAgICAgICByZW1vdmVkLiAgSWYgZ2l2ZW4gdHdvIGFyZ3VtZW50cywgY29va2llcyBiZWxvbmdpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICBwYXRoIHdpdGhpbiB0aGF0IGRvbWFpbiBhcmUgcmVtb3ZlZC4gIElmIGdpdmVuIHRocmVlIGFyZ3VtZW50cywgdGhlbgorICAgICAgICB0aGUgY29va2llIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBwYXRoIGFuZCBkb21haW4gaXMgcmVtb3ZlZC4KKworICAgICAgICBSYWlzZXMgS2V5RXJyb3IgaWYgbm8gbWF0Y2hpbmcgY29va2llIGV4aXN0cy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIChkb21haW4gaXMgTm9uZSkgb3IgKHBhdGggaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImRvbWFpbiBhbmQgcGF0aCBtdXN0IGJlIGdpdmVuIHRvIHJlbW92ZSBhIGNvb2tpZSBieSBuYW1lIikKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jb29raWVzW2RvbWFpbl1bcGF0aF1bbmFtZV0KKyAgICAgICAgZWxpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImRvbWFpbiBtdXN0IGJlIGdpdmVuIHRvIHJlbW92ZSBjb29raWVzIGJ5IHBhdGgiKQorICAgICAgICAgICAgZGVsIHNlbGYuX2Nvb2tpZXNbZG9tYWluXVtwYXRoXQorICAgICAgICBlbGlmIGRvbWFpbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jb29raWVzW2RvbWFpbl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSB7fQorCisgICAgZGVmIGNsZWFyX3Nlc3Npb25fY29va2llcyhzZWxmKToKKyAgICAgICAgIiIiRGlzY2FyZCBhbGwgc2Vzc2lvbiBjb29raWVzLgorCisgICAgICAgIE5vdGUgdGhhdCB0aGUgLnNhdmUoKSBtZXRob2Qgd29uJ3Qgc2F2ZSBzZXNzaW9uIGNvb2tpZXMgYW55d2F5LCB1bmxlc3MKKyAgICAgICAgeW91IGFzayBvdGhlcndpc2UgYnkgcGFzc2luZyBhIHRydWUgaWdub3JlX2Rpc2NhcmQgYXJndW1lbnQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgaWYgY29va2llLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5jbGVhcihjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBjbGVhcl9leHBpcmVkX2Nvb2tpZXMoc2VsZik6CisgICAgICAgICIiIkRpc2NhcmQgYWxsIGV4cGlyZWQgY29va2llcy4KKworICAgICAgICBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kOiBleHBpcmVkIGNvb2tpZXMgYXJlIG5ldmVyCisgICAgICAgIHNlbnQgYmFjayB0byB0aGUgc2VydmVyIChwcm92aWRlZCB5b3UncmUgdXNpbmcgRGVmYXVsdENvb2tpZVBvbGljeSksCisgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBDb29raWVKYXIgaXRzZWxmIGV2ZXJ5IHNvIG9mdGVuLCBhbmQgdGhlCisgICAgICAgIC5zYXZlKCkgbWV0aG9kIHdvbid0IHNhdmUgZXhwaXJlZCBjb29raWVzIGFueXdheSAodW5sZXNzIHlvdSBhc2sKKyAgICAgICAgb3RoZXJ3aXNlIGJ5IHBhc3NpbmcgYSB0cnVlIGlnbm9yZV9leHBpcmVzIGFyZ3VtZW50KS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6CisgICAgICAgICAgICBpZiBjb29raWUuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKQorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBkZWVwdmFsdWVzKHNlbGYuX2Nvb2tpZXMpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG51bWJlciBvZiBjb250YWluZWQgY29va2llcy4iIiIKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOiBpID0gaSArIDEKKyAgICAgICAgcmV0dXJuIGkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjogci5hcHBlbmQocmVwcihjb29raWUpKQorICAgICAgICByZXR1cm4gIjwlc1slc10+IiAlIChzZWxmLl9fY2xhc3NfXywgIiwgIi5qb2luKHIpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHIgPSBbXQorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6IHIuYXBwZW5kKHN0cihjb29raWUpKQorICAgICAgICByZXR1cm4gIjwlc1slc10+IiAlIChzZWxmLl9fY2xhc3NfXywgIiwgIi5qb2luKHIpKQorCisKK2NsYXNzIExvYWRFcnJvcihFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIEZpbGVDb29raWVKYXIoQ29va2llSmFyKToKKyAgICAiIiJDb29raWVKYXIgdGhhdCBjYW4gYmUgbG9hZGVkIGZyb20gYW5kIHNhdmVkIHRvIGEgZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lLCBkZWxheWxvYWQ9RmFsc2UsIHBvbGljeT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENvb2tpZXMgYXJlIE5PVCBsb2FkZWQgZnJvbSB0aGUgbmFtZWQgZmlsZSB1bnRpbCBlaXRoZXIgdGhlIC5sb2FkKCkgb3IKKyAgICAgICAgLnJldmVydCgpIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIENvb2tpZUphci5fX2luaXRfXyhzZWxmLCBwb2xpY3kpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGVuYW1lKyIiCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmlsZW5hbWUgbXVzdCBiZSBzdHJpbmctbGlrZSIpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmRlbGF5bG9hZCA9IGJvb2woZGVsYXlsb2FkKQorCisgICAgZGVmIHNhdmUoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgIiIiU2F2ZSBjb29raWVzIHRvIGEgZmlsZS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgbG9hZChzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICAiIiJMb2FkIGNvb2tpZXMgZnJvbSBhIGZpbGUuIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9yZWFsbHlfbG9hZChmLCBmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgcmV2ZXJ0KHNlbGYsIGZpbGVuYW1lPU5vbmUsCisgICAgICAgICAgICAgICBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICAiIiJDbGVhciBhbGwgY29va2llcyBhbmQgcmVsb2FkIGNvb2tpZXMgZnJvbSBhIHNhdmVkIGZpbGUuCisKKyAgICAgICAgUmFpc2VzIExvYWRFcnJvciAob3IgSU9FcnJvcikgaWYgcmV2ZXJzaW9uIGlzIG5vdCBzdWNjZXNzZnVsOyB0aGUKKyAgICAgICAgb2JqZWN0J3Mgc3RhdGUgd2lsbCBub3QgYmUgYWx0ZXJlZCBpZiB0aGlzIGhhcHBlbnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKworICAgICAgICBvbGRfc3RhdGUgPSBjb3B5LmRlZXBjb3B5KHNlbGYuX2Nvb2tpZXMpCisgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcykKKyAgICAgICAgZXhjZXB0IChMb2FkRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IG9sZF9zdGF0ZQorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKK2Zyb20gX0xXUENvb2tpZUphciBpbXBvcnQgTFdQQ29va2llSmFyLCBsd3BfY29va2llX3N0cgorZnJvbSBfTW96aWxsYUNvb2tpZUphciBpbXBvcnQgTW96aWxsYUNvb2tpZUphcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM5ZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKQEAgLTAsMCArMSwxNjIwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiVGVzdHMgZm9yIGNvb2tpZWxpYi5weS4iIiIKKworaW1wb3J0IHJlLCBvcywgdGltZQorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgRGF0ZVRpbWVUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90aW1lMmlzb3ooc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCB0aW1lMmlzb3oKKworICAgICAgICBiYXNlID0gMTAxOTIyNzAwMAorICAgICAgICBkYXkgPSAyNCozNjAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRpbWUyaXNveihiYXNlKSwgIjIwMDItMDQtMTkgMTQ6MzY6NDBaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrZGF5KSwgIjIwMDItMDQtMjAgMTQ6MzY6NDBaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrMipkYXkpLCAiMjAwMi0wNC0yMSAxNDozNjo0MFoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSszKmRheSksICIyMDAyLTA0LTIyIDE0OjM2OjQwWiIpCisKKyAgICAgICAgYXogPSB0aW1lMmlzb3ooKQorICAgICAgICBieiA9IHRpbWUyaXNveig1MDAwMDApCisgICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgdGltZTJpc296IGZvcm1hdDogJXMgJXMiICUgKGF6LCBieikpCisKKyAgICBkZWYgdGVzdF9odHRwMnRpbWUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUKKworICAgICAgICBkZWYgcGFyc2VfZGF0ZSh0ZXh0KToKKyAgICAgICAgICAgIHJldHVybiB0aW1lLmdtdGltZShodHRwMnRpbWUodGV4dCkpWzo2XQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2RhdGUoIjAxIEphbiAyMDAxIiksICgyMDAxLCAxLCAxLCAwLCAwLCAwLjApKQorCisgICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYXJvdW5kIHllYXIgMjA3MAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZV9kYXRlKCIwMy1GZWItMjAiKSwgKDIwMjAsIDIsIDMsIDAsIDAsIDAuMCkpCisKKyAgICAgICAgIyB0aGlzIHRlc3Qgd2lsbCBicmVhayBhcm91bmQgeWVhciAyMDQ4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2RhdGUoIjAzLUZlYi05OCIpLCAoMTk5OCwgMiwgMywgMCwgMCwgMC4wKSkKKworICAgIGRlZiB0ZXN0X2h0dHAydGltZV9mb3JtYXRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lLCB0aW1lMmlzb3oKKworICAgICAgICAjIHRlc3QgaHR0cDJ0aW1lIGZvciBzdXBwb3J0ZWQgZGF0ZXMuICBUZXN0IGNhc2VzIHdpdGggMiBkaWdpdCB5ZWFyCisgICAgICAgICMgd2lsbCBwcm9iYWJseSBicmVhayBpbiB5ZWFyIDIwNDQuCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgJ1RodSwgMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgcHJvcG9zZWQgbmV3IEhUVFAgZm9ybWF0CisgICAgICAgICAnVGh1cnNkYXksIDAzLUZlYi05NCAwMDowMDowMCBHTVQnLCAgIyBvbGQgcmZjODUwIEhUVFAgZm9ybWF0CisgICAgICAgICAnVGh1cnNkYXksIDAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQKKworICAgICAgICAgJzAzIEZlYiAxOTk0IDAwOjAwOjAwIEdNVCcsICAjIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5KQorICAgICAgICAgJzAzLUZlYi05NCAwMDowMDowMCBHTVQnLCAgIyBvbGQgcmZjODUwIChubyB3ZWVrZGF5KQorICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXkpCisgICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDAgR01UJywgICMgYnJva2VuIHJmYzg1MCAobm8gd2Vla2RheSwgbm8gc2Vjb25kcykKKyAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXksIG5vIHNlY29uZHMsIG5vIHR6KQorCisgICAgICAgICAnMDMtRmViLTk0JywgICMgb2xkIHJmYzg1MCBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSwgbm8gdGltZSkKKyAgICAgICAgICcwMy1GZWItMTk5NCcsICAjIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCisgICAgICAgICAnMDMgRmViIDE5OTQnLCAgIyBwcm9wb3NlZCBuZXcgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCisKKyAgICAgICAgICMgQSBmZXcgdGVzdHMgd2l0aCBleHRyYSBzcGFjZSBhdCB2YXJpb3VzIHBsYWNlcworICAgICAgICAgJyAgMDMgICBGZWIgICAxOTk0ICAwOjAwICAnLAorICAgICAgICAgJyAgMDMtRmViLTE5OTQgICcsCisgICAgICAgIF0KKworICAgICAgICB0ZXN0X3QgPSA3NjAyMzM2MDAgICMgYXNzdW1lIGJyb2tlbiBQT1NJWCBjb3VudGluZyBvZiBzZWNvbmRzCisgICAgICAgIHJlc3VsdCA9IHRpbWUyaXNveih0ZXN0X3QpCisgICAgICAgIGV4cGVjdGVkID0gIjE5OTQtMDItMDMgMDA6MDA6MDBaIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgID0+ICAnJXMnICglcykiICUgKHRlc3RfdCwgcmVzdWx0LCBleHBlY3RlZCkpCisKKyAgICAgICAgZm9yIHMgaW4gdGVzdHM6CisgICAgICAgICAgICB0ID0gaHR0cDJ0aW1lKHMpCisgICAgICAgICAgICB0MiA9IGh0dHAydGltZShzLmxvd2VyKCkpCisgICAgICAgICAgICB0MyA9IGh0dHAydGltZShzLnVwcGVyKCkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ID09IHQyID09IHQzID09IHRlc3RfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAgPT4gICVzLCAlcywgJXMgKCVzKSIgJSAocywgdCwgdDIsIHQzLCB0ZXN0X3QpKQorCisgICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2dhcmJhZ2Uoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUKKworICAgICAgICBmb3IgdGVzdCBpbiBbCisgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICdHYXJiYWdlJywKKyAgICAgICAgICAgICdNYW5kYWcgMTYuIFNlcHRlbWJlciAxOTk2JywKKyAgICAgICAgICAgICcwMS0wMC0xOTgwJywKKyAgICAgICAgICAgICcwMS0xMy0xOTgwJywKKyAgICAgICAgICAgICcwMC0wMS0xOTgwJywKKyAgICAgICAgICAgICczMi0wMS0xOTgwJywKKyAgICAgICAgICAgICcwMS0wMS0xOTgwIDI1OjAwOjAwJywKKyAgICAgICAgICAgICcwMS0wMS0xOTgwIDAwOjYxOjAwJywKKyAgICAgICAgICAgICcwMS0wMS0xOTgwIDAwOjAwOjYyJywKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oaHR0cDJ0aW1lKHRlc3QpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSglcykgaXMgbm90IE5vbmVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDJ0aW1lKHRlc3QpICVzIiAlICh0ZXN0LCBodHRwMnRpbWUodGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisKK2NsYXNzIEhlYWRlclRlc3RzKFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycworCisgICAgICAgICMgcXVvdGVzIHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAgICBleHBlY3RlZCA9IFtbKCdleHBpcmVzJywgMjIwOTA2OTQxMkwpLCAoJ3ZlcnNpb24nLCAnMCcpXV0KKyAgICAgICAgZm9yIGhkciBpbiBbCisgICAgICAgICAgICAnZXhwaXJlcz0wMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQnLAorICAgICAgICAgICAgJ2V4cGlyZXM9IjAxIEphbiAyMDQwIDIyOjIzOjMyIEdNVCInLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2pvaW5faGVhZGVyX3dvcmRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgam9pbl9oZWFkZXJfd29yZHMKKworICAgICAgICBqb2luZWQgPSBqb2luX2hlYWRlcl93b3JkcyhbWygiZm9vIiwgTm9uZSksICgiYmFyIiwgImJheiIpXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGpvaW5lZCwgImZvbzsgYmFyPWJheiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoam9pbl9oZWFkZXJfd29yZHMoW1tdXSksICIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfaGVhZGVyX3dvcmRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgc3BsaXRfaGVhZGVyX3dvcmRzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoImZvbyIsIFtbKCJmb28iLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiZm9vPWJhciIsIFtbKCJmb28iLCAiYmFyIildXSksCisgICAgICAgICAgICAoIiAgIGZvbyAgICIsIFtbKCJmb28iLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vPSAgICIsIFtbKCJmb28iLCAiIildXSksCisgICAgICAgICAgICAoIiAgIGZvbz0iLCBbWygiZm9vIiwgIiIpXV0pLAorICAgICAgICAgICAgKCIgICBmb289ICAgOyAiLCBbWygiZm9vIiwgIiIpXV0pLAorICAgICAgICAgICAgKCIgICBmb289ICAgOyBiYXI9IGJheiAiLCBbWygiZm9vIiwgIiIpLCAoImJhciIsICJiYXoiKV1dKSwKKyAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgW1soImZvbyIsICJiYXIiKSwgKCJiYXIiLCAiYmF6IildXSksCisgICAgICAgICAgICAjIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBpZiB0aGlzIG5leHQgZmFpbHMsIGJ1dCBpdCB3b3JrcyBBVE0KKyAgICAgICAgICAgICgiZm9vPSBiYXI9YmF6IiwgW1soImZvbyIsICJiYXI9YmF6IildXSksCisgICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsIFtbKCJmb28iLCAiYmFyIiksICgiYmFyIiwgImJheiIpXV0pLAorICAgICAgICAgICAgKCdmb28gYmFyIGJheicsIFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCBOb25lKSwgKCJiYXoiLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiYSwgYiwgYyIsIFtbKCJhIiwgTm9uZSldLCBbKCJiIiwgTm9uZSldLCBbKCJjIiwgTm9uZSldXSksCisgICAgICAgICAgICAocidmb287IGJhcj1iYXosIHNwYW09LCBmb289IlwsXDtcIiIsIGJhcj0gJywKKyAgICAgICAgICAgICBbWygiZm9vIiwgTm9uZSksICgiYmFyIiwgImJheiIpXSwKKyAgICAgICAgICAgICAgWygic3BhbSIsICIiKV0sIFsoImZvbyIsICcsOyInKV0sIFsoImJhciIsICIiKV1dKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgYXJnLCBleHBlY3QgaW4gdGVzdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3BsaXRfaGVhZGVyX3dvcmRzKFthcmddKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2ssIFN0cmluZ0lPCisgICAgICAgICAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKE5vbmUsIGYpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIihlcnJvciAtLSB0cmFjZWJhY2sgZm9sbG93cylcblxuJXMiICUgZi5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQsICBleHBlY3QsICIiIgorV2hlbiBwYXJzaW5nOiAnJXMnCitFeHBlY3RlZDogICAgICclcycKK0dvdDogICAgICAgICAgJyVzJworIiIiICUgKGFyZywgZXhwZWN0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgc3BsaXRfaGVhZGVyX3dvcmRzLCBqb2luX2hlYWRlcl93b3JkcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKCJmb28iLCAiZm9vIiksCisgICAgICAgICAgICAoImZvbz1iYXIiLCAiZm9vPWJhciIpLAorICAgICAgICAgICAgKCIgICBmb28gICAiLCAiZm9vIiksCisgICAgICAgICAgICAoImZvbz0iLCAnZm9vPSIiJyksCisgICAgICAgICAgICAoImZvbz1iYXIgYmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCisgICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCisgICAgICAgICAgICAoJ2ZvbyBiYXIgYmF6JywgImZvbzsgYmFyOyBiYXoiKSwKKyAgICAgICAgICAgIChyJ2Zvbz0iXCIiIGJhcj0iXFwiJywgcidmb289IlwiIjsgYmFyPSJcXCInKSwKKyAgICAgICAgICAgICgnZm9vLCwsYmFyJywgJ2ZvbywgYmFyJyksCisgICAgICAgICAgICAoJ2Zvbz1iYXIsYmFyPWJheicsICdmb289YmFyLCBiYXI9YmF6JyksCisKKyAgICAgICAgICAgICgndGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEnLAorICAgICAgICAgICAgICd0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiJyksCisKKyAgICAgICAgICAgICgnZm9vPSJiYXIiOyBwb3J0PSI4MCw4MSI7IGRpc2NhcmQsIGJhcj1iYXonLAorICAgICAgICAgICAgICdmb289YmFyOyBwb3J0PSI4MCw4MSI7IGRpc2NhcmQsIGJhcj1iYXonKSwKKworICAgICAgICAgICAgKHInQmFzaWMgcmVhbG09IlwiZm9vXFxcXGJhclwiIicsCisgICAgICAgICAgICAgcidCYXNpYzsgcmVhbG09IlwiZm9vXFxcXGJhclwiIicpCisgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIGFyZywgZXhwZWN0IGluIHRlc3RzOgorICAgICAgICAgICAgaW5wdXQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCisgICAgICAgICAgICByZXMgPSBqb2luX2hlYWRlcl93b3JkcyhpbnB1dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcywgZXhwZWN0LCAiIiIKK1doZW4gcGFyc2luZzogJyVzJworRXhwZWN0ZWQ6ICAgICAnJXMnCitHb3Q6ICAgICAgICAgICclcycKK0lucHV0IHdhczogICAgJyVzJworIiIiICUgKGFyZywgZXhwZWN0LCByZXMsIGlucHV0KSkKKworCitjbGFzcyBGYWtlUmVzcG9uc2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9W10sIHVybD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIGhlYWRlcnM6IGxpc3Qgb2YgUkZDODIyLXN0eWxlICdLZXk6IHZhbHVlJyBzdHJpbmdzCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgbWltZXRvb2xzLCBTdHJpbmdJTworICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oIlxuIi5qb2luKGhlYWRlcnMpKQorICAgICAgICBzZWxmLl9oZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoZikKKyAgICAgICAgc2VsZi5fdXJsID0gdXJsCisgICAgZGVmIGluZm8oc2VsZik6IHJldHVybiBzZWxmLl9oZWFkZXJzCisKK2RlZiBpbnRlcmFjdF8yOTY1KGNvb2tpZWphciwgdXJsLCAqc2V0X2Nvb2tpZV9oZHJzKToKKyAgICByZXR1cm4gX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsICJTZXQtQ29va2llMiIpCisKK2RlZiBpbnRlcmFjdF9uZXRzY2FwZShjb29raWVqYXIsIHVybCwgKnNldF9jb29raWVfaGRycyk6CisgICAgcmV0dXJuIF9pbnRlcmFjdChjb29raWVqYXIsIHVybCwgc2V0X2Nvb2tpZV9oZHJzLCAiU2V0LUNvb2tpZSIpCisKK2RlZiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgaGRyX25hbWUpOgorICAgICIiIlBlcmZvcm0gYSBzaW5nbGUgcmVxdWVzdCAvIHJlc3BvbnNlIGN5Y2xlLCByZXR1cm5pbmcgQ29va2llOiBoZWFkZXIuIiIiCisgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgY29va2llamFyLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICBjb29raWVfaGRyID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIsICIiKQorICAgIGhlYWRlcnMgPSBbXQorICAgIGZvciBoZHIgaW4gc2V0X2Nvb2tpZV9oZHJzOgorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiJXM6ICVzIiAlIChoZHJfbmFtZSwgaGRyKSkKKyAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgdXJsKQorICAgIGNvb2tpZWphci5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgcmV0dXJuIGNvb2tpZV9oZHIKKworCitjbGFzcyBDb29raWVUZXN0cyhUZXN0Q2FzZSk6CisgICAgIyBYWFgKKyAgICAjIEdldCByaWQgb2Ygc3RyaW5nIGNvbXBhcmlzb25zIHdoZXJlIG5vdCBhY3R1YWxseSB0ZXN0aW5nIHN0ciAvIHJlcHIuCisgICAgIyAuY2xlYXIoKSBldGMuCisgICAgIyBJUCBhZGRyZXNzZXMgbGlrZSA1MCAoc2luZ2xlIG51bWJlciwgbm8gZG90KSBhbmQgZG9tYWluLW1hdGNoaW5nCisgICAgIyAgZnVuY3Rpb25zIChhbmQgaXNfSEROKT8gIFNlZSBkcmFmdCBSRkMgMjk2NSBlcnJhdGEuCisgICAgIyBTdHJpY3RuZXNzIHN3aXRjaGVzCisgICAgIyBpc190aGlyZF9wYXJ0eSgpCisgICAgIyB1bnZlcmlmaWFiaWxpdHkgLyB0aGlyZC1wYXJ0eSBibG9ja2luZworICAgICMgTmV0c2NhcGUgY29va2llcyB3b3JrIHRoZSBzYW1lIGFzIFJGQyAyOTY1IHdpdGggcmVnYXJkIHRvIHBvcnQuCisgICAgIyBTZXQtQ29va2llIHdpdGggbmVnYXRpdmUgbWF4IGFnZS4KKyAgICAjIElmIHR1cm4gUkZDIDI5NjUgaGFuZGxpbmcgb2ZmLCBTZXQtQ29va2llMiBjb29raWVzIHNob3VsZCBub3QgY2xvYmJlcgorICAgICMgIFNldC1Db29raWUgY29va2llcy4KKyAgICAjIENvb2tpZTIgc2hvdWxkIGJlIHNlbnQgaWYgKmFueSogY29va2llcyBhcmUgbm90IFYxIChpZS4gVjAgT1IgVjIgZXRjLikuCisgICAgIyBDb29raWVzIChWMSBhbmQgVjApIHdpdGggbm8gZXhwaXJ5IGRhdGUgc2hvdWxkIGJlIHNldCB0byBiZSBkaXNjYXJkZWQuCisgICAgIyBSRkMgMjk2NSBRdW90aW5nOgorICAgICMgIFNob3VsZCBhY2NlcHQgdW5xdW90ZWQgY29va2llLWF0dHJpYnV0ZSB2YWx1ZXM/ICBjaGVjayBlcnJhdGEgZHJhZnQuCisgICAgIyAgIFdoaWNoIGFyZSByZXF1aXJlZCBvbiB0aGUgd2F5IGluIGFuZCBvdXQ/CisgICAgIyAgU2hvdWxkIGFsd2F5cyByZXR1cm4gcXVvdGVkIGNvb2tpZS1hdHRyaWJ1dGUgdmFsdWVzPworICAgICMgUHJvcGVyIHRlc3Rpbmcgb2Ygd2hlbiBSRkMgMjk2NSBjbG9iYmVycyBOZXRzY2FwZSAod2FpdGluZyBmb3IgZXJyYXRhKS4KKyAgICAjIFBhdGgtbWF0Y2ggb24gcmV0dXJuIChzYW1lIGZvciBWMCBhbmQgVjEpLgorICAgICMgUkZDIDI5NjUgYWNjZXB0YW5jZSBhbmQgcmV0dXJuaW5nIHJ1bGVzCisgICAgIyAgU2V0LUNvb2tpZTIgd2l0aG91dCB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyByZWplY3RlZC4KKworICAgICMgTmV0c2NhcGUgcGVjdWxpYXJpdGllcyBsaXN0IGZyb20gUm9uYWxkIFRzY2hhbGFyLgorICAgICMgVGhlIGZpcnN0IHR3byBzdGlsbCBuZWVkIHRlc3RzLCB0aGUgcmVzdCBhcmUgY292ZXJlZC4KKyMjIC0gUXVvdGluZzogb25seSBxdW90ZXMgYXJvdW5kIHRoZSBleHBpcmVzIHZhbHVlIGFyZSByZWNvZ25pemVkIGFzIHN1Y2gKKyMjICAgKGFuZCB5ZXMsIHNvbWUgZm9sa3MgcXVvdGUgdGhlIGV4cGlyZXMgdmFsdWUpOyBxdW90ZXMgYXJvdW5kIGFueSBvdGhlcgorIyMgICB2YWx1ZSBhcmUgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSB2YWx1ZS4KKyMjIC0gV2hpdGUgc3BhY2U6IHdoaXRlIHNwYWNlIGFyb3VuZCBuYW1lcyBhbmQgdmFsdWVzIGlzIGlnbm9yZWQKKyMjIC0gRGVmYXVsdCBwYXRoOiBpZiBubyBwYXRoIHBhcmFtZXRlciBpcyBnaXZlbiwgdGhlIHBhdGggZGVmYXVsdHMgdG8gdGhlCisjIyAgIHBhdGggaW4gdGhlIHJlcXVlc3QtdXJpIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgJy8nLiBOb3RlCisjIyAgIHRoYXQgdGhpcyBpcyBlbnRpcmVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBzcGVjIHNheXMuCisjIyAtIENvbW1hcyBhbmQgb3RoZXIgZGVsaW1pdGVyczogTmV0c2NhcGUganVzdCBwYXJzZXMgdW50aWwgdGhlIG5leHQgJzsnLgorIyMgICBUaGlzIG1lYW5zIGl0IHdpbGwgYWxsb3cgY29tbWFzIGV0YyBpbnNpZGUgdmFsdWVzIChhbmQgeWVzLCBib3RoCisjIyAgIGNvbW1hcyBhbmQgZXF1YWxzIGFyZSBjb21tb25seSBhcHBlYXIgaW4gdGhlIGNvb2tpZSB2YWx1ZSkuIFRoaXMgYWxzbworIyMgICBtZWFucyB0aGF0IGlmIHlvdSBmb2xkIG11bHRpcGxlIFNldC1Db29raWUgaGVhZGVyIGZpZWxkcyBpbnRvIG9uZSwKKyMjICAgY29tbWEtc2VwYXJhdGVkIGxpc3QsIGl0J2xsIGJlIGEgaGVhZGFjaGUgdG8gcGFyc2UgKGF0IGxlYXN0IG15IGhlYWQKKyMjICAgc3RhcnRzIGh1cnRpbmcgZXZlcnl0aW1lIEkgdGhpbmsgb2YgdGhhdCBjb2RlKS4KKyMjIC0gRXhwaXJlczogWW91J2xsIGdldCBhbGwgc29ydHMgb2YgZGF0ZSBmb3JtYXRzIGluIHRoZSBleHBpcmVzLAorIyMgICBpbmNsdWRpbmcgZW10cHkgZXhwaXJlcyBhdHRyaWJ1dGVzICgiZXhwaXJlcz0iKS4gQmUgYXMgZmxleGlibGUgYXMgeW91CisjIyAgIGNhbiwgYW5kIGNlcnRhaW5seSBkb24ndCBleHBlY3QgdGhlIHdlZWtkYXkgdG8gYmUgdGhlcmU7IGlmIHlvdSBjYW4ndAorIyMgICBwYXJzZSBpdCwganVzdCBpZ25vcmUgaXQgYW5kIHByZXRlbmQgaXQncyBhIHNlc3Npb24gY29va2llLgorIyMgLSBEb21haW4tbWF0Y2hpbmc6IE5ldHNjYXBlIHVzZXMgdGhlIDItZG90IHJ1bGUgZm9yIF9hbGxfIGRvbWFpbnMsIG5vdAorIyMgICBqdXN0IHRoZSA3IHNwZWNpYWwgVExEJ3MgbGlzdGVkIGluIHRoZWlyIHNwZWMuIEFuZCBmb2xrcyByZWx5IG9uCisjIyAgIHRoYXQuLi4KKworICAgIGRlZiB0ZXN0X2RvbWFpbl9yZXR1cm5fb2soc2VsZik6CisgICAgICAgICMgdGVzdCBvcHRpbWl6YXRpb246IC5kb21haW5fcmV0dXJuX29rKCkgc2hvdWxkIGZpbHRlciBvdXQgbW9zdAorICAgICAgICAjIGRvbWFpbnMgaW4gdGhlIENvb2tpZUphciBiZWZvcmUgd2UgdHJ5IHRvIGFjY2VzcyB0aGVtIChiZWNhdXNlIHRoYXQKKyAgICAgICAgIyBtYXkgcmVxdWlyZSBkaXNrIGFjY2VzcyAtLSBpbiBwYXJ0aWN1bGFyLCB3aXRoIE1TSUVDb29raWVKYXIpCisgICAgICAgICMgVGhpcyBpcyBvbmx5IGEgcm91Z2ggY2hlY2sgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHNvIGl0J3Mgbm90IHRvbworICAgICAgICAjIGNyaXRpY2FsIGFzIGxvbmcgYXMgaXQncyBzdWZmaWNpZW50bHkgbGliZXJhbC4KKyAgICAgICAgaW1wb3J0IGNvb2tpZWxpYiwgdXJsbGliMgorICAgICAgICBwb2wgPSBjb29raWVsaWIuRGVmYXVsdENvb2tpZVBvbGljeSgpCisgICAgICAgIGZvciB1cmwsIGRvbWFpbiwgb2sgaW4gWworICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImJsYWguY29tIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgInJodWJhcmIuYmxhaC5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAicmh1YmFyYi5mb28uYmFyLmNvbSIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuZm9vLmJhci5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJmb28uYmFyLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgIi5iYXIuY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJyaHViYXJiLmZvby5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICIuZm9vLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgInJodWJhcmIuZm9vIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICIuZm9vIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgImZvbyIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJmb28ubG9jYWwiLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiLmxvY2FsIiwgVHJ1ZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgcmVxdWVzdCA9IHVybGxpYjIuUmVxdWVzdCh1cmwpCisgICAgICAgICAgICByID0gcG9sLmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KQorICAgICAgICAgICAgaWYgb2s6IHNlbGYuYXNzZXJ0XyhyKQorICAgICAgICAgICAgZWxzZTogc2VsZi5hc3NlcnRfKG5vdCByKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ192YWx1ZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IE1vemlsbGFDb29raWVKYXIsIGx3cF9jb29raWVfc3RyCisKKyAgICAgICAgIyBtaXNzaW5nID0gc2lnbiBpbiBDb29raWU6IGhlYWRlciBpcyByZWdhcmRlZCBieSBNb3ppbGxhIGFzIGEgbWlzc2luZworICAgICAgICAjIG5hbWUsIGFuZCBieSBjb29raWVsaWIgYXMgYSBtaXNzaW5nIHZhbHVlCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3MnKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZWdncyJdCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICJlZ2dzIikKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bJy9mb28vJ11bJyJzcGFtIiddCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICcic3BhbSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsd3BfY29va2llX3N0cihjb29raWUpLCAoCisgICAgICAgICAgICByJyJzcGFtIjsgcGF0aD0iL2Zvby8iOyBkb21haW49Ind3dy5hY21lLmNvbSI7ICcKKyAgICAgICAgICAgICdwYXRoX3NwZWM7IGRpc2NhcmQ7IHZlcnNpb249MCcpKQorICAgICAgICBvbGRfc3RyID0gcmVwcihjKQorICAgICAgICBjLnNhdmUoaWdub3JlX2V4cGlyZXM9VHJ1ZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUpCisgICAgICAgICAgICBjLnJldmVydChpZ25vcmVfZXhwaXJlcz1UcnVlLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGMuZmlsZW5hbWUpCisgICAgICAgICMgY29va2llcyB1bmNoYW5nZWQgYXBhcnQgZnJvbSBsb3N0IGluZm8gcmUuIHdoZXRoZXIgcGF0aCB3YXMgc3BlY2lmaWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgcmVwcihjKSwKKyAgICAgICAgICAgIHJlLnN1YigicGF0aF9zcGVjaWZpZWQ9JXMiICUgVHJ1ZSwgInBhdGhfc3BlY2lmaWVkPSVzIiAlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgIG9sZF9zdHIpCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyJzcGFtIjsgZWdncycpCisKKyAgICBkZWYgdGVzdF9uc19wYXJzZXIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERFRkFVTFRfSFRUUF9QT1JUCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IERvTWFpbj0uYWNtZS5jb207IHBvcnQ7IGJsQXJnaD0iZmVlcCInKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnbmk9bmk7IHBvcnQ9ODAsODA4MCcpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICduaW5pPW5pJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwgJ2Zvbz1iYXI7IGV4cGlyZXM9JykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwgJ3NwYW09ZWdnczsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0iRm9vIEJhciAyNSAzMzoyMjoxMSAzMDIyIicpCisKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1siLmFjbWUuY29tIl1bIi8iXVsic3BhbSJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICIuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCBERUZBVUxUX0hUVFBfUE9SVCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgICMgY2FzZSBpcyBwcmVzZXJ2ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS5oYXNfbm9uc3RhbmRhcmRfYXR0cigiYmxBcmdoIikgYW5kCisgICAgICAgICAgICAgICAgICAgICBub3QgY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibGFyZ2giKSkKKworICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJuaSJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICJ3d3cuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUucG9ydCwgIjgwLDgwODAiKQorICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnRfc3BlY2lmaWVkKQorCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pbmkiXQorICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisKKyAgICAgICAgIyBpbnZhbGlkIGV4cGlyZXMgc2hvdWxkIG5vdCBjYXVzZSBjb29raWUgdG8gYmUgZHJvcHBlZAorICAgICAgICBmb28gPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28iXQorICAgICAgICBzcGFtID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vIl0KKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvby5leHBpcmVzIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzcGFtLmV4cGlyZXMgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X2V4cGlyZXMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCB0aW1lMm5ldHNjYXBlLCBDb29raWVKYXIKKworICAgICAgICAjIGlmIGV4cGlyZXMgaXMgaW4gZnV0dXJlLCBrZWVwIGNvb2tpZS4uLgorICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgZnV0dXJlID0gdGltZTJuZXRzY2FwZSh0aW1lLnRpbWUoKSszNjAwKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgbm93ID0gdGltZTJuZXRzY2FwZSh0aW1lLnRpbWUoKS0xKQorICAgICAgICAjIC4uLiBhbmQgaWYgaW4gcGFzdCBvciBwcmVzZW50LCBkaXNjYXJkIGl0CisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdmb289ImVnZ3MiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdykKKyAgICAgICAgaCA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtPSJiYXIiJyBpbiBoIGFuZCAiZm9vIiBub3QgaW4gaCkKKworICAgICAgICAjIG1heC1hZ2UgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV4cGlyZXMsIGFuZCB6ZXJvIG1heC1hZ2UgaXMgcmVxdWVzdCB0bworICAgICAgICAjIGRlbGV0ZSBib3RoIG5ldyBjb29raWUgYW5kIGFueSBvbGQgbWF0Y2hpbmcgY29va2llCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzPSJiYXIiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Jhcj0iYmFyIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3M9ImJhciI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyZXM9JXM7IG1heC1hZ2U9MCcgJSBmdXR1cmUpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdiYXI9ImJhciI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heC1hZ2U9MDsgZXhwaXJlcz0lcycgJSBmdXR1cmUpCisgICAgICAgIGggPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisKKyAgICAgICAgIyB0ZXN0IGV4cGlyeSBhdCBlbmQgb2Ygc2Vzc2lvbiBmb3IgY29va2llcyB3aXRoIG5vIGV4cGlyZXMgYXR0cmlidXRlCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LnJodWJhcmIubmV0LyIsICd3aHVtPSJmaXp6IicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKyAgICAgICAgYy5jbGVhcl9zZXNzaW9uX2Nvb2tpZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xygnc3BhbT0iYmFyIicgaW4gaCkKKworICAgICAgICAjIFhYWCBSRkMgMjk2NSBleHBpcnkgcnVsZXMgKHNvbWUgYXBwbHkgdG8gVjAgdG9vKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgIyBSRkMgMjk2NQorICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsCisgICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCIvYmxhaC8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYi8iLAorICAgICAgICAgICAgICAgICAgICAgICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiL2JsYWgvcmh1YmFyYi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgICMgTmV0c2NhcGUKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3NwYW09ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoIiwgJ2VnZ3M9ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIiLCAnZWdncz0iYmFyIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiL2JsYWgiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwgJ2VnZ3M9ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aAorICAgICAgICBjYXNlcyA9IFsKKyAgICAgICAgICAgICMgcXVvdGVkIHNhZmUKKyAgICAgICAgICAgICgiL2ZvbyUyZi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKKyAgICAgICAgICAgICgiL2ZvbyUyRi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKKyAgICAgICAgICAgICMgcXVvdGVkICUKKyAgICAgICAgICAgICgiL2ZvbyUlL2JhciIsICIvZm9vJSUvYmFyIiksCisgICAgICAgICAgICAjIHF1b3RlZCB1bnNhZmUKKyAgICAgICAgICAgICgiL2ZvJTE5by9iYXIiLCAiL2ZvJTE5by9iYXIiKSwKKyAgICAgICAgICAgICgiL2ZvJTdkby9iYXIiLCAiL2ZvJTdEby9iYXIiKSwKKyAgICAgICAgICAgICMgdW5xdW90ZWQgc2FmZQorICAgICAgICAgICAgKCIvZm9vL2JhciYiLCAiL2Zvby9iYXImIiksCisgICAgICAgICAgICAoIi9mb28vL2JhciIsICIvZm9vLy9iYXIiKSwKKyAgICAgICAgICAgICgiXDE3Ni9mb28vYmFyIiwgIlwxNzYvZm9vL2JhciIpLAorICAgICAgICAgICAgIyB1bnF1b3RlZCB1bnNhZmUKKyAgICAgICAgICAgICgiL2Zvb1wwMzEvYmFyIiwgIi9mb28lMTkvYmFyIiksCisgICAgICAgICAgICAoIi9cMTc1Zm9vL2JhciIsICIvJTdEZm9vL2JhciIpLAorICAgICAgICAgICAgIyB1bmljb2RlCisgICAgICAgICAgICAodSIvZm9vL2Jhclx1YWJjZCIsICIvZm9vL2JhciVFQSVBRiU4RCIpLCAgIyBVVEYtOCBlbmNvZGVkCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBhcmcsIHJlc3VsdCBpbiBjYXNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZV9wYXRoKGFyZyksIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfcGF0aChzZWxmKToKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BhdGgKKyAgICAgICAgIyB3aXRoIHBhcmFtZXRlcnMKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb25pY3VtOyIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjtzaW5nPXNvbmc/YXBwbGVzPXBlYXJzJnNwYW09ZWdncyNuaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcGF0aChyZXEpLCAiL3JoZXVtL3JoYXBvbmljdW07IgorICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7c2luZz1zb25nP2FwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQorICAgICAgICAjIHdpdGhvdXQgcGFyYW1ldGVycworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3JoZXVtL3JoYXBvbmljdW0/IgorICAgICAgICAgICAgICAgICAgICAgICJhcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9wYXRoKHJlcSksICIvcmhldW0vcmhhcG9uaWN1bT8iCisgICAgICAgICAgICAgICAgICAgICAiYXBwbGVzPXBlYXJzJnNwYW09ZWdncyNuaSIpCisgICAgICAgICMgbWlzc2luZyBmaW5hbCBzbGFzaAorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9wYXRoKHJlcSksICIvIikKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfcG9ydChzZWxmKToKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BvcnQsIERFRkFVTFRfSFRUUF9QT1JUCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MTIzNC8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo0MzIxIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcG9ydChyZXEpLCAiMTIzNCIpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206NDMyMSJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BvcnQocmVxKSwgREVGQVVMVF9IVFRQX1BPUlQpCisKKyAgICBkZWYgdGVzdF9yZXF1ZXN0X2hvc3Qoc2VsZik6CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVxdWVzdF9ob3N0CisgICAgICAgICMgdGhpcyByZXF1ZXN0IGlzIGlsbGVnYWwgKFJGQzI2MTYsIDE0LjIuMykKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKKyAgICAgICAgIyBsaWJ3d3ctcGVybCB3YW50cyB0aGlzIHJlc3BvbnNlLCBidXQgdGhhdCBzZWVtcyB3cm9uZyAoUkZDIDI2MTYsCisgICAgICAgICMgc2VjdGlvbiA1LjIsIHBvaW50IDEuLCBhbmQgUkZDIDI5NjUgc2VjdGlvbiAxLCBwYXJhZ3JhcGggMykKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICIxLjEuMS4xIikKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogImlycmVsZXZhbnQuY29tIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgIyBub3QgYWN0dWFsbHkgc3VyZSB0aGlzIG9uZSBpcyB2YWxpZCBSZXF1ZXN0IG9iamVjdCwgc28gbWF5YmUgc2hvdWxkCisgICAgICAgICMgcmVtb3ZlIHRlc3QgZm9yIG5vIGhvc3QgaW4gdXJsIGluIHJlcXVlc3RfaG9zdCBmdW5jdGlvbj8KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiL3Jlc291cmNlLmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbSJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCisgICAgICAgICMgcG9ydCBzaG91bGRuJ3QgYmUgaW4gcmVxdWVzdC1ob3N0CisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MjM0NS9yZXNvdXJjZS5odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206NTQzMiJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCisKKyAgICBkZWYgdGVzdF9pc19IRE4oc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBpc19IRE4KKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzX0hETigiZm9vLmJhci5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzX0hETigiMWZvbzIuM2JhcjQuNWNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIiIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiLiIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiLmZvby5iYXIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuLmZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiZm9vLiIpKQorCisgICAgZGVmIHRlc3RfcmVhY2goc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZWFjaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgid3d3LmFjbWUuY29tIiksICIuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5jb20iKSwgImFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goImFjbWUubG9jYWwiKSwgIi5sb2NhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIubG9jYWwiKSwgIi5sb2NhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIuY29tIiksICIuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goIi4iKSwgIi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiMTkyLjE2OC4wLjEiKSwgIjE5Mi4xNjguMC4xIikKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9tYXRjaChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGRvbWFpbl9tYXRjaCwgdXNlcl9kb21haW5fbWF0Y2gKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJhLmIuYy5jb20iLCAiLmMuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIuYy5jb20iLCAiYS5iLmMuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goImV4YW1wbGUubG9jYWwiLCAiLmxvY2FsIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCJibGFoLmJsYWgiLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIiLCAiLnJodWJhcmIucmh1YmFyYiIpKQorICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCIiLCAiIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICJhY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICIuYWNtZS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInd3dy5yaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ5LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAibSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLiIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCisgICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAorICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuIikpCisgICAgICAgICMgZW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIiIpKQorCisgICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgorICAgICAgICAjIENvb2tpZXMgd2hvc2UgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lIGRvZXMgbm90IGRvbWFpbi1tYXRjaCB0aGUKKyAgICAgICAgIyBkb21haW4gYXJlIHJlamVjdGVkLgorCisgICAgICAgICMgWFhYIGZhciBmcm9tIGNvbXBsZXRlCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cubmFzdHkuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj1mcmllbmRseS5vcmc7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQorCisgICAgZGVmIHRlc3RfdHdvX2NvbXBvbmVudF9kb21haW5fbnMoc2VsZik6CisgICAgICAgICMgTmV0c2NhcGU6IC53d3cuYmFyLmNvbSwgd3d3LmJhci5jb20sIC5iYXIuY29tLCBiYXIuY29tLCBubyBkb21haW4KKyAgICAgICAgIyBzaG91bGQgYWxsIGdldCBhY2NlcHRlZCwgYXMgc2hvdWxkIC5hY21lLmNvbSwgYWNtZS5jb20gYW5kIG5vIGRvbWFpbgorICAgICAgICAjIGZvciAyLWNvbXBvbmVudCBkb21haW5zIGxpa2UgYWNtZS5jb20uCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKworICAgICAgICAjIHR3by1jb21wb25lbnQgVjAgZG9tYWluIGlzIE9LCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iLCAnbnM9YmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyJmb28ubmV0Il1bIi8iXVsibnMiXS52YWx1ZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iKSwgIm5zPWJhciIpCisgICAgICAgICMgKndpbGwqIGJlIHJldHVybmVkIHRvIGFueSBvdGhlciBkb21haW4gKHVubGlrZSBSRkMgMjk2NSkuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5zPWJhciIpCisgICAgICAgICMgLi4udW5sZXNzIHJlcXVlc3RlZCBvdGhlcndpc2UKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIHN0cmljdF9uc19kb21haW49RGVmYXVsdENvb2tpZVBvbGljeS5Eb21haW5TdHJpY3ROb25Eb21haW4pCisgICAgICAgIGMuc2V0X3BvbGljeShwb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksICIiKQorCisgICAgICAgICMgdW5saWtlIFJGQyAyOTY1LCBldmVuIGV4cGxpY2l0IHR3by1jb21wb25lbnQgZG9tYWluIGlzIE9LLAorICAgICAgICAjIGJlY2F1c2UgLmZvby5uZXQgbWF0Y2hlcyBmb28ubmV0CisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0xPWVnZ3M7IGRvbWFpbj1mb28ubmV0JykKKyAgICAgICAgIyBldmVuIGlmIHN0YXJ0cyB3aXRoIGEgZG90IC0tIGluIE5TIHJ1bGVzLCAuZm9vLm5ldCBtYXRjaGVzIGZvby5uZXQhCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtMj1lZ2dzOyBkb21haW49LmZvby5uZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28iXVsic3BhbTEiXS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyIuZm9vLm5ldCJdWyIvZm9vL2JhciJdWyJzcGFtMiJdLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhbTI9ZWdnczsgc3BhbTE9ZWdnczsgbnM9YmFyIikKKworICAgICAgICAjIHRvcC1sZXZlbCBkb21haW4gaXMgdG9vIGdlbmVyYWwKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0LyIsICduaW5pPSJuaSI7IGRvbWFpbj0ubmV0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQorCisjIyAgICAgICAgICMgTmV0c2NhcGUgcHJvdG9jb2wgZG9lc24ndCBhbGxvdyBub24tc3BlY2lhbCB0b3AgbGV2ZWwgZG9tYWlucyAoc3VjaAorIyMgICAgICAgICAjIGFzIGNvLnVrKSBpbiB0aGUgZG9tYWluIGF0dHJpYnV0ZSB1bmxlc3MgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlCisjIyAgICAgICAgICMgZG90cyBpbiBpdC4KKyAgICAgICAgIyBPaCB5ZXMgaXQgZG9lcyEgIFJlYWwgaW1wbGVtZW50YXRpb25zIGRvbid0IGNoZWNrIHRoaXMsIGFuZCByZWFsCisgICAgICAgICMgY29va2llcyAob2YgY291cnNlKSByZWx5IG9uIHRoYXQgYmVoYXZpb3VyLgorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5jby51ayIsICduYXN0eT10cmljazsgZG9tYWluPS5jby51aycpCisjIyAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCA0KQorCisgICAgZGVmIHRlc3RfdHdvX2NvbXBvbmVudF9kb21haW5fcmZjMjk2NShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKworICAgICAgICAjIHR3by1jb21wb25lbnQgVjEgZG9tYWluIGlzIE9LCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIsICdmb289YmFyOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5fY29va2llc1siZm9vLm5ldCJdWyIvIl1bImZvbyJdLnZhbHVlLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKKyAgICAgICAgIyB3b24ndCBiZSByZXR1cm5lZCB0byBhbnkgb3RoZXIgZG9tYWluIChiZWNhdXNlIGRvbWFpbiB3YXMgaW1wbGllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLCAiIikKKworICAgICAgICAjIHVubGVzcyBkb21haW4gaXMgZ2l2ZW4gZXhwbGljaXRseSwgYmVjYXVzZSB0aGVuIGl0IG11c3QgYmUKKyAgICAgICAgIyByZXdyaXR0ZW4gdG8gc3RhcnQgd2l0aCBhIGRvdDogZm9vLm5ldCAtLT4gLmZvby5uZXQsIHdoaWNoIGRvZXMKKyAgICAgICAgIyBub3QgZG9tYWluLW1hdGNoIGZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAnc3BhbT1lZ2dzOyBkb21haW49Zm9vLm5ldDsgcGF0aD0vZm9vOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKKworICAgICAgICAjIGV4cGxpY2l0IGZvby5uZXQgZnJvbSB0aHJlZS1jb21wb25lbnQgZG9tYWluIHd3dy5mb28ubmV0ICpkb2VzKiBnZXQKKyAgICAgICAgIyBzZXQsIGJlY2F1c2UgLmZvby5uZXQgZG9tYWluLW1hdGNoZXMgLmZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0L2Zvby8iLAorICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IGRvbWFpbj1mb28ubmV0OyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28vIl1bInNwYW0iXS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnJFZlcnNpb249MTsgc3BhbT1lZ2dzOyAkRG9tYWluPSJmb28ubmV0IicpCisKKyAgICAgICAgIyB0b3AtbGV2ZWwgZG9tYWluIGlzIHRvbyBnZW5lcmFsCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIsCisgICAgICAgICAgICAgICAgICAgICAgJ25pPSJuaSI7IGRvbWFpbj0iLm5ldCI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorCisgICAgICAgICMgUkZDIDI5NjUgZG9lc24ndCByZXF1aXJlIGJsb2NraW5nIHRoaXMKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5jby51ay8iLAorICAgICAgICAgICAgICAgICAgICAgICduYXN0eT10cmljazsgZG9tYWluPS5jby51azsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCisKKyAgICBkZWYgdGVzdF9kb21haW5fYWxsb3coc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIGJsb2NrZWRfZG9tYWlucz1bImFjbWUuY29tIl0sCisgICAgICAgICAgICBhbGxvd2VkX2RvbWFpbnM9WyJ3d3cuYWNtZS5jb20iXSkpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2FjbWUuY29tLyIpCisgICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LyJdCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL2FjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDApCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIG5vbi1hbGxvd2VkIGRvbWFpbi4uLgorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgY29va2llcyA9IGMubWFrZV9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBjLnNldF9jb29raWUoY29va2llc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3RfZG9tYWluX2Jsb2NrKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3koCisgICAgICAgICAgICByZmMyOTY1PVRydWUsIGJsb2NrZWRfZG9tYWlucz1bIi5hY21lLmNvbSJdKQorICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1wb2wpCisgICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LyJdCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMCkKKworICAgICAgICBwID0gcG9sLnNldF9ibG9ja2VkX2RvbWFpbnMoWyJhY21lLmNvbSJdKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorCisgICAgICAgIGMuY2xlYXIoKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydF8oKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICByZXEuaGFzX2hlYWRlcigiQ29va2llMiIpKSkKKworICAgICAgICBjLmNsZWFyKCkKKyAgICAgICAgcG9sLnNldF9ibG9ja2VkX2RvbWFpbnMoWyIuYWNtZS5jb20iXSkKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIGJsb2NrZWQgZG9tYWluLi4uCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGNvb2tpZXMgPSBjLm1ha2VfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgYy5zZXRfY29va2llKGNvb2tpZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKyAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X3NlY3VyZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGZvciBucyBpbiBUcnVlLCBGYWxzZToKKyAgICAgICAgICAgIGZvciB3aGl0ZXNwYWNlIGluICIgIiwgIiI6CisgICAgICAgICAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgICAgICAgICAgaWYgbnM6CisgICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgaW50ID0gaW50ZXJhY3RfbmV0c2NhcGUKKyAgICAgICAgICAgICAgICAgICAgdnMgPSAiIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorICAgICAgICAgICAgICAgICAgICBpbnQgPSBpbnRlcmFjdF8yOTY1CisgICAgICAgICAgICAgICAgICAgIHZzID0gIjsgVmVyc2lvbj0xIgorICAgICAgICAgICAgICAgIGMuc2V0X3BvbGljeShwb2wpCisgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cuYWNtZS5jb20vIgorICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28xPWJhciVzJXMiICUgKHZzLCB3aGl0ZXNwYWNlKSkKKyAgICAgICAgICAgICAgICBpbnQoYywgdXJsLCAiZm9vMj1iYXIlczsgc2VjdXJlJXMiICUgICh2cywgd2hpdGVzcGFjZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgIm5vbi1zZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgc2VjdXJlIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgICAgIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbzIiXS5zZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICJzZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgbm9uLXNlY3VyZSIpCisKKyAgICBkZWYgdGVzdF9xdW90ZV9jb29raWVfdmFsdWUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsIHInZm9vPVxiImEicjsgVmVyc2lvbj0xJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaCwgcickVmVyc2lvbj0xOyBmb289XFxiXCJhXCJyJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZmluYWxfc2xhc2goc2VsZik6CisgICAgICAgICMgTWlzc2luZyBzbGFzaCBmcm9tIHJlcXVlc3QgVVJMJ3MgYWJzX3BhdGggc2hvdWxkIGJlIGFzc3VtZWQgcHJlc2VudC4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgdXJsID0gImh0dHA6Ly93d3cuYWNtZS5jb20iCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgImZvbz1iYXI7IFZlcnNpb249MSIpCisgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydF8ocmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3RfZG9tYWluX21pcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJEb21haW4iIG5vdCBpbiBoLAorICAgICAgICAgICAgICAgICAgICAgImFic2VudCBkb21haW4gcmV0dXJuZWQgd2l0aCBkb21haW4gcHJlc2VudCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49LmJhci5jb20nKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnJERvbWFpbj0iLmJhci5jb20iJyBpbiBoLCAiZG9tYWluIG5vdCByZXR1cm5lZCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICAjIG5vdGUgbWlzc2luZyBpbml0aWFsIGRvdCBpbiBEb21haW4KKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgRG9tYWluPWJhci5jb20nKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnJERvbWFpbj0iYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKworICAgIGRlZiB0ZXN0X3BhdGhfbWlycm9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8oIlBhdGgiIG5vdCBpbiBoLAorICAgICAgICAgICAgICAgICAgICAgImFic2VudCBwYXRoIHJldHVybmVkIHdpdGggcGF0aCBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBhdGg9LycpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCckUGF0aD0iLyInIGluIGgsICJwYXRoIG5vdCByZXR1cm5lZCIpCisKKyAgICBkZWYgdGVzdF9wb3J0X21pcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJQb3J0IiBub3QgaW4gaCwKKyAgICAgICAgICAgICAgICAgICAgICJhYnNlbnQgcG9ydCByZXR1cm5lZCB3aXRoIHBvcnQgcHJlc2VudCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0IikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKCJcJFBvcnQoW149XXwkKSIsIGgpLAorICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBubyB2YWx1ZSBub3QgcmV0dXJuZWQgd2l0aCBubyB2YWx1ZSIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCInKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnJFBvcnQ9IjgwIicgaW4gaCwKKyAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggc2luZ2xlIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIHNpbmdsZSB2YWx1ZSIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCw4MDgwIicpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCckUG9ydD0iODAsODA4MCInIGluIGgsCisgICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG11bHRpcGxlIHZhbHVlcyBub3QgcmV0dXJuZWQgd2l0aCBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIikKKworICAgIGRlZiB0ZXN0X25vX3JldHVybl9jb21tZW50KHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICJDb21tZW50IiBub3QgaW4gaCwKKyAgICAgICAgICAgICJDb21tZW50IG9yIENvbW1lbnRVUkwgY29va2llLWF0dHJpYnV0ZXMgcmV0dXJuZWQgdG8gc2VydmVyIikKKworICAgIGRlZiB0ZXN0X0Nvb2tpZV9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgQ29va2llLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgY3MgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICAjIGFkZCBzb21lIHJhbmRvbSBjb29raWVzCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vYmxhaC5zcGFtLm9yZy8iLCAnZm9vPWVnZ3M7IFZlcnNpb249MTsgJworICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnRVUkw9Imh0dHA6Ly9mb28uYmFyLm5ldC9jb21tZW50Lmh0bWwiJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwgInNwYW09YmFyOyBzZWN1cmUiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7IHNlY3VyZTsgVmVyc2lvbj0xIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC8iLAorICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyOyBwYXRoPS87IFZlcnNpb249MSIpCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LnNvbC5ubyIsCisgICAgICAgICAgICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCisgICAgICAgICAgICAgICAgICAgICAgcidwb3J0PSI5MCwxMDAsIDgwLDgwODAiOyAnCisgICAgICAgICAgICAgICAgICAgICAgcidtYXgtYWdlPTEwMDsgQ29tbWVudCA9ICJKdXN0IGtpZGRpbmchIChcInxcXFxcKSAiJykKKworICAgICAgICB2ZXJzaW9ucyA9IFsxLCAxLCAxLCAwLCAxXQorICAgICAgICBuYW1lcyA9IFsiYmFuZyIsICJmb28iLCAiZm9vIiwgInNwYW0iLCAiZm9vIl0KKyAgICAgICAgZG9tYWlucyA9IFsiLnNvbC5ubyIsICJibGFoLnNwYW0ub3JnIiwgInd3dy5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgInd3dy5hY21lLmNvbSIsICJ3d3cuYWNtZS5jb20iXQorICAgICAgICBwYXRocyA9IFsiLyIsICIvIiwgIi8iLCAiL2JsYWgiLCAiL2JsYWgvIl0KKworICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICBmb3IgYyBpbiBjczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjLCBDb29raWUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMudmVyc2lvbiwgdmVyc2lvbnNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5uYW1lLCBuYW1lc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLmRvbWFpbiwgZG9tYWluc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLnBhdGgsIHBhdGhzW2ldKQorICAgICAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnNfaGVhZGVycyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKKworICAgICAgICAjIG1pc3NpbmcgZG9tYWluIHZhbHVlIChpbnZhbGlkIGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vPWJhcjsgcGF0aD0vOyBkb21haW4iXSksCisgICAgICAgICAgICBbWygiZm9vIiwgImJhciIpLAorICAgICAgICAgICAgICAoInBhdGgiLCAiLyIpLCAoImRvbWFpbiIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KKyAgICAgICAgICAgICkKKyAgICAgICAgIyBpbnZhbGlkIGV4cGlyZXMgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vPWJhcjsgZXhwaXJlcz1Gb28gQmFyIDEyIDMzOjIyOjExIDIwMDAiXSksCisgICAgICAgICAgICBbWygiZm9vIiwgImJhciIpLCAoImV4cGlyZXMiLCBOb25lKSwgKCJ2ZXJzaW9uIiwgIjAiKV1dCisgICAgICAgICAgICApCisgICAgICAgICMgbWlzc2luZyBjb29raWUgdmFsdWUgKHZhbGlkIGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vIl0pLAorICAgICAgICAgICAgW1soImZvbyIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KKyAgICAgICAgICAgICkKKyAgICAgICAgIyBzaG91bGRuJ3QgYWRkIHZlcnNpb24gaWYgaGVhZGVyIGlzIGVtcHR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoWyIiXSksIFtdKQorCisgICAgZGVmIHRlc3RfYmFkX2Nvb2tpZV9oZWFkZXIoc2VsZik6CisKKyAgICAgICAgZGVmIGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpOgorICAgICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKKyAgICAgICAgICAgIHIgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKKyAgICAgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHIsIHJlcSkKKyAgICAgICAgICAgIHJldHVybiBjCisKKyAgICAgICAgIyBub25lIG9mIHRoZXNlIGJhZCBoZWFkZXJzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgcmFpc2VkCisgICAgICAgIGZvciBoZWFkZXJzIGluIFsKKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTogIl0sICAjIGFjdHVhbGx5LCBub3RoaW5nIHdyb25nIHdpdGggdGhpcworICAgICAgICAgICAgWyJTZXQtQ29va2llMjogIl0sICAjIGRpdHRvCisgICAgICAgICAgICAjIG1pc3NpbmcgZG9tYWluIHZhbHVlCisgICAgICAgICAgICBbIlNldC1Db29raWUyOiBhPWZvbzsgcGF0aD0vOyBWZXJzaW9uPTE7IGRvbWFpbiJdLAorICAgICAgICAgICAgIyBiYWQgbWF4LWFnZQorICAgICAgICAgICAgWyJTZXQtQ29va2llOiBiPWZvbzsgbWF4LWFnZT1vb3BzIl0sCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgICAgICAjIHRoZXNlIGJhZCBjb29raWVzIHNob3VsZG4ndCBiZSBzZXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMCkKKworICAgICAgICAjIGNvb2tpZSB3aXRoIGludmFsaWQgZXhwaXJlcyBpcyB0cmVhdGVkIGFzIHNlc3Npb24gY29va2llCisgICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IGM9Zm9vOyBleHBpcmVzPUZvbyBCYXIgMTIgMzM6MjI6MTEgMjAwMCJdCisgICAgICAgIGMgPSBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKQorICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuZXhhbXBsZS5jb20iXVsiLyJdWyJjIl0KKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS5leHBpcmVzIGlzIE5vbmUpCisKKworY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgorICAgICMgVGVzdHMgdGFrZW4gZnJvbSBsaWJ3d3ctcGVybCwgd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGFuZCBhZGRpdGlvbnMuCisKKyAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzEoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIyBGaXJzdCB3ZSBjaGVjayB0aGF0IGl0IHdvcmtzIGZvciB0aGUgb3JpZ2luYWwgZXhhbXBsZSBhdAorICAgICAgICAjIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWwKKworICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vOyBleHBpcmVzPVdlZG5lc2RheSwgMDktTm92LTk5IDIzOjEyOjQwIEdNVAorICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVxdWVzdHMgYSBkb2N1bWVudCwgYW5kIHJlY2VpdmVzIGluIHRoZSByZXNwb25zZToKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mbworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2ZvbyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgU0hJUFBJTkc9RkVERVgKKyAgICAgICAgIworICAgICAgICAjIFRoZSBsYXN0IENvb2tpZSBpcyBidWdneSwgYmVjYXVzZSBib3RoIHNwZWNpZmljYXRpb25zIHNheSB0aGF0IHRoZQorICAgICAgICAjIG1vc3Qgc3BlY2lmaWMgY29va2llIG11c3QgYmUgc2VudCBmaXJzdC4gIFNISVBQSU5HPUZFREVYIGlzIHRoZQorICAgICAgICAjIG1vc3Qgc3BlY2lmaWMgYW5kIHNob3VsZCB0aHVzIGJlIGZpcnN0LgorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgIGhlYWRlcnMgPSBbXQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gVHJ1ZSkpCisKKyAgICAgICAgI3JlcSA9IFJlcXVlc3QoImh0dHA6Ly8xLjEuMS4xLyIsCisgICAgICAgICMgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjgwIn0pCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoCisgICAgICAgICAgICAiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIDsgIgorICAgICAgICAgICAgImV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlIHllYXJfcGx1c19vbmUpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLCAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vYmFyIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQorICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGgpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mb28nKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIgaW4gaCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIiBpbiBoIGFuZAorICAgICAgICAgICAgICAgICAgICAgIlNISVBQSU5HPUZFREVYIiBub3QgaW4gaCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICAgICAgICAgICAgICAgICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIiBpbiBoIGFuZAorICAgICAgICAgICAgICAgICAgICAgIGguc3RhcnRzd2l0aCgiU0hJUFBJTkc9RkVERVg7IikpKQorCisgICAgZGVmIHRlc3RfbmV0c2NhcGVfZXhhbXBsZV8yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgICMgU2Vjb25kIEV4YW1wbGUgdHJhbnNhY3Rpb24gc2VxdWVuY2U6CisgICAgICAgICMKKyAgICAgICAgIyBBc3N1bWUgYWxsIG1hcHBpbmdzIGZyb20gYWJvdmUgaGF2ZSBiZWVuIGNsZWFyZWQuCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgcGF0aD0vCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7IHBhdGg9L2FtbW8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi9hbW1vIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjICAgICAgIE5PVEU6IFRoZXJlIGFyZSB0d28gbmFtZS92YWx1ZSBwYWlycyBuYW1lZCAiUEFSVF9OVU1CRVIiIGR1ZSB0bworICAgICAgICAjICAgICAgIHRoZSBpbmhlcml0YW5jZSBvZiB0aGUgIi8iIG1hcHBpbmcgaW4gYWRkaXRpb24gdG8gdGhlICIvYW1tbyIgbWFwcGluZy4KKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaGVhZGVycyA9IFtdCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiKQorCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKAorICAgICAgICAgICAgIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgcGF0aD0vYW1tbyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2FtbW8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHIiUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzO1xzKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSkpCisKKyAgICBkZWYgdGVzdF9pZXRmX2V4YW1wbGVfMShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAjIFRoZW4gd2UgdGVzdCB3aXRoIHRoZSBleGFtcGxlcyBmcm9tIGRyYWZ0LWlldGYtaHR0cC1zdGF0ZS1tYW4tbWVjLTAzLnR4dAorICAgICAgICAjCisgICAgICAgICMgNS4gIEVYQU1QTEVTCisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisKKyAgICAgICAgIworICAgICAgICAjIDUuMSAgRXhhbXBsZSAxCisgICAgICAgICMKKyAgICAgICAgIyBNb3N0IGRldGFpbCBvZiByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzIGhhcyBiZWVuIG9taXR0ZWQuICBBc3N1bWUKKyAgICAgICAgIyB0aGUgdXNlciBhZ2VudCBoYXMgbm8gc3RvcmVkIGNvb2tpZXMuCisgICAgICAgICMKKyAgICAgICAgIyAgIDEuICBVc2VyIEFnZW50IC0+IFNlcnZlcgorICAgICAgICAjCisgICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9sb2dpbiBIVFRQLzEuMQorICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBVc2VyIGlkZW50aWZpZXMgc2VsZiB2aWEgYSBmb3JtLgorICAgICAgICAjCisgICAgICAgICMgICAyLiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKKyAgICAgICAgIworICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSworICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZSByZWZsZWN0cyB1c2VyJ3MgaWRlbnRpdHkuCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKKyAgICAgICAgICAgIGMsICdodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvbG9naW4nLAorICAgICAgICAgICAgJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQorCisgICAgICAgICMKKyAgICAgICAgIyAgIDMuICBVc2VyIEFnZW50IC0+IFNlcnZlcgorICAgICAgICAjCisgICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9waWNraXRlbSBIVFRQLzEuMQorICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOyBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQorICAgICAgICAjCisgICAgICAgICMgICAgICAgVXNlciBzZWxlY3RzIGFuIGl0ZW0gZm9yIGBgc2hvcHBpbmcgYmFza2V0LicnCisgICAgICAgICMKKyAgICAgICAgIyAgIDQuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgICAgICAgUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTaG9wcGluZyBiYXNrZXQgY29udGFpbnMgYW4gaXRlbS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICdodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcGlja2l0ZW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKTsKKyAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaCgKKyAgICAgICAgICAgIHInXlwkVmVyc2lvbj0iPzEiPzsgQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87IFwkUGF0aD0iL2FjbWUiJCcsCisgICAgICAgICAgICBjb29raWUpKQorCisgICAgICAgICMKKyAgICAgICAgIyAgIDUuICBVc2VyIEFnZW50IC0+IFNlcnZlcgorICAgICAgICAjCisgICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9zaGlwcGluZyBIVFRQLzEuMQorICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgICAgICAgQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyAkUGF0aD0iL2FjbWUiOworICAgICAgICAjICAgICAgICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBVc2VyIHNlbGVjdHMgc2hpcHBpbmcgbWV0aG9kIGZyb20gZm9ybS4KKyAgICAgICAgIworICAgICAgICAjICAgNi4gIFNlcnZlciAtPiBVc2VyIEFnZW50CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llMjogU2hpcHBpbmc9IkZlZEV4IjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgICAgICAgTmV3IGNvb2tpZSByZWZsZWN0cyBzaGlwcGluZyBtZXRob2QuCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3NoaXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2hpcHBpbmc9IkZlZEV4IjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ15cJFZlcnNpb249Ij8xIj87JywgY29va2llKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ1BhcnRfTnVtYmVyPSI/Um9ja2V0X0xhdW5jaGVyXzAwMDEiPzsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xzKlwkUGF0aD0iXC9hY21lIicsIGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2gocidDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPztccypcJFBhdGg9IlwvYWNtZSInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSkpCisKKyAgICAgICAgIworICAgICAgICAjICAgNy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3Byb2Nlc3MgSFRUUC8xLjEKKyAgICAgICAgIyAgICAgICBDb29raWU6ICRWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSI7CisgICAgICAgICMgICAgICAgICAgICAgICBTaGlwcGluZz0iRmVkRXgiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgY2hvb3NlcyB0byBwcm9jZXNzIG9yZGVyLgorICAgICAgICAjCisgICAgICAgICMgICA4LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKKyAgICAgICAgIworICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSworICAgICAgICAjCisgICAgICAgICMgICAgICAgVHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3Byb2Nlc3MiKQorICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICByZS5zZWFyY2gocidTaGlwcGluZz0iP0ZlZEV4Ij87XHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSBhbmQKKyAgICAgICAgICAgICJXSUxFX0VfQ09ZT1RFIiBpbiBjb29raWUpCisKKyAgICAgICAgIworICAgICAgICAjIFRoZSB1c2VyIGFnZW50IG1ha2VzIGEgc2VyaWVzIG9mIHJlcXVlc3RzIG9uIHRoZSBvcmlnaW4gc2VydmVyLCBhZnRlcgorICAgICAgICAjIGVhY2ggb2Ygd2hpY2ggaXQgcmVjZWl2ZXMgYSBuZXcgY29va2llLiAgQWxsIHRoZSBjb29raWVzIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgIyBQYXRoIGF0dHJpYnV0ZSBhbmQgKGRlZmF1bHQpIGRvbWFpbi4gIEJlY2F1c2UgdGhlIHJlcXVlc3QgVVJMcyBhbGwgaGF2ZQorICAgICAgICAjIC9hY21lIGFzIGEgcHJlZml4LCBhbmQgdGhhdCBtYXRjaGVzIHRoZSBQYXRoIGF0dHJpYnV0ZSwgZWFjaCByZXF1ZXN0CisgICAgICAgICMgY29udGFpbnMgYWxsIHRoZSBjb29raWVzIHJlY2VpdmVkIHNvIGZhci4KKworICAgIGRlZiB0ZXN0X2lldGZfZXhhbXBsZV8yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgIyA1LjIgIEV4YW1wbGUgMgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSBlZmZlY3Qgb2YgdGhlIFBhdGggYXR0cmlidXRlLiAgQWxsIGRldGFpbAorICAgICAgICAjIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMgaGFzIGJlZW4gb21pdHRlZC4gIEFzc3VtZSB0aGUgdXNlciBhZ2VudAorICAgICAgICAjIGhhcyBubyBzdG9yZWQgY29va2llcy4KKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKworICAgICAgICAjIEltYWdpbmUgdGhlIHVzZXIgYWdlbnQgaGFzIHJlY2VpdmVkLCBpbiByZXNwb25zZSB0byBlYXJsaWVyIHJlcXVlc3RzLAorICAgICAgICAjIHRoZSByZXNwb25zZSBoZWFkZXJzCisgICAgICAgICMKKyAgICAgICAgIyBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICBQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjIGFuZAorICAgICAgICAjCisgICAgICAgICMgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSaWRpbmdfUm9ja2V0XzAwMjMiOyBWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgIFBhdGg9Ii9hY21lL2FtbW8iCisKKyAgICAgICAgaW50ZXJhY3RfMjk2NSgKKyAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvYW1tby9zcGVjaWZpYyIsCisgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicsCisgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZS9hbW1vIicpCisKKyAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgVVJMcyBvZgorICAgICAgICAjIHRoZSBmb3JtIC9hY21lL2FtbW8vLi4uICB3b3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBoZWFkZXI6CisgICAgICAgICMKKyAgICAgICAgIyBDb29raWU6ICRWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgIFBhcnRfTnVtYmVyPSJSaWRpbmdfUm9ja2V0XzAwMjMiOyAkUGF0aD0iL2FjbWUvYW1tbyI7CisgICAgICAgICMgICAgICAgICBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIE5BTUU9VkFMVUUgcGFpciBmb3IgdGhlIGNvb2tpZSB3aXRoIHRoZSBtb3JlIHNwZWNpZmljIFBhdGgKKyAgICAgICAgIyBhdHRyaWJ1dGUsIC9hY21lL2FtbW8sIGNvbWVzIGJlZm9yZSB0aGUgb25lIHdpdGggdGhlIGxlc3Mgc3BlY2lmaWMgUGF0aAorICAgICAgICAjIGF0dHJpYnV0ZSwgL2FjbWUuICBGdXJ0aGVyIG5vdGUgdGhhdCB0aGUgc2FtZSBjb29raWUgbmFtZSBhcHBlYXJzIG1vcmUKKyAgICAgICAgIyB0aGFuIG9uY2UuCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2FtbW8vLi4uIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgcmUuc2VhcmNoKHIiUmlkaW5nX1JvY2tldF8wMDIzLipSb2NrZXRfTGF1bmNoZXJfMDAwMSIsIGNvb2tpZSkpCisKKyAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgYSBVUkwgb2YKKyAgICAgICAgIyB0aGUgZm9ybSAvYWNtZS9wYXJ0cy8gd291bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHJlcXVlc3QgaGVhZGVyOgorICAgICAgICAjCisgICAgICAgICMgQ29va2llOiAkVmVyc2lvbj0iMSI7IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjIEhlcmUsIHRoZSBzZWNvbmQgY29va2llJ3MgUGF0aCBhdHRyaWJ1dGUgL2FjbWUvYW1tbyBpcyBub3QgYSBwcmVmaXggb2YKKyAgICAgICAgIyB0aGUgcmVxdWVzdCBVUkwsIC9hY21lL3BhcnRzLywgc28gdGhlIGNvb2tpZSBkb2VzIG5vdCBnZXQgZm9yd2FyZGVkIHRvCisgICAgICAgICMgdGhlIHNlcnZlci4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcGFydHMvIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJSb2NrZXRfTGF1bmNoZXJfMDAwMSIgaW4gY29va2llIGFuZAorICAgICAgICAgICAgICAgICAgICAgIlJpZGluZ19Sb2NrZXRfMDAyMyIgbm90IGluIGNvb2tpZSkKKworICAgIGRlZiB0ZXN0X3JlamVjdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlamVjdGlvbiBvZiBTZXQtQ29va2llMiByZXNwb25zZXMgYmFzZWQgb24gZG9tYWluLCBwYXRoLCBwb3J0LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgRGVmYXVsdENvb2tpZVBvbGljeSwgTFdQQ29va2llSmFyCisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IExXUENvb2tpZUphcihwb2xpY3k9cG9sKQorCisgICAgICAgIG1heF9hZ2UgPSAibWF4LWFnZT0zNjAwIgorCisgICAgICAgICMgaWxsZWdhbCBkb21haW4gKG5vIGVtYmVkZGVkIGRvdHMpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb289YmFyOyBkb21haW49Ii5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGMpCisKKyAgICAgICAgIyBsZWdhbCBkb21haW4KKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bpbmc9cG9uZzsgZG9tYWluPSJhY21lLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICAjIGlsbGVnYWwgZG9tYWluIChob3N0IHByZWZpeCAid3d3LmEiIGNvbnRhaW5zIGEgZG90KQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmEuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGl6PWJhbmc7IGRvbWFpbj0iYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisKKyAgICAgICAgIyBsZWdhbCBkb21haW4KKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hLmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd293PWZsdXR0ZXI7IGRvbWFpbj0iLmEuYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisKKyAgICAgICAgIyBjYW4ndCBwYXJ0aWFsbHkgbWF0Y2ggYW4gSVAtYWRkcmVzcworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vMTI1LjEyNS4xMjUuMTI1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnenp6ej1waW5nOyBkb21haW49IjEyNS4xMjUuMTI1IjsgdmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorCisgICAgICAgICMgaWxsZWdhbCBwYXRoIChtdXN0IGJlIHByZWZpeCBvZiByZXF1ZXN0IHBhdGgpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxhaD1yaHViYXJiOyBkb21haW49Ii5zb2wubm8iOyBwYXRoPSIvZm9vIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisKKyAgICAgICAgIyBsZWdhbCBwYXRoCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vL2Zvby9iYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaW5nPWJvbmc7IGRvbWFpbj0iLnNvbC5ubyI7IHBhdGg9Ii9mb28iOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKKworICAgICAgICAjIGlsbGVnYWwgcG9ydCAocmVxdWVzdC1wb3J0IG5vdCBpbiBsaXN0KQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5ubyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doaXo9ZmZmdDsgZG9tYWluPSIuc29sLm5vIjsgcG9ydD0iOTAsMTAwIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCisKKyAgICAgICAgIyBsZWdhbCBwb3J0CisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCisgICAgICAgICAgICByJ3BvcnQ9IjkwLDEwMCwgODAsODA4MCI7ICcKKyAgICAgICAgICAgIHInbWF4LWFnZT0xMDA7IENvbW1lbnQgPSAiSnVzdCBraWRkaW5nISAoXCJ8XFxcXCkgIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNCkKKworICAgICAgICAjIHBvcnQgYXR0cmlidXRlIHdpdGhvdXQgYW55IHZhbHVlIChjdXJyZW50IHBvcnQpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vOT1iYXI7IHZlcnNpb249MTsgZG9tYWluPSIuc29sLm5vIjsgcG9ydDsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtYWdlPTEwMDsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDUpCisKKyAgICAgICAgIyBlbmNvZGVkIHBhdGgKKyAgICAgICAgIyBMV1AgaGFzIHRoaXMgdGVzdCwgYnV0IHVuZXNjYXBpbmcgYWxsb3dlZCBwYXRoIGNoYXJhY3RlcnMgc2VlbXMKKyAgICAgICAgIyBsaWtlIGEgYmFkIGlkZWEsIHNvIEkgdGhpbmsgdGhpcyBzaG91bGQgZmFpbDoKKyMjICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vZm9vLyIsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHInZm9vOD1iYXI7IHZlcnNpb249MTsgcGF0aD0iLyU2Nm9vIicpCisgICAgICAgICMgYnV0IHRoaXMgaXMgT0ssIGJlY2F1c2UgJzwnIGlzIG5vdCBhbiBhbGxvd2VkIEhUVFAgVVJMIHBhdGgKKyAgICAgICAgIyBjaGFyYWN0ZXI6CisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vLzxvby8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInZm9vOD1iYXI7IHZlcnNpb249MTsgcGF0aD0iLyUzY29vIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNikKKworICAgICAgICAjIHNhdmUgYW5kIHJlc3RvcmUKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICAgICAgb2xkID0gcmVwcihjKQorCisgICAgICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCisgICAgICAgICAgICBjLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2xkLCByZXByKGMpKQorCisgICAgZGVmIHRlc3RfdXJsX2VuY29kaW5nKHNlbGYpOgorICAgICAgICAjIFRyeSBzb21lIFVSTCBlbmNvZGluZ3Mgb2YgdGhlIFBBVEhzLgorICAgICAgICAjICh0aGUgYmVoYXZpb3VyIGhlcmUgaGFzIGNoYW5nZWQgZnJvbSBsaWJ3d3ctcGVybCkKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyUyZiUyNS8lM2MlM2MlMEFuZXclRTUvJUU1IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vICA9ICAgYmFyOyB2ZXJzaW9uICAgID0gICAxIikKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAorICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CisgICAgICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXlwkdmVyc2lvbj1cIj8xXCI/JywgcmUuSSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKKyAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8lMjUvPDwlMGFuZXflL+b45SIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQorCisgICAgICAgICMgdW5pY29kZSBVUkwgZG9lc24ndCByYWlzZSBleGNlcHRpb24KKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCB1Imh0dHA6Ly93d3cuYWNtZS5jb20vXHhmYyIpCisKKyAgICBkZWYgdGVzdF9tb3ppbGxhKHNlbGYpOgorICAgICAgICAjIFNhdmUgLyBsb2FkIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGZpbGUgZm9ybWF0LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTW96aWxsYUNvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCisgICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBtYXgtYWdlPTEwMDsgVmVyc2lvbj0xIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgcG9ydD0iODAiOyBtYXgtYWdlPTEwMDsgRGlzY2FyZDsgVmVyc2lvbj0xJykKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAiZm9vMz1iYXI7IHNlY3VyZTsgVmVyc2lvbj0xIikKKworICAgICAgICBleHBpcmVzID0gImV4cGlyZXM9MDktTm92LSVkIDIzOjEyOjQwIEdNVCIgJSAoeWVhcl9wbHVzX29uZSwpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2E9YmFyOyAlcyIgJSBleHBpcmVzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29iPWJhcjsgRG9tYWluPS5mb28uY29tOyAlcyIgJSBleHBpcmVzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29jPWJhcjsgRG9tYWluPXd3dy5mb28uY29tOyAlcyIgJSBleHBpcmVzKQorCisgICAgICAgIGRlZiBzYXZlX2FuZF9yZXN0b3JlKGNqLCBpZ25vcmVfZGlzY2FyZCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2ouc2F2ZShpZ25vcmVfZGlzY2FyZD1pZ25vcmVfZGlzY2FyZCkKKyAgICAgICAgICAgICAgICBuZXdfYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgICAgICAgICBuZXdfYy5sb2FkKGlnbm9yZV9kaXNjYXJkPWlnbm9yZV9kaXNjYXJkKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworICAgICAgICAgICAgcmV0dXJuIG5ld19jCisKKyAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuZXdfYyksIDYpICAjIG5vbmUgZGlzY2FyZGVkCisgICAgICAgIHNlbGYuYXNzZXJ0XygibmFtZT0nZm9vMScsIHZhbHVlPSdiYXInIiBpbiByZXByKG5ld19jKSkKKworICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuZXdfYyksIDQpICAjIDIgb2YgdGhlbSBkaXNjYXJkZWQgb24gc2F2ZQorICAgICAgICBzZWxmLmFzc2VydF8oIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIgaW4gcmVwcihuZXdfYykpCisKKyAgICBkZWYgdGVzdF9uZXRzY2FwZV9taXNjKHNlbGYpOgorICAgICAgICAjIFNvbWUgYWRkaXRpb25hbCBOZXRzY2FwZSBjb29raWVzIHRlc3RzLgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBoZWFkZXJzID0gW10KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2Zvby5iYXIuYWNtZS5jb20vZm9vIikKKworICAgICAgICAjIE5ldHNjYXBlIGFsbG93cyBhIGhvc3QgcGFydCB0aGF0IGNvbnRhaW5zIGRvdHMKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IEN1c3RvbWVyPVdJTEVfRV9DT1lPVEU7IGRvbWFpbj0uYWNtZS5jb20iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgIyBhbmQgdGhhdCB0aGUgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBob3N0IHdpdGhvdXQgYWRkaW5nIGEgbGVhZGluZworICAgICAgICAjIGRvdCB0byB0aGUgZG9tYWluLiAgU2hvdWxkIG5vdCBxdW90ZSBldmVuIGlmIHN0cmFuZ2UgY2hhcnMgYXJlIHVzZWQKKyAgICAgICAgIyBpbiB0aGUgY29va2llIHZhbHVlLgorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Myw0OyBkb21haW49Zm9vLmJhci5hY21lLmNvbSIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgIlBBUlRfTlVNQkVSPTMsNCIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpIGFuZAorICAgICAgICAgICAgIkN1c3RvbWVyPVdJTEVfRV9DT1lPVEUiIGluIHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X2ludHJhbmV0X2RvbWFpbnNfMjk2NShzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhbmRsaW5nIG9mIGxvY2FsIGludHJhbmV0IGhvc3RuYW1lcyB3aXRob3V0IGEgZG90LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBQT1JUOyBEaXNjYXJkOyBWZXJzaW9uPTE7IikKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0iLmxvY2FsIjsgVmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28xPWJhciIgaW4gY29va2llKQorCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsICdmb28zPWJhcjsgVmVyc2lvbj0xJykKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28yPWJhciIgaW4gY29va2llIGFuZCBsZW4oYykgPT0gMykKKworICAgIGRlZiB0ZXN0X2ludHJhbmV0X2RvbWFpbnNfbnMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IEZhbHNlKSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIsICJmb28xPWJhciIpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0ubG9jYWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vMT1iYXIiIGluIGNvb2tpZSkKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28yPWJhciIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgICMgVGVzdCBmb3IgZW1wdHkgcGF0aAorICAgICAgICAjIEJyb2tlbiB3ZWItc2VydmVyIE9SSU9OLzEuMy4zOCByZXR1cm5zIHRvIHRoZSBjbGllbnQgcmVzcG9uc2UgbGlrZQorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMzsgUGF0aD0KKyAgICAgICAgIworICAgICAgICAjIGllLiB3aXRoIFBhdGggc2V0IHRvIG5vdGhpbmcuCisgICAgICAgICMgSW4gdGhpcyBjYXNlLCBleHRyYWN0X2Nvb2tpZXMoKSBtdXN0IHNldCBjb29raWUgdG8gLyAocm9vdCkKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjUgPSBUcnVlKSkKKyAgICAgICAgaGVhZGVycyA9IFtdCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMzsgUGF0aD0iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYW50cy5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCisKKyAgICAgICAgIyBtaXNzaW5nIHBhdGggaW4gdGhlIHJlcXVlc3QgVVJJCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYW50cy5jb206ODA4MCIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKKworICAgIGRlZiB0ZXN0X3Nlc3Npb25fY29va2llcyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICB5ZWFyX3BsdXNfb25lID0gdGltZS5sb2NhbHRpbWUoKVswXSArIDEKKworICAgICAgICAjIENoZWNrIHNlc3Npb24gY29va2llcyBhcmUgZGVsZXRlZCBwcm9wZXJseSBieQorICAgICAgICAjIENvb2tpZUphci5jbGVhcl9zZXNzaW9uX2Nvb2tpZXMgbWV0aG9kCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgnaHR0cDovL3d3dy5wZXJsbWVpc3Rlci5jb20vc2NyaXB0cycpCisgICAgICAgIGhlYWRlcnMgPSBbXQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogczE9c2Vzc2lvbjtQYXRoPS9zY3JpcHRzIikKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHAxPXBlcm07IERvbWFpbj0ucGVybG1laXN0ZXIuY29tOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIlBhdGg9LztleHBpcmVzPUZyaSwgMDItRmViLSVkIDIzOjI0OjIwIEdNVCIgJQorICAgICAgICAgICAgICAgICAgICAgICB5ZWFyX3BsdXNfb25lKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogcDI9cGVybTtQYXRoPS87ZXhwaXJlcz1GcmksICIKKyAgICAgICAgICAgICAgICAgICAgICAgIjAyLUZlYi0lZCAyMzoyNDoyMCBHTVQiICUgeWVhcl9wbHVzX29uZSkKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHMyPXNlc3Npb247UGF0aD0vc2NyaXB0czsiCisgICAgICAgICAgICAgICAgICAgICAgICJEb21haW49LnBlcmxtZWlzdGVyLmNvbSIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llMjogczM9c2Vzc2lvbjtWZXJzaW9uPTE7RGlzY2FyZDtQYXRoPSIvIicpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAnaHR0cDovL3d3dy5wZXJsbWVpc3Rlci5jb20vc2NyaXB0cycpCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICAjIEhvdyBtYW55IHNlc3Npb24vcGVybWFuZW50IGNvb2tpZXMgZG8gd2UgaGF2ZT8KKyAgICAgICAgY291bnRlciA9IHsic2Vzc2lvbl9hZnRlciI6IDAsCisgICAgICAgICAgICAgICAgICAgInBlcm1fYWZ0ZXIiOiAwLAorICAgICAgICAgICAgICAgICAgICJzZXNzaW9uX2JlZm9yZSI6IDAsCisgICAgICAgICAgICAgICAgICAgInBlcm1fYmVmb3JlIjogMH0KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBjOgorICAgICAgICAgICAga2V5ID0gIiVzX2JlZm9yZSIgJSBjb29raWUudmFsdWUKKyAgICAgICAgICAgIGNvdW50ZXJba2V5XSA9IGNvdW50ZXJba2V5XSArIDEKKyAgICAgICAgYy5jbGVhcl9zZXNzaW9uX2Nvb2tpZXMoKQorICAgICAgICAjIEhvdyBtYW55IG5vdz8KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBjOgorICAgICAgICAgICAga2V5ID0gIiVzX2FmdGVyIiAlIGNvb2tpZS52YWx1ZQorICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQorCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKAorICAgICAgICAgICAgIyBhIHBlcm1hbmVudCBjb29raWUgZ290IGxvc3QgYWNjaWRlbnRseQorICAgICAgICAgICAgY291bnRlclsicGVybV9hZnRlciJdICE9IGNvdW50ZXJbInBlcm1fYmVmb3JlIl0gb3IKKyAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCisgICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2FmdGVyIl0gIT0gMCBvcgorICAgICAgICAgICAgIyB3ZSBkaWRuJ3QgaGF2ZSBzZXNzaW9uIGNvb2tpZXMgaW4gdGhlIGZpcnN0IHBsYWNlCisgICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2JlZm9yZSJdID09IDApKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc2V0cworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIERhdGVUaW1lVGVzdHMsCisgICAgICAgIEhlYWRlclRlc3RzLAorICAgICAgICBDb29raWVUZXN0cywKKyAgICAgICAgTFdQQ29va2llVGVzdHMsCisgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IGYzOGE0YTMuLjhhN2NmNjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTU0LDYgKzU0LDEwIEBACiAgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGNvdW50PU5vbmUpOiBwYXNzCiAgICAgZGVmIGNsb3NlKHNlbGYpOiBwYXNzCiAKK2NsYXNzIE1vY2tIZWFkZXJzKGRpY3QpOgorICAgIGRlZiBnZXRoZWFkZXJzKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMoKQorCiBjbGFzcyBNb2NrUmVzcG9uc2UoU3RyaW5nSU8uU3RyaW5nSU8pOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBtc2csIGhlYWRlcnMsIGRhdGEsIHVybD1Ob25lKToKICAgICAgICAgU3RyaW5nSU8uU3RyaW5nSU8uX19pbml0X18oc2VsZiwgZGF0YSkKQEAgLTYzLDYgKzY3LDEyIEBACiAgICAgZGVmIGdldHVybChzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYudXJsCiAKK2NsYXNzIE1vY2tDb29raWVKYXI6CisgICAgZGVmIGFkZF9jb29raWVfaGVhZGVyKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBzZWxmLmFjaF9yZXEgPSByZXF1ZXN0CisgICAgZGVmIGV4dHJhY3RfY29va2llcyhzZWxmLCByZXNwb25zZSwgcmVxdWVzdCk6CisgICAgICAgIHNlbGYuZWNfcmVxLCBzZWxmLmVjX3IgPSByZXF1ZXN0LCByZXNwb25zZQorCiBjbGFzcyBGYWtlTWV0aG9kOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRoX25hbWUsIGFjdGlvbiwgaGFuZGxlKToKICAgICAgICAgc2VsZi5tZXRoX25hbWUgPSBtZXRoX25hbWUKQEAgLTQ3NCw3ICs0ODQsNyBAQAogICAgICAgICBmb3IgZGF0YSBpbiAiIiwgTm9uZTogICMgUE9TVCwgR0VUCiAgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIiwgZGF0YSkKICAgICAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIpCi0gICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3QocmVxKQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCiAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6ICAjIEdFVAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC1sZW5ndGgiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LXR5cGUiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCkBAIC00OTEsNyArNTAxLDcgQEAKICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiQ29udGVudC10eXBlIiwgImJhciIpCiAgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIkhvc3QiLCAiYmF6IikKICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiU3BhbSIsICJmb28iKQotICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0KHJlcSkKKyAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICJmb28iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtdHlwZSJdLCAiYmFyIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sICJiYXoiKQpAQCAtNTE0LDYgKzUyNCwyMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucHJvdG8sICJodHRwIikgICMgby5lcnJvciBjYWxsZWQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmFyZ3MsIChyZXEsIHIsIDIwMSwgIkNyZWF0ZWQiLCB7fSkpCiAKKyAgICBkZWYgdGVzdF9jb29raWVzKHNlbGYpOgorICAgICAgICBjaiA9IE1vY2tDb29raWVKYXIoKQorICAgICAgICBoID0gdXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKGNqKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKKyAgICAgICAgbmV3cmVxID0gaC5odHRwX3JlcXVlc3QocmVxKQorICAgICAgICBzZWxmLmFzc2VydF8oY2ouYWNoX3JlcSBpcyByZXEgaXMgbmV3cmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X29yaWdpbl9yZXFfaG9zdCgpLCAiZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IHJlcS5pc191bnZlcmlmaWFibGUoKSkKKyAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjai5lY19yZXEgaXMgcmVxKQorICAgICAgICBzZWxmLmFzc2VydF8oY2ouZWNfciBpcyByIGlzIG5ld3IpCisKICAgICBkZWYgdGVzdF9yZWRpcmVjdChzZWxmKToKICAgICAgICAgZnJvbV91cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tL2EuaHRtbCIKICAgICAgICAgdG9fdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9iLmh0bWwiCkBAIC01MjgsNyArNTUzLDggQEAKICAgICAgICAgICAgICAgICByZXEuYWRkX2hlYWRlcigiTm9uc2Vuc2UiLCAidmlraW5nPXdpdGhob2xkIikKICAgICAgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIlNwYW0iLCAic3BhbSIpCiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBtZXRob2QocmVxLCBNb2NrRmlsZSgpLCBjb2RlLCAiQmxhaCIsIHsibG9jYXRpb24iOiB0b191cmx9KQorICAgICAgICAgICAgICAgICAgICBtZXRob2QocmVxLCBNb2NrRmlsZSgpLCBjb2RlLCAiQmxhaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2NrSGVhZGVycyh7ImxvY2F0aW9uIjogdG9fdXJsfSkpCiAgICAgICAgICAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgogICAgICAgICAgICAgICAgICAgICAjIDMwNyBpbiByZXNwb25zZSB0byBQT1NUIHJlcXVpcmVzIHVzZXIgT0sKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNvZGUgPT0gMzA3IGFuZCBkYXRhIGlzIG5vdCBOb25lKQpAQCAtNTQ0LDM4ICs1NzAsNjUgQEAKIAogICAgICAgICAjIGxvb3AgZGV0ZWN0aW9uCiAgICAgICAgIHJlcSA9IFJlcXVlc3QoZnJvbV91cmwpCi0gICAgICAgIHJlcS5vcmlnaW5fcmVxX2hvc3QgPSAiZXhhbXBsZS5jb20iCi0gICAgICAgIGRlZiByZWRpcmVjdChoLCByZXEsIGNvZGUsIHVybD10b191cmwpOgotICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihoLCAiaHR0cF9lcnJvcl8lcyIgJSBjb2RlKQotICAgICAgICAgICAgbWV0aG9kKHJlcSwgTW9ja0ZpbGUoKSwgY29kZSwgIkJsYWgiLCB7ImxvY2F0aW9uIjogdXJsfSkKKyAgICAgICAgZGVmIHJlZGlyZWN0KGgsIHJlcSwgdXJsPXRvX3VybCk6CisgICAgICAgICAgICBoLmh0dHBfZXJyb3JfMzAyKHJlcSwgTW9ja0ZpbGUoKSwgMzAyLCAiQmxhaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiB1cmx9KSkKICAgICAgICAgIyBOb3RlIHRoYXQgdGhlICpvcmlnaW5hbCogcmVxdWVzdCBzaGFyZXMgdGhlIHNhbWUgcmVjb3JkIG9mCiAgICAgICAgICMgcmVkaXJlY3Rpb25zIHdpdGggdGhlIHN1Yi1yZXF1ZXN0cyBjYXVzZWQgYnkgdGhlIHJlZGlyZWN0aW9ucy4KLSAgICAgICAgIyBvbmNlCi0gICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgMzAyKQotICAgICAgICAjIHR3aWNlOiBsb29wIGRldGVjdGVkCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuSFRUUEVycm9yLCByZWRpcmVjdCwgaCwgcmVxLCAzMDIpCi0gICAgICAgICMgYW5kIGFnYWluCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuSFRUUEVycm9yLCByZWRpcmVjdCwgaCwgcmVxLCAzMDIpCi0gICAgICAgICMgYnV0IHRoaXMgaXMgYSBkaWZmZXJlbnQgcmVkaXJlY3QgY29kZSwgc28gT0suLi4KLSAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAzMDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuSFRUUEVycm9yLCByZWRpcmVjdCwgaCwgcmVxLCAzMDEpCi0gICAgICAgICMgb3JkZXIgZG9lc24ndCBtYXR0ZXIKLSAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAzMDMpCi0gICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgMzA3KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1cmxsaWIyLkhUVFBFcnJvciwgcmVkaXJlY3QsIGgsIHJlcSwgMzAzKQogCi0gICAgICAgICMgZGV0ZWN0IGVuZGxlc3Mgbm9uLXJlcGVhdGluZyBjaGFpbiBvZiByZWRpcmVjdHMKLSAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCkKLSAgICAgICAgcmVxLm9yaWdpbl9yZXFfaG9zdCA9ICJleGFtcGxlLmNvbSIKKyAgICAgICAgIyBkZXRlY3QgaW5maW5pdGUgbG9vcCByZWRpcmVjdCBvZiBhIFVSTCB0byBpdHNlbGYKKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCwgb3JpZ2luX3JlcV9ob3N0PSJleGFtcGxlLmNvbSIpCiAgICAgICAgIGNvdW50ID0gMAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgMzAyLCAiaHR0cDovL2V4YW1wbGUuY29tLyVkIiAlIGNvdW50KQorICAgICAgICAgICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvcjoKKyAgICAgICAgICAgICMgZG9uJ3Qgc3RvcCB1bnRpbCBtYXhfcmVwZWF0cywgYmVjYXVzZSBjb29raWVzIG1heSBpbnRyb2R1Y2Ugc3RhdGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlci5tYXhfcmVwZWF0cykKKworICAgICAgICAjIGRldGVjdCBlbmRsZXNzIG5vbi1yZXBlYXRpbmcgY2hhaW4gb2YgcmVkaXJlY3RzCisgICAgICAgIHJlcSA9IFJlcXVlc3QoZnJvbV91cmwsIG9yaWdpbl9yZXFfaG9zdD0iZXhhbXBsZS5jb20iKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZWRpcmVjdChoLCByZXEsICJodHRwOi8vZXhhbXBsZS5jb20vJWQiICUgY291bnQpCiAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKICAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyLm1heF9yZWRpcmVjdGlvbnMpCiAKKyAgICBkZWYgdGVzdF9jb29raWVfcmVkaXJlY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIE1vY2tIVFRQSGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5fY291bnQgPSAwCisgICAgICAgICAgICBkZWYgaHR0cF9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgICAgICAgICAgaW1wb3J0IG1pbWV0b29scworICAgICAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY291bnQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDEKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gbWltZXRvb2xzLk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdJTygiTG9jYXRpb246IGh0dHA6Ly93d3cuY3JhY2tlci5jb20vXHJcblxyXG4iKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LmVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAiLCByZXEsIE1vY2tGaWxlKCksIDMwMiwgIkZvdW5kIiwgbXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxID0gcmVxCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKCJcclxuXHJcbiIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwgbXNnLCAiIiwgcmVxLmdldF9mdWxsX3VybCgpKQorICAgICAgICAjIGNvb2tpZXMgc2hvdWxkbid0IGxlYWsgaW50byByZWRpcmVjdGVkIHJlcXVlc3RzCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBidWlsZF9vcGVuZXIsIEhUVFBIYW5kbGVyLCBIVFRQRXJyb3IsIFwKKyAgICAgICAgICAgICBIVFRQQ29va2llUHJvY2Vzc29yCisKKyAgICAgICAgZnJvbSB0ZXN0X2Nvb2tpZWxpYiBpbXBvcnQgaW50ZXJhY3RfbmV0c2NhcGUKKworICAgICAgICBjaiA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNqLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAic3BhbT1lZ2dzIikKKyAgICAgICAgaGggPSBNb2NrSFRUUEhhbmRsZXIoKQorICAgICAgICBjcCA9IEhUVFBDb29raWVQcm9jZXNzb3IoY2opCisgICAgICAgIG8gPSBidWlsZF9vcGVuZXIoaGgsIGNwKQorICAgICAgICBvLm9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoaC5yZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisKIAogY2xhc3MgTWlzY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3VybGxpYjIucHkgYi9MaWIvdXJsbGliMi5weQppbmRleCA3NzNjZDdkLi40NDhlOTQ4IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliMi5weQorKysgYi9MaWIvdXJsbGliMi5weQpAQCAtMTA2LDYgKzEwNiw3IEBACiBpbXBvcnQgdGltZQogaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgYmlzZWN0CitpbXBvcnQgY29va2llbGliCiAKIHRyeToKICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KQEAgLTE3Niw3ICsxNzcsOCBAQAogCiBjbGFzcyBSZXF1ZXN0OgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgZGF0YT1Ob25lLCBoZWFkZXJzPXt9KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBkYXRhPU5vbmUsIGhlYWRlcnM9e30sCisgICAgICAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdD1Ob25lLCB1bnZlcmlmaWFibGU9RmFsc2UpOgogICAgICAgICAjIHVud3JhcCgnPFVSTDp0eXBlOi8vaG9zdC9wYXRoPicpIC0tPiAndHlwZTovL2hvc3QvcGF0aCcKICAgICAgICAgc2VsZi5fX29yaWdpbmFsID0gdW53cmFwKHVybCkKICAgICAgICAgc2VsZi50eXBlID0gTm9uZQpAQCAtMTg4LDYgKzE5MCwxMCBAQAogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBoZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoa2V5LCB2YWx1ZSkKICAgICAgICAgc2VsZi51bnJlZGlyZWN0ZWRfaGRycyA9IHt9CisgICAgICAgIGlmIG9yaWdpbl9yZXFfaG9zdCBpcyBOb25lOgorICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0ID0gY29va2llbGliLnJlcXVlc3RfaG9zdChzZWxmKQorICAgICAgICBzZWxmLm9yaWdpbl9yZXFfaG9zdCA9IG9yaWdpbl9yZXFfaG9zdAorICAgICAgICBzZWxmLnVudmVyaWZpYWJsZSA9IHVudmVyaWZpYWJsZQogCiAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICAjIFhYWCB0aGlzIGlzIGEgZmFsbGJhY2sgbWVjaGFuaXNtIHRvIGd1YXJkIGFnYWluc3QgdGhlc2UKQEAgLTI0Miw2ICsyNDgsMTIgQEAKICAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnR5cGUgPSBob3N0LCB0eXBlCiAgICAgICAgIHNlbGYuX19yX2hvc3QgPSBzZWxmLl9fb3JpZ2luYWwKIAorICAgIGRlZiBnZXRfb3JpZ2luX3JlcV9ob3N0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vcmlnaW5fcmVxX2hvc3QKKworICAgIGRlZiBpc191bnZlcmlmaWFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnVudmVyaWZpYWJsZQorCiAgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICAjIHVzZWZ1bCBmb3Igc29tZXRoaW5nIGxpa2UgYXV0aGVudGljYXRpb24KICAgICAgICAgc2VsZi5oZWFkZXJzW2tleS5jYXBpdGFsaXplKCldID0gdmFsCkBAIC0yNTQsNiArMjY2LDE1IEBACiAgICAgICAgIHJldHVybiBib29sKGhlYWRlcl9uYW1lIGluIHNlbGYuaGVhZGVycyBvcgogICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZSBpbiBzZWxmLnVucmVkaXJlY3RlZF9oZHJzKQogCisgICAgZGVmIGdldF9oZWFkZXIoc2VsZiwgaGVhZGVyX25hbWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMuZ2V0KAorICAgICAgICAgICAgaGVhZGVyX25hbWUsCisgICAgICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzLmdldChoZWFkZXJfbmFtZSwgZGVmYXVsdCkpCisKKyAgICBkZWYgaGVhZGVyX2l0ZW1zKHNlbGYpOgorICAgICAgICBoZHJzID0gc2VsZi51bnJlZGlyZWN0ZWRfaGRycy5jb3B5KCkKKyAgICAgICAgaGRycy51cGRhdGUoc2VsZi5oZWFkZXJzKQorICAgICAgICByZXR1cm4gaGRycy5pdGVtcygpCiAKIGNsYXNzIE9wZW5lckRpcmVjdG9yOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKQEAgLTQ2MCw3ICs0ODEsMTEgQEAKICAgICAgICAgcmFpc2UgSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgY29kZSwgbXNnLCBoZHJzLCBmcCkKIAogY2xhc3MgSFRUUFJlZGlyZWN0SGFuZGxlcihCYXNlSGFuZGxlcik6Ci0gICAgIyBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdGlvbnMgYmVmb3JlIGFzc3VtaW5nIHdlJ3JlIGluIGEgbG9vcAorICAgICMgbWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3Rpb25zIHRvIGFueSBzaW5nbGUgVVJMCisgICAgIyB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzdGF0ZSB0aGF0IGNvb2tpZXMgaW50cm9kdWNlCisgICAgbWF4X3JlcGVhdHMgPSA0CisgICAgIyBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiByZWRpcmVjdGlvbnMgKHJlZ2FyZGxlc3Mgb2YgVVJMKSBiZWZvcmUKKyAgICAjIGFzc3VtaW5nIHdlJ3JlIGluIGEgbG9vcAogICAgIG1heF9yZWRpcmVjdGlvbnMgPSAxMAogCiAgICAgZGVmIHJlZGlyZWN0X3JlcXVlc3Qoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzLCBuZXd1cmwpOgpAQCAtNDgxLDcgKzUwNiwxMCBAQAogICAgICAgICAgICAgIyBmcm9tIHRoZSB1c2VyIChvZiB1cmxsaWIyLCBpbiB0aGlzIGNhc2UpLiAgSW4gcHJhY3RpY2UsCiAgICAgICAgICAgICAjIGVzc2VudGlhbGx5IGFsbCBjbGllbnRzIGRvIHJlZGlyZWN0IGluIHRoaXMgY2FzZSwgc28gd2UKICAgICAgICAgICAgICMgZG8gdGhlIHNhbWUuCi0gICAgICAgICAgICByZXR1cm4gUmVxdWVzdChuZXd1cmwsIGhlYWRlcnM9cmVxLmhlYWRlcnMpCisgICAgICAgICAgICByZXR1cm4gUmVxdWVzdChuZXd1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXJlcS5oZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0PXJlcS5nZXRfb3JpZ2luX3JlcV9ob3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnZlcmlmaWFibGU9VHJ1ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGNvZGUsIG1zZywgaGVhZGVycywgZnApCiAKQEAgLTQ5MCwxMCArNTE4LDEyIEBACiAgICAgIyBoYXZlIGFscmVhZHkgc2Vlbi4gIERvIHRoaXMgYnkgYWRkaW5nIGEgaGFuZGxlci1zcGVjaWZpYwogICAgICMgYXR0cmlidXRlIHRvIHRoZSBSZXF1ZXN0IG9iamVjdC4KICAgICBkZWYgaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKKyAgICAgICAgIyBTb21lIHNlcnZlcnMgKGluY29ycmVjdGx5KSByZXR1cm4gbXVsdGlwbGUgTG9jYXRpb24gaGVhZGVycworICAgICAgICAjIChzbyBwcm9iYWJseSBzYW1lIGdvZXMgZm9yIFVSSSkuICBVc2UgZmlyc3QgaGVhZGVyLgogICAgICAgICBpZiAnbG9jYXRpb24nIGluIGhlYWRlcnM6Ci0gICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzWydsb2NhdGlvbiddCisgICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzLmdldGhlYWRlcnMoJ2xvY2F0aW9uJylbMF0KICAgICAgICAgZWxpZiAndXJpJyBpbiBoZWFkZXJzOgotICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVyc1sndXJpJ10KKyAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnMuZ2V0aGVhZGVycygndXJpJylbMF0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBuZXd1cmwgPSB1cmxwYXJzZS51cmxqb2luKHJlcS5nZXRfZnVsbF91cmwoKSwgbmV3dXJsKQpAQCAtNTA2LDIwICs1MzYsMTYgQEAKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgICMgbG9vcCBkZXRlY3Rpb24KLSAgICAgICAgIyAucmVkaXJlY3RfZGljdCBoYXMgYSBrZXkgKHVybCwgY29kZSkgaWYgdXJsIHdhcyBwcmV2aW91c2x5Ci0gICAgICAgICMgdmlzaXRlZCBhcyBhIHJlc3VsdCBvZiBhIHJlZGlyZWN0aW9uIHdpdGggdGhhdCBjb2RlLiAgVGhlCi0gICAgICAgICMgY29kZSBpcyBuZWVkZWQgaW4gYWRkaXRpb24gdG8gdGhlIFVSTCBiZWNhdXNlIHZpc2l0aW5nIGEgVVJMCi0gICAgICAgICMgdHdpY2UgaXNuJ3QgbmVjZXNzYXJpbHkgYSBsb29wOiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHdheQotICAgICAgICAjIHRvIHJlZGlyZWN0ICgzMDEsIDMwMiwgMzAzLCAzMDcsIHJlZnJlc2gpLgotICAgICAgICBrZXkgPSAobmV3dXJsLCBjb2RlKQorICAgICAgICAjIC5yZWRpcmVjdF9kaWN0IGhhcyBhIGtleSB1cmwgaWYgdXJsIHdhcyBwcmV2aW91c2x5IHZpc2l0ZWQuCiAgICAgICAgIGlmIGhhc2F0dHIocmVxLCAncmVkaXJlY3RfZGljdCcpOgogICAgICAgICAgICAgdmlzaXRlZCA9IG5ldy5yZWRpcmVjdF9kaWN0ID0gcmVxLnJlZGlyZWN0X2RpY3QKLSAgICAgICAgICAgIGlmIGtleSBpbiB2aXNpdGVkIG9yIGxlbih2aXNpdGVkKSA+PSBzZWxmLm1heF9yZWRpcmVjdGlvbnM6CisgICAgICAgICAgICBpZiAodmlzaXRlZC5nZXQobmV3dXJsLCAwKSA+PSBzZWxmLm1heF9yZXBlYXRzIG9yCisgICAgICAgICAgICAgICAgbGVuKHZpc2l0ZWQpID49IHNlbGYubWF4X3JlZGlyZWN0aW9ucyk6CiAgICAgICAgICAgICAgICAgcmFpc2UgSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmZfbXNnICsgbXNnLCBoZWFkZXJzLCBmcCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHZpc2l0ZWQgPSBuZXcucmVkaXJlY3RfZGljdCA9IHJlcS5yZWRpcmVjdF9kaWN0ID0ge30KLSAgICAgICAgdmlzaXRlZFtrZXldID0gTm9uZQorICAgICAgICB2aXNpdGVkW25ld3VybF0gPSB2aXNpdGVkLmdldChuZXd1cmwsIDApICsgMQogCiAgICAgICAgICMgRG9uJ3QgY2xvc2UgdGhlIGZwIHVudGlsIHdlIGFyZSBzdXJlIHRoYXQgd2Ugd29uJ3QgdXNlIGl0CiAgICAgICAgICMgd2l0aCBIVFRQRXJyb3IuCkBAIC05MTIsNyArOTM4LDcgQEAKICAgICBkZWYgc2V0X2h0dHBfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CiAgICAgICAgIHNlbGYuX2RlYnVnbGV2ZWwgPSBsZXZlbAogCi0gICAgZGVmIGRvX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgZGVmIGRvX3JlcXVlc3RfKHNlbGYsIHJlcXVlc3QpOgogICAgICAgICBob3N0ID0gcmVxdWVzdC5nZXRfaG9zdCgpCiAgICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ25vIGhvc3QgZ2l2ZW4nKQpAQCAtOTg3LDcgKzEwMTMsNyBAQAogICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihodHRwbGliLkhUVFBDb25uZWN0aW9uLCByZXEpCiAKLSAgICBodHRwX3JlcXVlc3QgPSBBYnN0cmFjdEhUVFBIYW5kbGVyLmRvX3JlcXVlc3QKKyAgICBodHRwX3JlcXVlc3QgPSBBYnN0cmFjdEhUVFBIYW5kbGVyLmRvX3JlcXVlc3RfCiAKIGlmIGhhc2F0dHIoaHR0cGxpYiwgJ0hUVFBTJyk6CiAgICAgY2xhc3MgSFRUUFNIYW5kbGVyKEFic3RyYWN0SFRUUEhhbmRsZXIpOgpAQCAtOTk1LDcgKzEwMjEsMjQgQEAKICAgICAgICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24sIHJlcSkKIAotICAgICAgICBodHRwc19yZXF1ZXN0ID0gQWJzdHJhY3RIVFRQSGFuZGxlci5kb19yZXF1ZXN0CisgICAgICAgIGh0dHBzX3JlcXVlc3QgPSBBYnN0cmFjdEhUVFBIYW5kbGVyLmRvX3JlcXVlc3RfCisKK2NsYXNzIEhUVFBDb29raWVQcm9jZXNzb3IoQmFzZUhhbmRsZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29raWVqYXI9Tm9uZSk6CisgICAgICAgIGlmIGNvb2tpZWphciBpcyBOb25lOgorICAgICAgICAgICAgY29va2llamFyID0gQ29va2llSmFyKCkKKyAgICAgICAgc2VsZi5jb29raWVqYXIgPSBjb29raWVqYXIKKworICAgIGRlZiBodHRwX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgIHNlbGYuY29va2llamFyLmFkZF9jb29raWVfaGVhZGVyKHJlcXVlc3QpCisgICAgICAgIHJldHVybiByZXF1ZXN0CisKKyAgICBkZWYgaHR0cF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSk6CisgICAgICAgIHNlbGYuY29va2llamFyLmV4dHJhY3RfY29va2llcyhyZXNwb25zZSwgcmVxdWVzdCkKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKyAgICBodHRwc19yZXF1ZXN0ID0gaHR0cF9yZXF1ZXN0CisgICAgaHR0cHNfcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlCiAKIGNsYXNzIFVua25vd25IYW5kbGVyKEJhc2VIYW5kbGVyKToKICAgICBkZWYgdW5rbm93bl9vcGVuKHNlbGYsIHJlcSk6Cg==