IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiVGVzdHMgZm9yIGNvb2tpZWxpYi5weS4iIiIKCmltcG9ydCByZSwgb3MsIHRpbWUKZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKCmZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CgpjbGFzcyBEYXRlVGltZVRlc3RzKFRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF90aW1lMmlzb3ooc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUyaXNvegoKICAgICAgICBiYXNlID0gMTAxOTIyNzAwMAogICAgICAgIGRheSA9IDI0KjM2MDAKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSksICIyMDAyLTA0LTE5IDE0OjM2OjQwWiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrZGF5KSwgIjIwMDItMDQtMjAgMTQ6MzY6NDBaIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSsyKmRheSksICIyMDAyLTA0LTIxIDE0OjM2OjQwWiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrMypkYXkpLCAiMjAwMi0wNC0yMiAxNDozNjo0MFoiKQoKICAgICAgICBheiA9IHRpbWUyaXNveigpCiAgICAgICAgYnogPSB0aW1lMmlzb3ooNTAwMDAwKQogICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgogICAgICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHIiXlxkezR9LVxkXGQtXGRcZCBcZFxkOlxkXGQ6XGRcZFokIiwgdGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHRpbWUyaXNveiBmb3JtYXQ6ICVzICVzIiAlIChheiwgYnopKQoKICAgIGRlZiB0ZXN0X2h0dHAydGltZShzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCgogICAgICAgIGRlZiBwYXJzZV9kYXRlKHRleHQpOgogICAgICAgICAgICByZXR1cm4gdGltZS5nbXRpbWUoaHR0cDJ0aW1lKHRleHQpKVs6Nl0KCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDEgSmFuIDIwMDEiKSwgKDIwMDEsIDEsIDEsIDAsIDAsIDAuMCkpCgogICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYXJvdW5kIHllYXIgMjA3MAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2RhdGUoIjAzLUZlYi0yMCIpLCAoMjAyMCwgMiwgMywgMCwgMCwgMC4wKSkKCiAgICAgICAgIyB0aGlzIHRlc3Qgd2lsbCBicmVhayBhcm91bmQgeWVhciAyMDQ4CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDMtRmViLTk4IiksICgxOTk4LCAyLCAzLCAwLCAwLCAwLjApKQoKICAgIGRlZiB0ZXN0X2h0dHAydGltZV9mb3JtYXRzKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUsIHRpbWUyaXNvegoKICAgICAgICAjIHRlc3QgaHR0cDJ0aW1lIGZvciBzdXBwb3J0ZWQgZGF0ZXMuICBUZXN0IGNhc2VzIHdpdGggMiBkaWdpdCB5ZWFyCiAgICAgICAgIyB3aWxsIHByb2JhYmx5IGJyZWFrIGluIHllYXIgMjA0NC4KICAgICAgICB0ZXN0cyA9IFsKICAgICAgICAgJ1RodSwgMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgcHJvcG9zZWQgbmV3IEhUVFAgZm9ybWF0CiAgICAgICAgICdUaHVyc2RheSwgMDMtRmViLTk0IDAwOjAwOjAwIEdNVCcsICAjIG9sZCByZmM4NTAgSFRUUCBmb3JtYXQKICAgICAgICAgJ1RodXJzZGF5LCAwMy1GZWItMTk5NCAwMDowMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0CgogICAgICAgICAnMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXkpCiAgICAgICAgICcwMy1GZWItOTQgMDA6MDA6MDAgR01UJywgICMgb2xkIHJmYzg1MCAobm8gd2Vla2RheSkKICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXkpCiAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzKQogICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDAnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzLCBubyB0eikKCiAgICAgICAgICcwMy1GZWItOTQnLCAgIyBvbGQgcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQogICAgICAgICAnMDMtRmViLTE5OTQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQogICAgICAgICAnMDMgRmViIDE5OTQnLCAgIyBwcm9wb3NlZCBuZXcgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCgogICAgICAgICAjIEEgZmV3IHRlc3RzIHdpdGggZXh0cmEgc3BhY2UgYXQgdmFyaW91cyBwbGFjZXMKICAgICAgICAgJyAgMDMgICBGZWIgICAxOTk0ICAwOjAwICAnLAogICAgICAgICAnICAwMy1GZWItMTk5NCAgJywKICAgICAgICBdCgogICAgICAgIHRlc3RfdCA9IDc2MDIzMzYwMCAgIyBhc3N1bWUgYnJva2VuIFBPU0lYIGNvdW50aW5nIG9mIHNlY29uZHMKICAgICAgICByZXN1bHQgPSB0aW1lMmlzb3oodGVzdF90KQogICAgICAgIGV4cGVjdGVkID0gIjE5OTQtMDItMDMgMDA6MDA6MDBaIgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzICA9PiAgJyVzJyAoJXMpIiAlICh0ZXN0X3QsIHJlc3VsdCwgZXhwZWN0ZWQpKQoKICAgICAgICBmb3IgcyBpbiB0ZXN0czoKICAgICAgICAgICAgdCA9IGh0dHAydGltZShzKQogICAgICAgICAgICB0MiA9IGh0dHAydGltZShzLmxvd2VyKCkpCiAgICAgICAgICAgIHQzID0gaHR0cDJ0aW1lKHMudXBwZXIoKSkKCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ID09IHQyID09IHQzID09IHRlc3RfdCwKICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnICA9PiAgJXMsICVzLCAlcyAoJXMpIiAlIChzLCB0LCB0MiwgdDMsIHRlc3RfdCkpCgogICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2dhcmJhZ2Uoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZQoKICAgICAgICBmb3IgdGVzdCBpbiBbCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnR2FyYmFnZScsCiAgICAgICAgICAgICdNYW5kYWcgMTYuIFNlcHRlbWJlciAxOTk2JywKICAgICAgICAgICAgJzAxLTAwLTE5ODAnLAogICAgICAgICAgICAnMDEtMTMtMTk4MCcsCiAgICAgICAgICAgICcwMC0wMS0xOTgwJywKICAgICAgICAgICAgJzMyLTAxLTE5ODAnLAogICAgICAgICAgICAnMDEtMDEtMTk4MCAyNTowMDowMCcsCiAgICAgICAgICAgICcwMS0wMS0xOTgwIDAwOjYxOjAwJywKICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6MDA6NjInLAogICAgICAgICAgICBdOgogICAgICAgICAgICBzZWxmLmFzc2VydF8oaHR0cDJ0aW1lKHRlc3QpIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDJ0aW1lKCVzKSBpcyBub3QgTm9uZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSh0ZXN0KSAlcyIgJSAodGVzdCwgaHR0cDJ0aW1lKHRlc3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgKQoKCmNsYXNzIEhlYWRlclRlc3RzKFRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKCiAgICAgICAgIyBxdW90ZXMgc2hvdWxkIGJlIHN0cmlwcGVkCiAgICAgICAgZXhwZWN0ZWQgPSBbWygnZm9vJywgJ2JhcicpLCAoJ2V4cGlyZXMnLCAyMjA5MDY5NDEyTCksICgndmVyc2lvbicsICcwJyldXQogICAgICAgIGZvciBoZHIgaW4gWwogICAgICAgICAgICAnZm9vPWJhcjsgZXhwaXJlcz0wMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQnLAogICAgICAgICAgICAnZm9vPWJhcjsgZXhwaXJlcz0iMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIicsCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKCiAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzX3NwZWNpYWxfbmFtZXMoc2VsZik6CiAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgIyBvZiBTZXQtQ29va2llOiBoZWFkZXIKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycwoKICAgICAgICAjIENvb2tpZSB3aXRoIG5hbWUgJ2V4cGlyZXMnCiAgICAgICAgaGRyID0gJ2V4cGlyZXM9MDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UJwogICAgICAgIGV4cGVjdGVkID0gW1soImV4cGlyZXMiLCAiMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIiksICgidmVyc2lvbiIsICIwIildXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKCiAgICBkZWYgdGVzdF9qb2luX2hlYWRlcl93b3JkcyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgam9pbl9oZWFkZXJfd29yZHMKCiAgICAgICAgam9pbmVkID0gam9pbl9oZWFkZXJfd29yZHMoW1soImZvbyIsIE5vbmUpLCAoImJhciIsICJiYXoiKV1dKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGpvaW5lZCwgImZvbzsgYmFyPWJheiIpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGpvaW5faGVhZGVyX3dvcmRzKFtbXV0pLCAiIikKCiAgICBkZWYgdGVzdF9zcGxpdF9oZWFkZXJfd29yZHMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHNwbGl0X2hlYWRlcl93b3JkcwoKICAgICAgICB0ZXN0cyA9IFsKICAgICAgICAgICAgKCJmb28iLCBbWygiZm9vIiwgTm9uZSldXSksCiAgICAgICAgICAgICgiZm9vPWJhciIsIFtbKCJmb28iLCAiYmFyIildXSksCiAgICAgICAgICAgICgiICAgZm9vICAgIiwgW1soImZvbyIsIE5vbmUpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0gICAiLCBbWygiZm9vIiwgIiIpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0iLCBbWygiZm9vIiwgIiIpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0gICA7ICIsIFtbKCJmb28iLCAiIildXSksCiAgICAgICAgICAgICgiICAgZm9vPSAgIDsgYmFyPSBiYXogIiwgW1soImZvbyIsICIiKSwgKCJiYXIiLCAiYmF6IildXSksCiAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgW1soImZvbyIsICJiYXIiKSwgKCJiYXIiLCAiYmF6IildXSksCiAgICAgICAgICAgICMgZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIHRoaXMgbmV4dCBmYWlscywgYnV0IGl0IHdvcmtzIEFUTQogICAgICAgICAgICAoImZvbz0gYmFyPWJheiIsIFtbKCJmb28iLCAiYmFyPWJheiIpXV0pLAogICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsIFtbKCJmb28iLCAiYmFyIiksICgiYmFyIiwgImJheiIpXV0pLAogICAgICAgICAgICAoJ2ZvbyBiYXIgYmF6JywgW1soImZvbyIsIE5vbmUpLCAoImJhciIsIE5vbmUpLCAoImJheiIsIE5vbmUpXV0pLAogICAgICAgICAgICAoImEsIGIsIGMiLCBbWygiYSIsIE5vbmUpXSwgWygiYiIsIE5vbmUpXSwgWygiYyIsIE5vbmUpXV0pLAogICAgICAgICAgICAocidmb287IGJhcj1iYXosIHNwYW09LCBmb289IlwsXDtcIiIsIGJhcj0gJywKICAgICAgICAgICAgIFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCAiYmF6IildLAogICAgICAgICAgICAgIFsoInNwYW0iLCAiIildLCBbKCJmb28iLCAnLDsiJyldLCBbKCJiYXIiLCAiIildXSksCiAgICAgICAgICAgIF0KCiAgICAgICAgZm9yIGFyZywgZXhwZWN0IGluIHRlc3RzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2ssIFN0cmluZ0lPCiAgICAgICAgICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhOb25lLCBmKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gIihlcnJvciAtLSB0cmFjZWJhY2sgZm9sbG93cylcblxuJXMiICUgZi5nZXR2YWx1ZSgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgIGV4cGVjdCwgIiIiCldoZW4gcGFyc2luZzogJyVzJwpFeHBlY3RlZDogICAgICclcycKR290OiAgICAgICAgICAnJXMnCiIiIiAlIChhcmcsIGV4cGVjdCwgcmVzdWx0KSkKCiAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHNwbGl0X2hlYWRlcl93b3Jkcywgam9pbl9oZWFkZXJfd29yZHMKCiAgICAgICAgdGVzdHMgPSBbCiAgICAgICAgICAgICgiZm9vIiwgImZvbyIpLAogICAgICAgICAgICAoImZvbz1iYXIiLCAiZm9vPWJhciIpLAogICAgICAgICAgICAoIiAgIGZvbyAgICIsICJmb28iKSwKICAgICAgICAgICAgKCJmb289IiwgJ2Zvbz0iIicpLAogICAgICAgICAgICAoImZvbz1iYXIgYmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCiAgICAgICAgICAgICgiZm9vPWJhcjtiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKICAgICAgICAgICAgKCdmb28gYmFyIGJheicsICJmb287IGJhcjsgYmF6IiksCiAgICAgICAgICAgIChyJ2Zvbz0iXCIiIGJhcj0iXFwiJywgcidmb289IlwiIjsgYmFyPSJcXCInKSwKICAgICAgICAgICAgKCdmb28sLCxiYXInLCAnZm9vLCBiYXInKSwKICAgICAgICAgICAgKCdmb289YmFyLGJhcj1iYXonLCAnZm9vPWJhciwgYmFyPWJheicpLAoKICAgICAgICAgICAgKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMScsCiAgICAgICAgICAgICAndGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIicpLAoKICAgICAgICAgICAgKCdmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicsCiAgICAgICAgICAgICAnZm9vPWJhcjsgcG9ydD0iODAsODEiOyBkaXNjYXJkLCBiYXI9YmF6JyksCgogICAgICAgICAgICAocidCYXNpYyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJywKICAgICAgICAgICAgIHInQmFzaWM7IHJlYWxtPSJcImZvb1xcXFxiYXJcIiInKQogICAgICAgICAgICBdCgogICAgICAgIGZvciBhcmcsIGV4cGVjdCBpbiB0ZXN0czoKICAgICAgICAgICAgaW5wdXQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCiAgICAgICAgICAgIHJlcyA9IGpvaW5faGVhZGVyX3dvcmRzKGlucHV0KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXMsIGV4cGVjdCwgIiIiCldoZW4gcGFyc2luZzogJyVzJwpFeHBlY3RlZDogICAgICclcycKR290OiAgICAgICAgICAnJXMnCklucHV0IHdhczogICAgJyVzJwoiIiIgJSAoYXJnLCBleHBlY3QsIHJlcywgaW5wdXQpKQoKCmNsYXNzIEZha2VSZXNwb25zZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPVtdLCB1cmw9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVyczogbGlzdCBvZiBSRkM4MjItc3R5bGUgJ0tleTogdmFsdWUnIHN0cmluZ3MKICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgbWltZXRvb2xzLCBTdHJpbmdJTwogICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXG4iLmpvaW4oaGVhZGVycykpCiAgICAgICAgc2VsZi5faGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKGYpCiAgICAgICAgc2VsZi5fdXJsID0gdXJsCiAgICBkZWYgaW5mbyhzZWxmKTogcmV0dXJuIHNlbGYuX2hlYWRlcnMKCmRlZiBpbnRlcmFjdF8yOTY1KGNvb2tpZWphciwgdXJsLCAqc2V0X2Nvb2tpZV9oZHJzKToKICAgIHJldHVybiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgIlNldC1Db29raWUyIikKCmRlZiBpbnRlcmFjdF9uZXRzY2FwZShjb29raWVqYXIsIHVybCwgKnNldF9jb29raWVfaGRycyk6CiAgICByZXR1cm4gX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsICJTZXQtQ29va2llIikKCmRlZiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgaGRyX25hbWUpOgogICAgIiIiUGVyZm9ybSBhIHNpbmdsZSByZXF1ZXN0IC8gcmVzcG9uc2UgY3ljbGUsIHJldHVybmluZyBDb29raWU6IGhlYWRlci4iIiIKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICBjb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQogICAgY29va2llX2hkciA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiLCAiIikKICAgIGhlYWRlcnMgPSBbXQogICAgZm9yIGhkciBpbiBzZXRfY29va2llX2hkcnM6CiAgICAgICAgaGVhZGVycy5hcHBlbmQoIiVzOiAlcyIgJSAoaGRyX25hbWUsIGhkcikpCiAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgdXJsKQogICAgY29va2llamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgIHJldHVybiBjb29raWVfaGRyCgoKY2xhc3MgRmlsZUNvb2tpZUphclRlc3RzKFRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2x3cF92YWx1ZWxlc3NfY29va2llKHNlbGYpOgogICAgICAgICMgY29va2llcyB3aXRoIG5vIHZhbHVlIHNob3VsZCBiZSBzYXZlZCBhbmQgbG9hZGVkIGNvbnNpc3RlbnRseQogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIKICAgICAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KICAgICAgICBjID0gTFdQQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYm9vJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImJvbyJdLnZhbHVlLCBOb25lKQogICAgICAgIHRyeToKICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQogICAgICAgICAgICBjID0gTFdQQ29va2llSmFyKCkKICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiYm9vIl0udmFsdWUsIE5vbmUpCgogICAgZGVmIHRlc3RfYmFkX21hZ2ljKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXIsIExvYWRFcnJvcgogICAgICAgICMgSU9FcnJvcnMgKGVnLiBmaWxlIGRvZXNuJ3QgZXhpc3QpIGFyZSBhbGxvd2VkIHRvIHByb3BhZ2F0ZQogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgICAgIGZvciBjb29raWVqYXJfY2xhc3MgaW4gTFdQQ29va2llSmFyLCBNb3ppbGxhQ29va2llSmFyOgogICAgICAgICAgICBjID0gY29va2llamFyX2NsYXNzKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lPSJmb3IgdGhpcyB0ZXN0IHRvIHdvcmssIGEgZmlsZSB3aXRoIHRoaXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZSBzaG91bGQgbm90IGV4aXN0IikKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGV4YzoKICAgICAgICAgICAgICAgICMgZXhhY3RseSBJT0Vycm9yLCBub3QgTG9hZEVycm9yCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5fX2NsYXNzX18sIElPRXJyb3IpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIElPRXJyb3IgZm9yIGludmFsaWQgZmlsZW5hbWUiKQogICAgICAgICMgSW52YWxpZCBjb250ZW50cyBvZiBjb29raWVzIGZpbGUgKGVnLiBiYWQgbWFnaWMgc3RyaW5nKQogICAgICAgICMgY2F1c2VzIGEgTG9hZEVycm9yLgogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKICAgICAgICAgICAgZi53cml0ZSgib29wc1xuIikKICAgICAgICAgICAgZm9yIGNvb2tpZWphcl9jbGFzcyBpbiBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXI6CiAgICAgICAgICAgICAgICBjID0gY29va2llamFyX2NsYXNzKCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvYWRFcnJvciwgYy5sb2FkLCBmaWxlbmFtZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKCmNsYXNzIENvb2tpZVRlc3RzKFRlc3RDYXNlKToKICAgICMgWFhYCiAgICAjIEdldCByaWQgb2Ygc3RyaW5nIGNvbXBhcmlzb25zIHdoZXJlIG5vdCBhY3R1YWxseSB0ZXN0aW5nIHN0ciAvIHJlcHIuCiAgICAjIC5jbGVhcigpIGV0Yy4KICAgICMgSVAgYWRkcmVzc2VzIGxpa2UgNTAgKHNpbmdsZSBudW1iZXIsIG5vIGRvdCkgYW5kIGRvbWFpbi1tYXRjaGluZwogICAgIyAgZnVuY3Rpb25zIChhbmQgaXNfSEROKT8gIFNlZSBkcmFmdCBSRkMgMjk2NSBlcnJhdGEuCiAgICAjIFN0cmljdG5lc3Mgc3dpdGNoZXMKICAgICMgaXNfdGhpcmRfcGFydHkoKQogICAgIyB1bnZlcmlmaWFiaWxpdHkgLyB0aGlyZC1wYXJ0eSBibG9ja2luZwogICAgIyBOZXRzY2FwZSBjb29raWVzIHdvcmsgdGhlIHNhbWUgYXMgUkZDIDI5NjUgd2l0aCByZWdhcmQgdG8gcG9ydC4KICAgICMgU2V0LUNvb2tpZSB3aXRoIG5lZ2F0aXZlIG1heCBhZ2UuCiAgICAjIElmIHR1cm4gUkZDIDI5NjUgaGFuZGxpbmcgb2ZmLCBTZXQtQ29va2llMiBjb29raWVzIHNob3VsZCBub3QgY2xvYmJlcgogICAgIyAgU2V0LUNvb2tpZSBjb29raWVzLgogICAgIyBDb29raWUyIHNob3VsZCBiZSBzZW50IGlmICphbnkqIGNvb2tpZXMgYXJlIG5vdCBWMSAoaWUuIFYwIE9SIFYyIGV0Yy4pLgogICAgIyBDb29raWVzIChWMSBhbmQgVjApIHdpdGggbm8gZXhwaXJ5IGRhdGUgc2hvdWxkIGJlIHNldCB0byBiZSBkaXNjYXJkZWQuCiAgICAjIFJGQyAyOTY1IFF1b3Rpbmc6CiAgICAjICBTaG91bGQgYWNjZXB0IHVucXVvdGVkIGNvb2tpZS1hdHRyaWJ1dGUgdmFsdWVzPyAgY2hlY2sgZXJyYXRhIGRyYWZ0LgogICAgIyAgIFdoaWNoIGFyZSByZXF1aXJlZCBvbiB0aGUgd2F5IGluIGFuZCBvdXQ/CiAgICAjICBTaG91bGQgYWx3YXlzIHJldHVybiBxdW90ZWQgY29va2llLWF0dHJpYnV0ZSB2YWx1ZXM/CiAgICAjIFByb3BlciB0ZXN0aW5nIG9mIHdoZW4gUkZDIDI5NjUgY2xvYmJlcnMgTmV0c2NhcGUgKHdhaXRpbmcgZm9yIGVycmF0YSkuCiAgICAjIFBhdGgtbWF0Y2ggb24gcmV0dXJuIChzYW1lIGZvciBWMCBhbmQgVjEpLgogICAgIyBSRkMgMjk2NSBhY2NlcHRhbmNlIGFuZCByZXR1cm5pbmcgcnVsZXMKICAgICMgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgaXMgcmVqZWN0ZWQuCgogICAgIyBOZXRzY2FwZSBwZWN1bGlhcml0aWVzIGxpc3QgZnJvbSBSb25hbGQgVHNjaGFsYXIuCiAgICAjIFRoZSBmaXJzdCB0d28gc3RpbGwgbmVlZCB0ZXN0cywgdGhlIHJlc3QgYXJlIGNvdmVyZWQuCiMjIC0gUXVvdGluZzogb25seSBxdW90ZXMgYXJvdW5kIHRoZSBleHBpcmVzIHZhbHVlIGFyZSByZWNvZ25pemVkIGFzIHN1Y2gKIyMgICAoYW5kIHllcywgc29tZSBmb2xrcyBxdW90ZSB0aGUgZXhwaXJlcyB2YWx1ZSk7IHF1b3RlcyBhcm91bmQgYW55IG90aGVyCiMjICAgdmFsdWUgYXJlIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdmFsdWUuCiMjIC0gV2hpdGUgc3BhY2U6IHdoaXRlIHNwYWNlIGFyb3VuZCBuYW1lcyBhbmQgdmFsdWVzIGlzIGlnbm9yZWQKIyMgLSBEZWZhdWx0IHBhdGg6IGlmIG5vIHBhdGggcGFyYW1ldGVyIGlzIGdpdmVuLCB0aGUgcGF0aCBkZWZhdWx0cyB0byB0aGUKIyMgICBwYXRoIGluIHRoZSByZXF1ZXN0LXVyaSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0ICcvJy4gTm90ZQojIyAgIHRoYXQgdGhpcyBpcyBlbnRpcmVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBzcGVjIHNheXMuCiMjIC0gQ29tbWFzIGFuZCBvdGhlciBkZWxpbWl0ZXJzOiBOZXRzY2FwZSBqdXN0IHBhcnNlcyB1bnRpbCB0aGUgbmV4dCAnOycuCiMjICAgVGhpcyBtZWFucyBpdCB3aWxsIGFsbG93IGNvbW1hcyBldGMgaW5zaWRlIHZhbHVlcyAoYW5kIHllcywgYm90aAojIyAgIGNvbW1hcyBhbmQgZXF1YWxzIGFyZSBjb21tb25seSBhcHBlYXIgaW4gdGhlIGNvb2tpZSB2YWx1ZSkuIFRoaXMgYWxzbwojIyAgIG1lYW5zIHRoYXQgaWYgeW91IGZvbGQgbXVsdGlwbGUgU2V0LUNvb2tpZSBoZWFkZXIgZmllbGRzIGludG8gb25lLAojIyAgIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCBpdCdsbCBiZSBhIGhlYWRhY2hlIHRvIHBhcnNlIChhdCBsZWFzdCBteSBoZWFkCiMjICAgc3RhcnRzIGh1cnRpbmcgZXZlcnl0aW1lIEkgdGhpbmsgb2YgdGhhdCBjb2RlKS4KIyMgLSBFeHBpcmVzOiBZb3UnbGwgZ2V0IGFsbCBzb3J0cyBvZiBkYXRlIGZvcm1hdHMgaW4gdGhlIGV4cGlyZXMsCiMjICAgaW5jbHVkaW5nIGVtdHB5IGV4cGlyZXMgYXR0cmlidXRlcyAoImV4cGlyZXM9IikuIEJlIGFzIGZsZXhpYmxlIGFzIHlvdQojIyAgIGNhbiwgYW5kIGNlcnRhaW5seSBkb24ndCBleHBlY3QgdGhlIHdlZWtkYXkgdG8gYmUgdGhlcmU7IGlmIHlvdSBjYW4ndAojIyAgIHBhcnNlIGl0LCBqdXN0IGlnbm9yZSBpdCBhbmQgcHJldGVuZCBpdCdzIGEgc2Vzc2lvbiBjb29raWUuCiMjIC0gRG9tYWluLW1hdGNoaW5nOiBOZXRzY2FwZSB1c2VzIHRoZSAyLWRvdCBydWxlIGZvciBfYWxsXyBkb21haW5zLCBub3QKIyMgICBqdXN0IHRoZSA3IHNwZWNpYWwgVExEJ3MgbGlzdGVkIGluIHRoZWlyIHNwZWMuIEFuZCBmb2xrcyByZWx5IG9uCiMjICAgdGhhdC4uLgoKICAgIGRlZiB0ZXN0X2RvbWFpbl9yZXR1cm5fb2soc2VsZik6CiAgICAgICAgIyB0ZXN0IG9wdGltaXphdGlvbjogLmRvbWFpbl9yZXR1cm5fb2soKSBzaG91bGQgZmlsdGVyIG91dCBtb3N0CiAgICAgICAgIyBkb21haW5zIGluIHRoZSBDb29raWVKYXIgYmVmb3JlIHdlIHRyeSB0byBhY2Nlc3MgdGhlbSAoYmVjYXVzZSB0aGF0CiAgICAgICAgIyBtYXkgcmVxdWlyZSBkaXNrIGFjY2VzcyAtLSBpbiBwYXJ0aWN1bGFyLCB3aXRoIE1TSUVDb29raWVKYXIpCiAgICAgICAgIyBUaGlzIGlzIG9ubHkgYSByb3VnaCBjaGVjayBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgc28gaXQncyBub3QgdG9vCiAgICAgICAgIyBjcml0aWNhbCBhcyBsb25nIGFzIGl0J3Mgc3VmZmljaWVudGx5IGxpYmVyYWwuCiAgICAgICAgaW1wb3J0IGNvb2tpZWxpYiwgdXJsbGliMgogICAgICAgIHBvbCA9IGNvb2tpZWxpYi5EZWZhdWx0Q29va2llUG9saWN5KCkKICAgICAgICBmb3IgdXJsLCBkb21haW4sIG9rIGluIFsKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImJsYWguY29tIiwgRmFsc2UpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAicmh1YmFyYi5ibGFoLmNvbSIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgInJodWJhcmIuZm9vLmJhci5jb20iLCBGYWxzZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuZm9vLmJhci5jb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImZvby5iYXIuY29tIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuYmFyLmNvbSIsIFRydWUpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiY29tIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgInJodWJhcmIuZm9vLmNvbSIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiLmZvby5jb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vLmNvbSIsIFRydWUpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJjb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJyaHViYXJiLmZvbyIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICIuZm9vIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vLmxvY2FsIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiLmxvY2FsIiwgVHJ1ZSksCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQogICAgICAgICAgICByID0gcG9sLmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KQogICAgICAgICAgICBpZiBvazogc2VsZi5hc3NlcnRfKHIpCiAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0Xyhub3QgcikKCiAgICBkZWYgdGVzdF9taXNzaW5nX3ZhbHVlKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBsd3BfY29va2llX3N0cgoKICAgICAgICAjIG1pc3NpbmcgPSBzaWduIGluIENvb2tpZTogaGVhZGVyIGlzIHJlZ2FyZGVkIGJ5IE1vemlsbGEgYXMgYSBtaXNzaW5nCiAgICAgICAgIyBuYW1lLCBhbmQgYnkgY29va2llbGliIGFzIGEgbWlzc2luZyB2YWx1ZQogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJlZ2dzIl0KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICJlZ2dzIikKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICcic3BhbSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGx3cF9jb29raWVfc3RyKGNvb2tpZSksICgKICAgICAgICAgICAgcicic3BhbSI7IHBhdGg9Ii9mb28vIjsgZG9tYWluPSJ3d3cuYWNtZS5jb20iOyAnCiAgICAgICAgICAgICdwYXRoX3NwZWM7IGRpc2NhcmQ7IHZlcnNpb249MCcpKQogICAgICAgIG9sZF9zdHIgPSByZXByKGMpCiAgICAgICAgYy5zYXZlKGlnbm9yZV9leHBpcmVzPVRydWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSkKICAgICAgICAgICAgYy5yZXZlcnQoaWdub3JlX2V4cGlyZXM9VHJ1ZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy51bmxpbmsoYy5maWxlbmFtZSkKICAgICAgICAjIGNvb2tpZXMgdW5jaGFuZ2VkIGFwYXJ0IGZyb20gbG9zdCBpbmZvIHJlLiB3aGV0aGVyIHBhdGggd2FzIHNwZWNpZmllZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgICByZXByKGMpLAogICAgICAgICAgICByZS5zdWIoInBhdGhfc3BlY2lmaWVkPSVzIiAlIFRydWUsICJwYXRoX3NwZWNpZmllZD0lcyIgJSBGYWxzZSwKICAgICAgICAgICAgICAgICAgIG9sZF9zdHIpCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJyJzcGFtIjsgZWdncycpCgogICAgZGVmIHRlc3RfcmZjMjEwOV9oYW5kbGluZyhzZWxmKToKICAgICAgICAjIFJGQyAyMTA5IGNvb2tpZXMgYXJlIGhhbmRsZWQgYXMgUkZDIDI5NjUgb3IgTmV0c2NhcGUgY29va2llcywKICAgICAgICAjIGRlcGVuZGVudCBvbiBwb2xpY3kgc2V0dGluZ3MKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGZvciByZmMyMTA5X2FzX25ldHNjYXBlLCByZmMyOTY1LCB2ZXJzaW9uIGluIFsKICAgICAgICAgICAgIyBkZWZhdWx0IGFjY29yZGluZyB0byByZmMyOTY1IGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZAogICAgICAgICAgICAoTm9uZSwgRmFsc2UsIDApLAogICAgICAgICAgICAoTm9uZSwgVHJ1ZSwgMSksCiAgICAgICAgICAgICMgZXhwbGljaXQgcmZjMjEwOV9hc19uZXRzY2FwZQogICAgICAgICAgICAoRmFsc2UsIEZhbHNlLCBOb25lKSwgICMgdmVyc2lvbiBOb25lIGhlcmUgbWVhbnMgbm8gY29va2llIHN0b3JlZAogICAgICAgICAgICAoRmFsc2UsIFRydWUsIDEpLAogICAgICAgICAgICAoVHJ1ZSwgRmFsc2UsIDApLAogICAgICAgICAgICAoVHJ1ZSwgVHJ1ZSwgMCksCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHBvbGljeSA9IERlZmF1bHRDb29raWVQb2xpY3koCiAgICAgICAgICAgICAgICByZmMyMTA5X2FzX25ldHNjYXBlPXJmYzIxMDlfYXNfbmV0c2NhcGUsCiAgICAgICAgICAgICAgICByZmMyOTY1PXJmYzI5NjUpCiAgICAgICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5KQogICAgICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAibmk9bmk7IFZlcnNpb249MSIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bIm5pIl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZlcnNpb24gaXMgTm9uZSkgICMgZGlkbid0IGV4cGVjdCBhIHN0b3JlZCBjb29raWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLnZlcnNpb24sIHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIDI5NjUgY29va2llcyBhcmUgdW5hZmZlY3RlZAogICAgICAgICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgVmVyc2lvbj0xIikKICAgICAgICAgICAgICAgIGlmIHJmYzI5NjU6CiAgICAgICAgICAgICAgICAgICAgY29va2llMjk2NSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUyOTY1LnZlcnNpb24sIDEpCgogICAgZGVmIHRlc3RfbnNfcGFyc2VyKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERFRkFVTFRfSFRUUF9QT1JUCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9NYWluPS5hY21lLmNvbTsgcG9ydDsgYmxBcmdoPSJmZWVwIicpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ25pPW5pOyBwb3J0PTgwLDgwODAnKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICduaW5pPW5pJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbTo4MC8iLCAnZm9vPWJhcjsgZXhwaXJlcz0nKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICdzcGFtPWVnZ3M7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0iRm9vIEJhciAyNSAzMzoyMjoxMSAzMDIyIicpCgogICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbIi5hY21lLmNvbSJdWyIvIl1bInNwYW0iXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICIuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuZG9tYWluX3NwZWNpZmllZCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUucG9ydCwgREVGQVVMVF9IVFRQX1BPUlQpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCiAgICAgICAgIyBjYXNlIGlzIHByZXNlcnZlZAogICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAogICAgICAgICAgICAgICAgICAgICBub3QgY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibGFyZ2giKSkKCiAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmkiXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICJ3d3cuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLnBvcnQsICI4MCw4MDgwIikKICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnRfc3BlY2lmaWVkKQoKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJuaW5pIl0KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnQgaXMgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKCiAgICAgICAgIyBpbnZhbGlkIGV4cGlyZXMgc2hvdWxkIG5vdCBjYXVzZSBjb29raWUgdG8gYmUgZHJvcHBlZAogICAgICAgIGZvbyA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgc3BhbSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgc2VsZi5hc3NlcnRfKGZvby5leHBpcmVzIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRfKHNwYW0uZXhwaXJlcyBpcyBOb25lKQoKICAgIGRlZiB0ZXN0X25zX3BhcnNlcl9zcGVjaWFsX25hbWVzKHNlbGYpOgogICAgICAgICMgbmFtZXMgc3VjaCBhcyAnZXhwaXJlcycgYXJlIG5vdCBzcGVjaWFsIGluIGZpcnN0IG5hbWU9dmFsdWUgcGFpcgogICAgICAgICMgb2YgU2V0LUNvb2tpZTogaGVhZGVyCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZXhwaXJlcz1lZ2dzJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAndmVyc2lvbj1lZ2dzOyBzcGFtPWVnZ3MnKQoKICAgICAgICBjb29raWVzID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXQogICAgICAgIHNlbGYuYXNzZXJ0XygnZXhwaXJlcycgaW4gY29va2llcykKICAgICAgICBzZWxmLmFzc2VydF8oJ3ZlcnNpb24nIGluIGNvb2tpZXMpCgogICAgZGVmIHRlc3RfZXhwaXJlcyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgdGltZTJuZXRzY2FwZSwgQ29va2llSmFyCgogICAgICAgICMgaWYgZXhwaXJlcyBpcyBpbiBmdXR1cmUsIGtlZXAgY29va2llLi4uCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgZnV0dXJlID0gdGltZTJuZXRzY2FwZSh0aW1lLnRpbWUoKSszNjAwKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBub3cgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpLTEpCiAgICAgICAgIyAuLi4gYW5kIGlmIGluIHBhc3Qgb3IgcHJlc2VudCwgZGlzY2FyZCBpdAogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdmb289ImVnZ3MiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQogICAgICAgIGggPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQoKICAgICAgICAjIG1heC1hZ2UgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV4cGlyZXMsIGFuZCB6ZXJvIG1heC1hZ2UgaXMgcmVxdWVzdCB0bwogICAgICAgICMgZGVsZXRlIGJvdGggbmV3IGNvb2tpZSBhbmQgYW55IG9sZCBtYXRjaGluZyBjb29raWUKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgZXhwaXJlcz0lcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYmFyPSJiYXIiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcmVzPSVzOyBtYXgtYWdlPTAnICUgZnV0dXJlKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdiYXI9ImJhciI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0wOyBleHBpcmVzPSVzJyAlIGZ1dHVyZSkKICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgICMgdGVzdCBleHBpcnkgYXQgZW5kIG9mIHNlc3Npb24gZm9yIGNvb2tpZXMgd2l0aCBubyBleHBpcmVzIGF0dHJpYnV0ZQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LnJodWJhcmIubmV0LyIsICd3aHVtPSJmaXp6IicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtPSJiYXIiJyBpbiBoKQoKICAgICAgICAjIFhYWCBSRkMgMjk2NSBleHBpcnkgcnVsZXMgKHNvbWUgYXBwbHkgdG8gVjAgdG9vKQoKICAgIGRlZiB0ZXN0X2RlZmF1bHRfcGF0aChzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgICMgUkZDIDI5NjUKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaCIsICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRfKCIvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIiLAogICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsCiAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiL2JsYWgvcmh1YmFyYi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgICAgICAjIE5ldHNjYXBlCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoIiwgJ2VnZ3M9ImJhciInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsICdlZ2dzPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgIGRlZiB0ZXN0X2VzY2FwZV9wYXRoKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aAogICAgICAgIGNhc2VzID0gWwogICAgICAgICAgICAjIHF1b3RlZCBzYWZlCiAgICAgICAgICAgICgiL2ZvbyUyZi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKICAgICAgICAgICAgKCIvZm9vJTJGL2JhciIsICIvZm9vJTJGL2JhciIpLAogICAgICAgICAgICAjIHF1b3RlZCAlCiAgICAgICAgICAgICgiL2ZvbyUlL2JhciIsICIvZm9vJSUvYmFyIiksCiAgICAgICAgICAgICMgcXVvdGVkIHVuc2FmZQogICAgICAgICAgICAoIi9mbyUxOW8vYmFyIiwgIi9mbyUxOW8vYmFyIiksCiAgICAgICAgICAgICgiL2ZvJTdkby9iYXIiLCAiL2ZvJTdEby9iYXIiKSwKICAgICAgICAgICAgIyB1bnF1b3RlZCBzYWZlCiAgICAgICAgICAgICgiL2Zvby9iYXImIiwgIi9mb28vYmFyJiIpLAogICAgICAgICAgICAoIi9mb28vL2JhciIsICIvZm9vLy9iYXIiKSwKICAgICAgICAgICAgKCJcMTc2L2Zvby9iYXIiLCAiXDE3Ni9mb28vYmFyIiksCiAgICAgICAgICAgICMgdW5xdW90ZWQgdW5zYWZlCiAgICAgICAgICAgICgiL2Zvb1wwMzEvYmFyIiwgIi9mb28lMTkvYmFyIiksCiAgICAgICAgICAgICgiL1wxNzVmb28vYmFyIiwgIi8lN0Rmb28vYmFyIiksCiAgICAgICAgICAgICMgdW5pY29kZQogICAgICAgICAgICAodSIvZm9vL2Jhclx1YWJjZCIsICIvZm9vL2JhciVFQSVBRiU4RCIpLCAgIyBVVEYtOCBlbmNvZGVkCiAgICAgICAgICAgIF0KICAgICAgICBmb3IgYXJnLCByZXN1bHQgaW4gY2FzZXM6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZV9wYXRoKGFyZyksIHJlc3VsdCkKCiAgICBkZWYgdGVzdF9yZXF1ZXN0X3BhdGgoc2VsZik6CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcGF0aAogICAgICAgICMgd2l0aCBwYXJhbWV0ZXJzCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb25pY3VtOyIKICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyO3Npbmc9c29uZz9hcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb25pY3VtOyIKICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7c2luZz1zb25nP2FwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQogICAgICAgICMgd2l0aG91dCBwYXJhbWV0ZXJzCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb25pY3VtPyIKICAgICAgICAgICAgICAgICAgICAgICJhcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb25pY3VtPyIKICAgICAgICAgICAgICAgICAgICAgImFwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQogICAgICAgICMgbWlzc2luZyBmaW5hbCBzbGFzaAogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcGF0aChyZXEpLCAiLyIpCgogICAgZGVmIHRlc3RfcmVxdWVzdF9wb3J0KHNlbGYpOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BvcnQsIERFRkFVTFRfSFRUUF9QT1JUCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToxMjM0LyIsCiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206NDMyMSJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcG9ydChyZXEpLCAiMTIzNCIpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjQzMjEifSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BvcnQocmVxKSwgREVGQVVMVF9IVFRQX1BPUlQpCgogICAgZGVmIHRlc3RfcmVxdWVzdF9ob3N0KHNlbGYpOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X2hvc3QKICAgICAgICAjIHRoaXMgcmVxdWVzdCBpcyBpbGxlZ2FsIChSRkMyNjE2LCAxNC4yLjMpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQogICAgICAgICMgbGlid3d3LXBlcmwgd2FudHMgdGhpcyByZXNwb25zZSwgYnV0IHRoYXQgc2VlbXMgd3JvbmcgKFJGQyAyNjE2LAogICAgICAgICMgc2VjdGlvbiA1LjIsIHBvaW50IDEuLCBhbmQgUkZDIDI5NjUgc2VjdGlvbiAxLCBwYXJhZ3JhcGggMykKICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAiMS4xLjEuMSIpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAiaXJyZWxldmFudC5jb20ifSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCiAgICAgICAgIyBub3QgYWN0dWFsbHkgc3VyZSB0aGlzIG9uZSBpcyB2YWxpZCBSZXF1ZXN0IG9iamVjdCwgc28gbWF5YmUgc2hvdWxkCiAgICAgICAgIyByZW1vdmUgdGVzdCBmb3Igbm8gaG9zdCBpbiB1cmwgaW4gcmVxdWVzdF9ob3N0IGZ1bmN0aW9uPwogICAgICAgIHJlcSA9IFJlcXVlc3QoIi9yZXNvdXJjZS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbSJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKICAgICAgICAjIHBvcnQgc2hvdWxkbid0IGJlIGluIHJlcXVlc3QtaG9zdAogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MjM0NS9yZXNvdXJjZS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo1NDMyIn0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQoKICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaXNfSEROCiAgICAgICAgc2VsZi5hc3NlcnRfKGlzX0hETigiZm9vLmJhci5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIiIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuLmZvbyIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCJmb28uIikpCgogICAgZGVmIHRlc3RfcmVhY2goc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlYWNoCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goInd3dy5hY21lLmNvbSIpLCAiLmFjbWUuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5jb20iKSwgImFjbWUuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5sb2NhbCIpLCAiLmxvY2FsIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiLmxvY2FsIiksICIubG9jYWwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIuY29tIiksICIuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiLiIpLCAiLiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goIiIpLCAiIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiMTkyLjE2OC4wLjEiKSwgIjE5Mi4xNjguMC4xIikKCiAgICBkZWYgdGVzdF9kb21haW5fbWF0Y2goc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGRvbWFpbl9tYXRjaCwgdXNlcl9kb21haW5fbWF0Y2gKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJhLmIuYy5jb20iLCAiLmMuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJleGFtcGxlLmxvY2FsIiwgIi5sb2NhbCIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCJibGFoLmJsYWgiLCAiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiIiwgIiIpKQoKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgInguWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIubSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQogICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLiIpKQogICAgICAgICMgZW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCgogICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgogICAgICAgICMgQ29va2llcyB3aG9zZSBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZQogICAgICAgICMgZG9tYWluIGFyZSByZWplY3RlZC4KCiAgICAgICAgIyBYWFggZmFyIGZyb20gY29tcGxldGUKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5uYXN0eS5jb20vIiwKICAgICAgICAgICAgICAgICAgICAgICdmb289YmFyOyBkb21haW49ZnJpZW5kbHkub3JnOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQoKICAgIGRlZiB0ZXN0X3R3b19jb21wb25lbnRfZG9tYWluX25zKHNlbGYpOgogICAgICAgICMgTmV0c2NhcGU6IC53d3cuYmFyLmNvbSwgd3d3LmJhci5jb20sIC5iYXIuY29tLCBiYXIuY29tLCBubyBkb21haW4KICAgICAgICAjIHNob3VsZCBhbGwgZ2V0IGFjY2VwdGVkLCBhcyBzaG91bGQgLmFjbWUuY29tLCBhY21lLmNvbSBhbmQgbm8gZG9tYWluCiAgICAgICAgIyBmb3IgMi1jb21wb25lbnQgZG9tYWlucyBsaWtlIGFjbWUuY29tLgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgYyA9IENvb2tpZUphcigpCgogICAgICAgICMgdHdvLWNvbXBvbmVudCBWMCBkb21haW4gaXMgT0sKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ25zPWJhcicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbImZvby5uZXQiXVsiLyJdWyJucyJdLnZhbHVlLCAiYmFyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvIiksICJucz1iYXIiKQogICAgICAgICMgKndpbGwqIGJlIHJldHVybmVkIHRvIGFueSBvdGhlciBkb21haW4gKHVubGlrZSBSRkMgMjk2NSkuLi4KICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJucz1iYXIiKQogICAgICAgICMgLi4udW5sZXNzIHJlcXVlc3RlZCBvdGhlcndpc2UKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KAogICAgICAgICAgICBzdHJpY3RfbnNfZG9tYWluPURlZmF1bHRDb29raWVQb2xpY3kuRG9tYWluU3RyaWN0Tm9uRG9tYWluKQogICAgICAgIGMuc2V0X3BvbGljeShwb2wpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC8iKSwgIiIpCgogICAgICAgICMgdW5saWtlIFJGQyAyOTY1LCBldmVuIGV4cGxpY2l0IHR3by1jb21wb25lbnQgZG9tYWluIGlzIE9LLAogICAgICAgICMgYmVjYXVzZSAuZm9vLm5ldCBtYXRjaGVzIGZvby5uZXQKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvZm9vLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0xPWVnZ3M7IGRvbWFpbj1mb28ubmV0JykKICAgICAgICAjIGV2ZW4gaWYgc3RhcnRzIHdpdGggYSBkb3QgLS0gaW4gTlMgcnVsZXMsIC5mb28ubmV0IG1hdGNoZXMgZm9vLm5ldCEKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvZm9vL2Jhci8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtMj1lZ2dzOyBkb21haW49LmZvby5uZXQnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyIuZm9vLm5ldCJdWyIvZm9vIl1bInNwYW0xIl0udmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28vYmFyIl1bInNwYW0yIl0udmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFtMj1lZ2dzOyBzcGFtMT1lZ2dzOyBucz1iYXIiKQoKICAgICAgICAjIHRvcC1sZXZlbCBkb21haW4gaXMgdG9vIGdlbmVyYWwKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ25pbmk9Im5pIjsgZG9tYWluPS5uZXQnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKCiMjICAgICAgICAgIyBOZXRzY2FwZSBwcm90b2NvbCBkb2Vzbid0IGFsbG93IG5vbi1zcGVjaWFsIHRvcCBsZXZlbCBkb21haW5zIChzdWNoCiMjICAgICAgICAgIyBhcyBjby51aykgaW4gdGhlIGRvbWFpbiBhdHRyaWJ1dGUgdW5sZXNzIHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZQojIyAgICAgICAgICMgZG90cyBpbiBpdC4KICAgICAgICAjIE9oIHllcyBpdCBkb2VzISAgUmVhbCBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgY2hlY2sgdGhpcywgYW5kIHJlYWwKICAgICAgICAjIGNvb2tpZXMgKG9mIGNvdXJzZSkgcmVseSBvbiB0aGF0IGJlaGF2aW91ci4KICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5jby51ayIsICduYXN0eT10cmljazsgZG9tYWluPS5jby51aycpCiMjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNCkKCiAgICBkZWYgdGVzdF90d29fY29tcG9uZW50X2RvbWFpbl9yZmMyOTY1KHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCgogICAgICAgICMgdHdvLWNvbXBvbmVudCBWMSBkb21haW4gaXMgT0sKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iLCAnZm9vPWJhcjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyJmb28ubmV0Il1bIi8iXVsiZm9vIl0udmFsdWUsICJiYXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKICAgICAgICAjIHdvbid0IGJlIHJldHVybmVkIHRvIGFueSBvdGhlciBkb21haW4gKGJlY2F1c2UgZG9tYWluIHdhcyBpbXBsaWVkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC8iKSwgIiIpCgogICAgICAgICMgdW5sZXNzIGRvbWFpbiBpcyBnaXZlbiBleHBsaWNpdGx5LCBiZWNhdXNlIHRoZW4gaXQgbXVzdCBiZQogICAgICAgICMgcmV3cml0dGVuIHRvIHN0YXJ0IHdpdGggYSBkb3Q6IGZvby5uZXQgLS0+IC5mb28ubmV0LCB3aGljaCBkb2VzCiAgICAgICAgIyBub3QgZG9tYWluLW1hdGNoIGZvby5uZXQKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28iLAogICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgZG9tYWluPWZvby5uZXQ7IHBhdGg9L2ZvbzsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJFZlcnNpb249MTsgZm9vPWJhciIpCgogICAgICAgICMgZXhwbGljaXQgZm9vLm5ldCBmcm9tIHRocmVlLWNvbXBvbmVudCBkb21haW4gd3d3LmZvby5uZXQgKmRvZXMqIGdldAogICAgICAgICMgc2V0LCBiZWNhdXNlIC5mb28ubmV0IGRvbWFpbi1tYXRjaGVzIC5mb28ubmV0CiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0L2Zvby8iLAogICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgZG9tYWluPWZvby5uZXQ7IFZlcnNpb249IjEiJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyIuZm9vLm5ldCJdWyIvZm9vLyJdWyJzcGFtIl0udmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC9mb28vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJyRWZXJzaW9uPTE7IHNwYW09ZWdnczsgJERvbWFpbj0iZm9vLm5ldCInKQoKICAgICAgICAjIHRvcC1sZXZlbCBkb21haW4gaXMgdG9vIGdlbmVyYWwKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iLAogICAgICAgICAgICAgICAgICAgICAgJ25pPSJuaSI7IGRvbWFpbj0iLm5ldCI7IFZlcnNpb249IjEiJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCgogICAgICAgICMgUkZDIDI5NjUgZG9lc24ndCByZXF1aXJlIGJsb2NraW5nIHRoaXMKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLmNvLnVrLyIsCiAgICAgICAgICAgICAgICAgICAgICAnbmFzdHk9dHJpY2s7IGRvbWFpbj0uY28udWs7IFZlcnNpb249IjEiJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCgogICAgZGVmIHRlc3RfZG9tYWluX2FsbG93KHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeSgKICAgICAgICAgICAgYmxvY2tlZF9kb21haW5zPVsiYWNtZS5jb20iXSwKICAgICAgICAgICAgYWxsb3dlZF9kb21haW5zPVsid3d3LmFjbWUuY29tIl0pKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vYWNtZS5jb20vIikKICAgICAgICBoZWFkZXJzID0gWyJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8iXQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL2FjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKCiAgICAgICAgIyBzZXQgYSBjb29raWUgd2l0aCBub24tYWxsb3dlZCBkb21haW4uLi4KICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQogICAgICAgIGNvb2tpZXMgPSBjLm1ha2VfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBjLnNldF9jb29raWUoY29va2llc1swXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCgogICAgZGVmIHRlc3RfZG9tYWluX2Jsb2NrKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKCiAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeSgKICAgICAgICAgICAgcmZjMjk2NT1UcnVlLCBibG9ja2VkX2RvbWFpbnM9WyIuYWNtZS5jb20iXSkKICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1wb2wpCiAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIl0KCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMCkKCiAgICAgICAgcCA9IHBvbC5zZXRfYmxvY2tlZF9kb21haW5zKFsiYWNtZS5jb20iXSkKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgIGMuY2xlYXIoKQogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQogICAgICAgIHNlbGYuYXNzZXJ0XygocmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgcmVxLmhhc19oZWFkZXIoIkNvb2tpZTIiKSkpCgogICAgICAgIGMuY2xlYXIoKQogICAgICAgIHBvbC5zZXRfYmxvY2tlZF9kb21haW5zKFsiLmFjbWUuY29tIl0pCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQoKICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIGJsb2NrZWQgZG9tYWluLi4uCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGNvb2tpZXMgPSBjLm1ha2VfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBjLnNldF9jb29raWUoY29va2llc1swXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCgogICAgZGVmIHRlc3Rfc2VjdXJlKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgZm9yIG5zIGluIFRydWUsIEZhbHNlOgogICAgICAgICAgICBmb3Igd2hpdGVzcGFjZSBpbiAiICIsICIiOgogICAgICAgICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgICAgICAgICBpZiBuczoKICAgICAgICAgICAgICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9RmFsc2UpCiAgICAgICAgICAgICAgICAgICAgaW50ID0gaW50ZXJhY3RfbmV0c2NhcGUKICAgICAgICAgICAgICAgICAgICB2cyA9ICIiCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQogICAgICAgICAgICAgICAgICAgIGludCA9IGludGVyYWN0XzI5NjUKICAgICAgICAgICAgICAgICAgICB2cyA9ICI7IFZlcnNpb249MSIKICAgICAgICAgICAgICAgIGMuc2V0X3BvbGljeShwb2wpCiAgICAgICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbS8iCiAgICAgICAgICAgICAgICBpbnQoYywgdXJsLCAiZm9vMT1iYXIlcyVzIiAlICh2cywgd2hpdGVzcGFjZSkpCiAgICAgICAgICAgICAgICBpbnQoYywgdXJsLCAiZm9vMj1iYXIlczsgc2VjdXJlJXMiICUgICh2cywgd2hpdGVzcGFjZSkpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCiAgICAgICAgICAgICAgICAgICAgbm90IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbzEiXS5zZWN1cmUsCiAgICAgICAgICAgICAgICAgICAgIm5vbi1zZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgc2VjdXJlIikKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKICAgICAgICAgICAgICAgICAgICBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28yIl0uc2VjdXJlLAogICAgICAgICAgICAgICAgICAgICJzZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgbm9uLXNlY3VyZSIpCgogICAgZGVmIHRlc3RfcXVvdGVfY29va2llX3ZhbHVlKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCByJ2Zvbz1cYiJhInI7IFZlcnNpb249MScpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoLCByJyRWZXJzaW9uPTE7IGZvbz1cXGJcImFcInInKQoKICAgIGRlZiB0ZXN0X21pc3NpbmdfZmluYWxfc2xhc2goc2VsZik6CiAgICAgICAgIyBNaXNzaW5nIHNsYXNoIGZyb20gcmVxdWVzdCBVUkwncyBhYnNfcGF0aCBzaG91bGQgYmUgYXNzdW1lZCBwcmVzZW50LgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbSIKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgImZvbz1iYXI7IFZlcnNpb249MSIpCiAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQogICAgICAgIHNlbGYuYXNzZXJ0XyhyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCgogICAgZGVmIHRlc3RfZG9tYWluX21pcnJvcihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJEb21haW4iIG5vdCBpbiBoLAogICAgICAgICAgICAgICAgICAgICAiYWJzZW50IGRvbWFpbiByZXR1cm5lZCB3aXRoIGRvbWFpbiBwcmVzZW50IikKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgRG9tYWluPS5iYXIuY29tJykKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIyBub3RlIG1pc3NpbmcgaW5pdGlhbCBkb3QgaW4gRG9tYWluCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgRG9tYWluPWJhci5jb20nKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oJyREb21haW49ImJhci5jb20iJyBpbiBoLCAiZG9tYWluIG5vdCByZXR1cm5lZCIpCgogICAgZGVmIHRlc3RfcGF0aF9taXJyb3Ioc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygiUGF0aCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICJhYnNlbnQgcGF0aCByZXR1cm5lZCB3aXRoIHBhdGggcHJlc2VudCIpCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBhdGg9LycpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygnJFBhdGg9Ii8iJyBpbiBoLCAicGF0aCBub3QgcmV0dXJuZWQiKQoKICAgIGRlZiB0ZXN0X3BvcnRfbWlycm9yKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oIlBvcnQiIG5vdCBpbiBoLAogICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBvcnQgcmV0dXJuZWQgd2l0aCBwb3J0IHByZXNlbnQiKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0IikKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaCgiXCRQb3J0KFtePV18JCkiLCBoKSwKICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBubyB2YWx1ZSBub3QgcmV0dXJuZWQgd2l0aCBubyB2YWx1ZSIpCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQ9IjgwIicpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygnJFBvcnQ9IjgwIicgaW4gaCwKICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBzaW5nbGUgdmFsdWUgbm90IHJldHVybmVkIHdpdGggc2luZ2xlIHZhbHVlIikKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydD0iODAsODA4MCInKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oJyRQb3J0PSI4MCw4MDgwIicgaW4gaCwKICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgbm90IHJldHVybmVkIHdpdGggbXVsdGlwbGUgIgogICAgICAgICAgICAgICAgICAgICAidmFsdWVzIikKCiAgICBkZWYgdGVzdF9ub19yZXR1cm5fY29tbWVudChzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7ICcKICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCiAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oCiAgICAgICAgICAgICJDb21tZW50IiBub3QgaW4gaCwKICAgICAgICAgICAgIkNvbW1lbnQgb3IgQ29tbWVudFVSTCBjb29raWUtYXR0cmlidXRlcyByZXR1cm5lZCB0byBzZXJ2ZXIiKQoKICAgIGRlZiB0ZXN0X0Nvb2tpZV9pdGVyYXRvcihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBDb29raWUsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgY3MgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgICMgYWRkIHNvbWUgcmFuZG9tIGNvb2tpZXMKICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL2JsYWguc3BhbS5vcmcvIiwgJ2Zvbz1lZ2dzOyBWZXJzaW9uPTE7ICcKICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCiAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsICJzcGFtPWJhcjsgc2VjdXJlIikKICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsCiAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgc2VjdXJlOyBWZXJzaW9uPTEiKQogICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwKICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyOyBwYXRoPS87IFZlcnNpb249MSIpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuc29sLm5vIiwKICAgICAgICAgICAgICAgICAgICAgIHInYmFuZz13YWxsb3A7IHZlcnNpb249MTsgZG9tYWluPSIuc29sLm5vIjsgJwogICAgICAgICAgICAgICAgICAgICAgcidwb3J0PSI5MCwxMDAsIDgwLDgwODAiOyAnCiAgICAgICAgICAgICAgICAgICAgICByJ21heC1hZ2U9MTAwOyBDb21tZW50ID0gIkp1c3Qga2lkZGluZyEgKFwifFxcXFwpICInKQoKICAgICAgICB2ZXJzaW9ucyA9IFsxLCAxLCAxLCAwLCAxXQogICAgICAgIG5hbWVzID0gWyJiYW5nIiwgImZvbyIsICJmb28iLCAic3BhbSIsICJmb28iXQogICAgICAgIGRvbWFpbnMgPSBbIi5zb2wubm8iLCAiYmxhaC5zcGFtLm9yZyIsICJ3d3cuYWNtZS5jb20iLAogICAgICAgICAgICAgICAgICAgInd3dy5hY21lLmNvbSIsICJ3d3cuYWNtZS5jb20iXQogICAgICAgIHBhdGhzID0gWyIvIiwgIi8iLCAiLyIsICIvYmxhaCIsICIvYmxhaC8iXQoKICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKICAgICAgICAgICAgaSA9IDAKICAgICAgICAgICAgZm9yIGMgaW4gY3M6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjLCBDb29raWUpKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy52ZXJzaW9uLCB2ZXJzaW9uc1tpXSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMubmFtZSwgbmFtZXNbaV0pCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLmRvbWFpbiwgZG9tYWluc1tpXSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMucGF0aCwgcGF0aHNbaV0pCiAgICAgICAgICAgICAgICBpID0gaSArIDEKCiAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBwYXJzZV9uc19oZWFkZXJzCgogICAgICAgICMgbWlzc2luZyBkb21haW4gdmFsdWUgKGludmFsaWQgY29va2llKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vPWJhcjsgcGF0aD0vOyBkb21haW4iXSksCiAgICAgICAgICAgIFtbKCJmb28iLCAiYmFyIiksCiAgICAgICAgICAgICAgKCJwYXRoIiwgIi8iKSwgKCJkb21haW4iLCBOb25lKSwgKCJ2ZXJzaW9uIiwgIjAiKV1dCiAgICAgICAgICAgICkKICAgICAgICAjIGludmFsaWQgZXhwaXJlcyB2YWx1ZQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vPWJhcjsgZXhwaXJlcz1Gb28gQmFyIDEyIDMzOjIyOjExIDIwMDAiXSksCiAgICAgICAgICAgIFtbKCJmb28iLCAiYmFyIiksICgiZXhwaXJlcyIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KICAgICAgICAgICAgKQogICAgICAgICMgbWlzc2luZyBjb29raWUgdmFsdWUgKHZhbGlkIGNvb2tpZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhbImZvbyJdKSwKICAgICAgICAgICAgW1soImZvbyIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KICAgICAgICAgICAgKQogICAgICAgICMgc2hvdWxkbid0IGFkZCB2ZXJzaW9uIGlmIGhlYWRlciBpcyBlbXB0eQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoWyIiXSksIFtdKQoKICAgIGRlZiB0ZXN0X2JhZF9jb29raWVfaGVhZGVyKHNlbGYpOgoKICAgICAgICBkZWYgY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycyk6CiAgICAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKICAgICAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CiAgICAgICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCiAgICAgICAgICAgIHIgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMociwgcmVxKQogICAgICAgICAgICByZXR1cm4gYwoKICAgICAgICAjIG5vbmUgb2YgdGhlc2UgYmFkIGhlYWRlcnMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQKICAgICAgICBmb3IgaGVhZGVycyBpbiBbCiAgICAgICAgICAgIFsiU2V0LUNvb2tpZTogIl0sICAjIGFjdHVhbGx5LCBub3RoaW5nIHdyb25nIHdpdGggdGhpcwogICAgICAgICAgICBbIlNldC1Db29raWUyOiAiXSwgICMgZGl0dG8KICAgICAgICAgICAgIyBtaXNzaW5nIGRvbWFpbiB2YWx1ZQogICAgICAgICAgICBbIlNldC1Db29raWUyOiBhPWZvbzsgcGF0aD0vOyBWZXJzaW9uPTE7IGRvbWFpbiJdLAogICAgICAgICAgICAjIGJhZCBtYXgtYWdlCiAgICAgICAgICAgIFsiU2V0LUNvb2tpZTogYj1mb287IG1heC1hZ2U9b29wcyJdLAogICAgICAgICAgICBdOgogICAgICAgICAgICBjID0gY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycykKICAgICAgICAgICAgIyB0aGVzZSBiYWQgY29va2llcyBzaG91bGRuJ3QgYmUgc2V0CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMCkKCiAgICAgICAgIyBjb29raWUgd2l0aCBpbnZhbGlkIGV4cGlyZXMgaXMgdHJlYXRlZCBhcyBzZXNzaW9uIGNvb2tpZQogICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IGM9Zm9vOyBleHBpcmVzPUZvbyBCYXIgMTIgMzM6MjI6MTEgMjAwMCJdCiAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCiAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmV4YW1wbGUuY29tIl1bIi8iXVsiYyJdCiAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS5leHBpcmVzIGlzIE5vbmUpCgoKY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgogICAgIyBUZXN0cyB0YWtlbiBmcm9tIGxpYnd3dy1wZXJsLCB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgYW5kIGFkZGl0aW9ucy4KCiAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzEoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgRmlyc3Qgd2UgY2hlY2sgdGhhdCBpdCB3b3JrcyBmb3IgdGhlIG9yaWdpbmFsIGV4YW1wbGUgYXQKICAgICAgICAjIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWwKCiAgICAgICAgIyBDbGllbnQgcmVxdWVzdHMgYSBkb2N1bWVudCwgYW5kIHJlY2VpdmVzIGluIHRoZSByZXNwb25zZToKICAgICAgICAjCiAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS87IGV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtOTkgMjM6MTI6NDAgR01UCiAgICAgICAgIwogICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgogICAgICAgICMKICAgICAgICAjICAgICAgIENvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URQogICAgICAgICMKICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgogICAgICAgICMKICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8KICAgICAgICAjCiAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQogICAgICAgICMKICAgICAgICAjIENsaWVudCByZWNlaXZlczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBTSElQUElORz1GRURFWDsgcGF0aD0vZm8KICAgICAgICAjCiAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQogICAgICAgICMKICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi9mb28iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBTSElQUElORz1GRURFWAogICAgICAgICMKICAgICAgICAjIFRoZSBsYXN0IENvb2tpZSBpcyBidWdneSwgYmVjYXVzZSBib3RoIHNwZWNpZmljYXRpb25zIHNheSB0aGF0IHRoZQogICAgICAgICMgbW9zdCBzcGVjaWZpYyBjb29raWUgbXVzdCBiZSBzZW50IGZpcnN0LiAgU0hJUFBJTkc9RkVERVggaXMgdGhlCiAgICAgICAgIyBtb3N0IHNwZWNpZmljIGFuZCBzaG91bGQgdGh1cyBiZSBmaXJzdC4KCiAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCgogICAgICAgIGhlYWRlcnMgPSBbXQoKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IFRydWUpKQoKICAgICAgICAjcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKICAgICAgICAjICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsCiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKCiAgICAgICAgaGVhZGVycy5hcHBlbmQoCiAgICAgICAgICAgICJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8gOyAiCiAgICAgICAgICAgICJleHBpcmVzPVdlZG5lc2RheSwgMDktTm92LSVkIDIzOjEyOjQwIEdNVCIgJSB5ZWFyX3BsdXNfb25lKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLCAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby9iYXIiKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGgpCgogICAgICAgIGhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llOiBTSElQUElORz1GRURFWDsgcGF0aD0vZm9vJykKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgIlNISVBQSU5HPUZFREVYIiBub3QgaW4gaCkKCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vIikKICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKCiAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQogICAgICAgIHNlbGYuYXNzZXJ0XygoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGggYW5kCiAgICAgICAgICAgICAgICAgICAgICBoLnN0YXJ0c3dpdGgoIlNISVBQSU5HPUZFREVYOyIpKSkKCiAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzIoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAoKICAgICAgICAjIFNlY29uZCBFeGFtcGxlIHRyYW5zYWN0aW9uIHNlcXVlbmNlOgogICAgICAgICMKICAgICAgICAjIEFzc3VtZSBhbGwgbWFwcGluZ3MgZnJvbSBhYm92ZSBoYXZlIGJlZW4gY2xlYXJlZC4KICAgICAgICAjCiAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LwogICAgICAgICMKICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCiAgICAgICAgIwogICAgICAgICMgQ2xpZW50IHJlY2VpdmVzOgogICAgICAgICMKICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgcGF0aD0vYW1tbwogICAgICAgICMKICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi9hbW1vIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgQ29va2llOiBQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCiAgICAgICAgIwogICAgICAgICMgICAgICAgTk9URTogVGhlcmUgYXJlIHR3byBuYW1lL3ZhbHVlIHBhaXJzIG5hbWVkICJQQVJUX05VTUJFUiIgZHVlIHRvCiAgICAgICAgIyAgICAgICB0aGUgaW5oZXJpdGFuY2Ugb2YgdGhlICIvIiBtYXBwaW5nIGluIGFkZGl0aW9uIHRvIHRoZSAiL2FtbW8iIG1hcHBpbmcuCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGhlYWRlcnMgPSBbXQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQoKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIikKCiAgICAgICAgaGVhZGVycy5hcHBlbmQoCiAgICAgICAgICAgICJTZXQtQ29va2llOiBQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7IHBhdGg9L2FtbW8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2FtbW8iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHIiUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzO1xzKiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0X2hlYWRlcigiQ29va2llIikpKQoKICAgIGRlZiB0ZXN0X2lldGZfZXhhbXBsZV8xKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgVGhlbiB3ZSB0ZXN0IHdpdGggdGhlIGV4YW1wbGVzIGZyb20gZHJhZnQtaWV0Zi1odHRwLXN0YXRlLW1hbi1tZWMtMDMudHh0CiAgICAgICAgIwogICAgICAgICMgNS4gIEVYQU1QTEVTCgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQoKICAgICAgICAjCiAgICAgICAgIyA1LjEgIEV4YW1wbGUgMQogICAgICAgICMKICAgICAgICAjIE1vc3QgZGV0YWlsIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMgaGFzIGJlZW4gb21pdHRlZC4gIEFzc3VtZQogICAgICAgICMgdGhlIHVzZXIgYWdlbnQgaGFzIG5vIHN0b3JlZCBjb29raWVzLgogICAgICAgICMKICAgICAgICAjICAgMS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCiAgICAgICAgIwogICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9sb2dpbiBIVFRQLzEuMQogICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KICAgICAgICAjCiAgICAgICAgIyAgICAgICBVc2VyIGlkZW50aWZpZXMgc2VsZiB2aWEgYSBmb3JtLgogICAgICAgICMKICAgICAgICAjICAgMi4gIFNlcnZlciAtPiBVc2VyIEFnZW50CiAgICAgICAgIwogICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCiAgICAgICAgIyAgICAgICBTZXQtQ29va2llMjogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCiAgICAgICAgIwogICAgICAgICMgICAgICAgQ29va2llIHJlZmxlY3RzIHVzZXIncyBpZGVudGl0eS4KCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9sb2dpbicsCiAgICAgICAgICAgICdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQoKICAgICAgICAjCiAgICAgICAgIyAgIDMuICBVc2VyIEFnZW50IC0+IFNlcnZlcgogICAgICAgICMKICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvcGlja2l0ZW0gSFRUUC8xLjEKICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOyBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSIKICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCiAgICAgICAgIwogICAgICAgICMgICAgICAgVXNlciBzZWxlY3RzIGFuIGl0ZW0gZm9yIGBgc2hvcHBpbmcgYmFza2V0LicnCiAgICAgICAgIwogICAgICAgICMgICA0LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKICAgICAgICAjCiAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsKICAgICAgICAjICAgICAgICAgICAgICAgUGF0aD0iL2FjbWUiCiAgICAgICAgIwogICAgICAgICMgICAgICAgU2hvcHBpbmcgYmFza2V0IGNvbnRhaW5zIGFuIGl0ZW0uCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKTsKICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKAogICAgICAgICAgICByJ15cJFZlcnNpb249Ij8xIj87IEN1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/OyBcJFBhdGg9Ii9hY21lIiQnLAogICAgICAgICAgICBjb29raWUpKQoKICAgICAgICAjCiAgICAgICAgIyAgIDUuICBVc2VyIEFnZW50IC0+IFNlcnZlcgogICAgICAgICMKICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvc2hpcHBpbmcgSFRUUC8xLjEKICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOwogICAgICAgICMgICAgICAgICAgICAgICBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSI7CiAgICAgICAgIyAgICAgICAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCiAgICAgICAgIwogICAgICAgICMgICAgICAgVXNlciBzZWxlY3RzIHNoaXBwaW5nIG1ldGhvZCBmcm9tIGZvcm0uCiAgICAgICAgIwogICAgICAgICMgICA2LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKICAgICAgICAjCiAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCiAgICAgICAgIwogICAgICAgICMgICAgICAgTmV3IGNvb2tpZSByZWZsZWN0cyBzaGlwcGluZyBtZXRob2QuCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9zaGlwcGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2hpcHBpbmc9IkZlZEV4IjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCgogICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2gocideXCRWZXJzaW9uPSI/MSI/OycsIGNvb2tpZSkpCiAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ1BhcnRfTnVtYmVyPSI/Um9ja2V0X0xhdW5jaGVyXzAwMDEiPzsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSkKICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87XHMqXCRQYXRoPSJcL2FjbWUiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSkpCgogICAgICAgICMKICAgICAgICAjICAgNy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCiAgICAgICAgIwogICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9wcm9jZXNzIEhUVFAvMS4xCiAgICAgICAgIyAgICAgICBDb29raWU6ICRWZXJzaW9uPSIxIjsKICAgICAgICAjICAgICAgICAgICAgICAgQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyAkUGF0aD0iL2FjbWUiOwogICAgICAgICMgICAgICAgICAgICAgICBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiOwogICAgICAgICMgICAgICAgICAgICAgICBTaGlwcGluZz0iRmVkRXgiOyAkUGF0aD0iL2FjbWUiCiAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQogICAgICAgICMKICAgICAgICAjICAgICAgIFVzZXIgY2hvb3NlcyB0byBwcm9jZXNzIG9yZGVyLgogICAgICAgICMKICAgICAgICAjICAgOC4gIFNlcnZlciAtPiBVc2VyIEFnZW50CiAgICAgICAgIwogICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCiAgICAgICAgIwogICAgICAgICMgICAgICAgVHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wcm9jZXNzIikKICAgICAgICBzZWxmLmFzc2VydF8oCiAgICAgICAgICAgIHJlLnNlYXJjaChyJ1NoaXBwaW5nPSI/RmVkRXgiPztccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpIGFuZAogICAgICAgICAgICAiV0lMRV9FX0NPWU9URSIgaW4gY29va2llKQoKICAgICAgICAjCiAgICAgICAgIyBUaGUgdXNlciBhZ2VudCBtYWtlcyBhIHNlcmllcyBvZiByZXF1ZXN0cyBvbiB0aGUgb3JpZ2luIHNlcnZlciwgYWZ0ZXIKICAgICAgICAjIGVhY2ggb2Ygd2hpY2ggaXQgcmVjZWl2ZXMgYSBuZXcgY29va2llLiAgQWxsIHRoZSBjb29raWVzIGhhdmUgdGhlIHNhbWUKICAgICAgICAjIFBhdGggYXR0cmlidXRlIGFuZCAoZGVmYXVsdCkgZG9tYWluLiAgQmVjYXVzZSB0aGUgcmVxdWVzdCBVUkxzIGFsbCBoYXZlCiAgICAgICAgIyAvYWNtZSBhcyBhIHByZWZpeCwgYW5kIHRoYXQgbWF0Y2hlcyB0aGUgUGF0aCBhdHRyaWJ1dGUsIGVhY2ggcmVxdWVzdAogICAgICAgICMgY29udGFpbnMgYWxsIHRoZSBjb29raWVzIHJlY2VpdmVkIHNvIGZhci4KCiAgICBkZWYgdGVzdF9pZXRmX2V4YW1wbGVfMihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgICMgNS4yICBFeGFtcGxlIDIKICAgICAgICAjCiAgICAgICAgIyBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIGVmZmVjdCBvZiB0aGUgUGF0aCBhdHRyaWJ1dGUuICBBbGwgZGV0YWlsCiAgICAgICAgIyBvZiByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzIGhhcyBiZWVuIG9taXR0ZWQuICBBc3N1bWUgdGhlIHVzZXIgYWdlbnQKICAgICAgICAjIGhhcyBubyBzdG9yZWQgY29va2llcy4KCiAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCgogICAgICAgICMgSW1hZ2luZSB0aGUgdXNlciBhZ2VudCBoYXMgcmVjZWl2ZWQsIGluIHJlc3BvbnNlIHRvIGVhcmxpZXIgcmVxdWVzdHMsCiAgICAgICAgIyB0aGUgcmVzcG9uc2UgaGVhZGVycwogICAgICAgICMKICAgICAgICAjIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsKICAgICAgICAjICAgICAgICAgUGF0aD0iL2FjbWUiCiAgICAgICAgIwogICAgICAgICMgYW5kCiAgICAgICAgIwogICAgICAgICMgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSaWRpbmdfUm9ja2V0XzAwMjMiOyBWZXJzaW9uPSIxIjsKICAgICAgICAjICAgICAgICAgUGF0aD0iL2FjbWUvYW1tbyIKCiAgICAgICAgaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vL3NwZWNpZmljIiwKICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInLAogICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZS9hbW1vIicpCgogICAgICAgICMgQSBzdWJzZXF1ZW50IHJlcXVlc3QgYnkgdGhlIHVzZXIgYWdlbnQgdG8gdGhlIChzYW1lKSBzZXJ2ZXIgZm9yIFVSTHMgb2YKICAgICAgICAjIHRoZSBmb3JtIC9hY21lL2FtbW8vLi4uICB3b3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBoZWFkZXI6CiAgICAgICAgIwogICAgICAgICMgQ29va2llOiAkVmVyc2lvbj0iMSI7CiAgICAgICAgIyAgICAgICAgIFBhcnRfTnVtYmVyPSJSaWRpbmdfUm9ja2V0XzAwMjMiOyAkUGF0aD0iL2FjbWUvYW1tbyI7CiAgICAgICAgIyAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyBOb3RlIHRoYXQgdGhlIE5BTUU9VkFMVUUgcGFpciBmb3IgdGhlIGNvb2tpZSB3aXRoIHRoZSBtb3JlIHNwZWNpZmljIFBhdGgKICAgICAgICAjIGF0dHJpYnV0ZSwgL2FjbWUvYW1tbywgY29tZXMgYmVmb3JlIHRoZSBvbmUgd2l0aCB0aGUgbGVzcyBzcGVjaWZpYyBQYXRoCiAgICAgICAgIyBhdHRyaWJ1dGUsIC9hY21lLiAgRnVydGhlciBub3RlIHRoYXQgdGhlIHNhbWUgY29va2llIG5hbWUgYXBwZWFycyBtb3JlCiAgICAgICAgIyB0aGFuIG9uY2UuCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vLy4uLiIpCiAgICAgICAgc2VsZi5hc3NlcnRfKAogICAgICAgICAgICByZS5zZWFyY2gociJSaWRpbmdfUm9ja2V0XzAwMjMuKlJvY2tldF9MYXVuY2hlcl8wMDAxIiwgY29va2llKSkKCiAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgYSBVUkwgb2YKICAgICAgICAjIHRoZSBmb3JtIC9hY21lL3BhcnRzLyB3b3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBoZWFkZXI6CiAgICAgICAgIwogICAgICAgICMgQ29va2llOiAkVmVyc2lvbj0iMSI7IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyBIZXJlLCB0aGUgc2Vjb25kIGNvb2tpZSdzIFBhdGggYXR0cmlidXRlIC9hY21lL2FtbW8gaXMgbm90IGEgcHJlZml4IG9mCiAgICAgICAgIyB0aGUgcmVxdWVzdCBVUkwsIC9hY21lL3BhcnRzLywgc28gdGhlIGNvb2tpZSBkb2VzIG5vdCBnZXQgZm9yd2FyZGVkIHRvCiAgICAgICAgIyB0aGUgc2VydmVyLgoKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcGFydHMvIikKICAgICAgICBzZWxmLmFzc2VydF8oIlJvY2tldF9MYXVuY2hlcl8wMDAxIiBpbiBjb29raWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICJSaWRpbmdfUm9ja2V0XzAwMjMiIG5vdCBpbiBjb29raWUpCgogICAgZGVmIHRlc3RfcmVqZWN0aW9uKHNlbGYpOgogICAgICAgICMgVGVzdCByZWplY3Rpb24gb2YgU2V0LUNvb2tpZTIgcmVzcG9uc2VzIGJhc2VkIG9uIGRvbWFpbiwgcGF0aCwgcG9ydC4KICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgRGVmYXVsdENvb2tpZVBvbGljeSwgTFdQQ29va2llSmFyCgogICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQoKICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCgogICAgICAgIG1heF9hZ2UgPSAibWF4LWFnZT0zNjAwIgoKICAgICAgICAjIGlsbGVnYWwgZG9tYWluIChubyBlbWJlZGRlZCBkb3RzKQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjKQoKICAgICAgICAjIGxlZ2FsIGRvbWFpbgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bpbmc9cG9uZzsgZG9tYWluPSJhY21lLmNvbSI7IHZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQoKICAgICAgICAjIGlsbGVnYWwgZG9tYWluIChob3N0IHByZWZpeCAid3d3LmEiIGNvbnRhaW5zIGEgZG90KQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYS5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hpej1iYW5nOyBkb21haW49ImFjbWUuY29tIjsgdmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgICMgbGVnYWwgZG9tYWluCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hLmFjbWUuY29tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3b3c9Zmx1dHRlcjsgZG9tYWluPSIuYS5hY21lLmNvbSI7IHZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQoKICAgICAgICAjIGNhbid0IHBhcnRpYWxseSBtYXRjaCBhbiBJUC1hZGRyZXNzCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovLzEyNS4xMjUuMTI1LjEyNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnenp6ej1waW5nOyBkb21haW49IjEyNS4xMjUuMTI1IjsgdmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCgogICAgICAgICMgaWxsZWdhbCBwYXRoIChtdXN0IGJlIHByZWZpeCBvZiByZXF1ZXN0IHBhdGgpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JsYWg9cmh1YmFyYjsgZG9tYWluPSIuc29sLm5vIjsgcGF0aD0iL2ZvbyI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uPTEnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKCiAgICAgICAgIyBsZWdhbCBwYXRoCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vZm9vL2JhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmluZz1ib25nOyBkb21haW49Ii5zb2wubm8iOyBwYXRoPSIvZm9vIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQoKICAgICAgICAjIGlsbGVnYWwgcG9ydCAocmVxdWVzdC1wb3J0IG5vdCBpbiBsaXN0KQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGl6PWZmZnQ7IGRvbWFpbj0iLnNvbC5ubyI7IHBvcnQ9IjkwLDEwMCI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uPTEnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKCiAgICAgICAgIyBsZWdhbCBwb3J0CiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuc29sLm5vIiwKICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCiAgICAgICAgICAgIHIncG9ydD0iOTAsMTAwLCA4MCw4MDgwIjsgJwogICAgICAgICAgICByJ21heC1hZ2U9MTAwOyBDb21tZW50ID0gIkp1c3Qga2lkZGluZyEgKFwifFxcXFwpICInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNCkKCiAgICAgICAgIyBwb3J0IGF0dHJpYnV0ZSB3aXRob3V0IGFueSB2YWx1ZSAoY3VycmVudCBwb3J0KQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb285PWJhcjsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyBwb3J0OyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0xMDA7JykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDUpCgogICAgICAgICMgZW5jb2RlZCBwYXRoCiAgICAgICAgIyBMV1AgaGFzIHRoaXMgdGVzdCwgYnV0IHVuZXNjYXBpbmcgYWxsb3dlZCBwYXRoIGNoYXJhY3RlcnMgc2VlbXMKICAgICAgICAjIGxpa2UgYSBiYWQgaWRlYSwgc28gSSB0aGluayB0aGlzIHNob3VsZCBmYWlsOgojIyAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vL2Zvby8iLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHInZm9vOD1iYXI7IHZlcnNpb249MTsgcGF0aD0iLyU2Nm9vIicpCiAgICAgICAgIyBidXQgdGhpcyBpcyBPSywgYmVjYXVzZSAnPCcgaXMgbm90IGFuIGFsbG93ZWQgSFRUUCBVUkwgcGF0aAogICAgICAgICMgY2hhcmFjdGVyOgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vLzxvby8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTNjb28iJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDYpCgogICAgICAgICMgc2F2ZSBhbmQgcmVzdG9yZQogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGMuc2F2ZShmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKICAgICAgICAgICAgb2xkID0gcmVwcihjKQoKICAgICAgICAgICAgYyA9IExXUENvb2tpZUphcihwb2xpY3k9cG9sKQogICAgICAgICAgICBjLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgdHJ5OiBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9sZCwgcmVwcihjKSkKCiAgICBkZWYgdGVzdF91cmxfZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIyBUcnkgc29tZSBVUkwgZW5jb2RpbmdzIG9mIHRoZSBQQVRIcy4KICAgICAgICAjICh0aGUgYmVoYXZpb3VyIGhlcmUgaGFzIGNoYW5nZWQgZnJvbSBsaWJ3d3ctcGVybCkKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1LyUzYyUzYyUwQW5ldyVFNS8lRTUiLAogICAgICAgICAgICAgICAgICAgICAgImZvbyAgPSAgIGJhcjsgdmVyc2lvbiAgICA9ICAgMSIpCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCiAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyUyZiUyNS88PCUwYW5ld+Uv5vjlIiwKICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CiAgICAgICAgdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocideXCR2ZXJzaW9uPVwiPzFcIj8nLCByZS5JKQogICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vPWJhciIgaW4gY29va2llIGFuZCB2ZXJzaW9uX3JlLnNlYXJjaChjb29raWUpKQoKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAogICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vJTI1Lzw8JTBhbmV35S/m+OUiKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQoKICAgICAgICAjIHVuaWNvZGUgVVJMIGRvZXNuJ3QgcmFpc2UgZXhjZXB0aW9uCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCB1Imh0dHA6Ly93d3cuYWNtZS5jb20vXHhmYyIpCgogICAgZGVmIHRlc3RfbW96aWxsYShzZWxmKToKICAgICAgICAjIFNhdmUgLyBsb2FkIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGZpbGUgZm9ybWF0LgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQoKICAgICAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KCiAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5PURlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IG1heC1hZ2U9MTAwOyBWZXJzaW9uPTEiKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgcG9ydD0iODAiOyBtYXgtYWdlPTEwMDsgRGlzY2FyZDsgVmVyc2lvbj0xJykKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICJmb28zPWJhcjsgc2VjdXJlOyBWZXJzaW9uPTEiKQoKICAgICAgICBleHBpcmVzID0gImV4cGlyZXM9MDktTm92LSVkIDIzOjEyOjQwIEdNVCIgJSAoeWVhcl9wbHVzX29uZSwpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmb29hPWJhcjsgJXMiICUgZXhwaXJlcykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2I9YmFyOyBEb21haW49LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmb29jPWJhcjsgRG9tYWluPXd3dy5mb28uY29tOyAlcyIgJSBleHBpcmVzKQoKICAgICAgICBkZWYgc2F2ZV9hbmRfcmVzdG9yZShjaiwgaWdub3JlX2Rpc2NhcmQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjai5zYXZlKGlnbm9yZV9kaXNjYXJkPWlnbm9yZV9kaXNjYXJkKQogICAgICAgICAgICAgICAgbmV3X2MgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKICAgICAgICAgICAgICAgIG5ld19jLmxvYWQoaWdub3JlX2Rpc2NhcmQ9aWdub3JlX2Rpc2NhcmQpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCiAgICAgICAgICAgIHJldHVybiBuZXdfYwoKICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgVHJ1ZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmV3X2MpLCA2KSAgIyBub25lIGRpc2NhcmRlZAogICAgICAgIHNlbGYuYXNzZXJ0XygibmFtZT0nZm9vMScsIHZhbHVlPSdiYXInIiBpbiByZXByKG5ld19jKSkKCiAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIEZhbHNlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuZXdfYyksIDQpICAjIDIgb2YgdGhlbSBkaXNjYXJkZWQgb24gc2F2ZQogICAgICAgIHNlbGYuYXNzZXJ0XygibmFtZT0nZm9vMScsIHZhbHVlPSdiYXInIiBpbiByZXByKG5ld19jKSkKCiAgICBkZWYgdGVzdF9uZXRzY2FwZV9taXNjKHNlbGYpOgogICAgICAgICMgU29tZSBhZGRpdGlvbmFsIE5ldHNjYXBlIGNvb2tpZXMgdGVzdHMuCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBoZWFkZXJzID0gW10KICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQoKICAgICAgICAjIE5ldHNjYXBlIGFsbG93cyBhIGhvc3QgcGFydCB0aGF0IGNvbnRhaW5zIGRvdHMKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogQ3VzdG9tZXI9V0lMRV9FX0NPWU9URTsgZG9tYWluPS5hY21lLmNvbSIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgICMgYW5kIHRoYXQgdGhlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdCB3aXRob3V0IGFkZGluZyBhIGxlYWRpbmcKICAgICAgICAjIGRvdCB0byB0aGUgZG9tYWluLiAgU2hvdWxkIG5vdCBxdW90ZSBldmVuIGlmIHN0cmFuZ2UgY2hhcnMgYXJlIHVzZWQKICAgICAgICAjIGluIHRoZSBjb29raWUgdmFsdWUuCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPTMsNDsgZG9tYWluPWZvby5iYXIuYWNtZS5jb20iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQogICAgICAgIHNlbGYuYXNzZXJ0XygKICAgICAgICAgICAgIlBBUlRfTlVNQkVSPTMsNCIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpIGFuZAogICAgICAgICAgICAiQ3VzdG9tZXI9V0lMRV9FX0NPWU9URSIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKQoKICAgIGRlZiB0ZXN0X2ludHJhbmV0X2RvbWFpbnNfMjk2NShzZWxmKToKICAgICAgICAjIFRlc3QgaGFuZGxpbmcgb2YgbG9jYWwgaW50cmFuZXQgaG9zdG5hbWVzIHdpdGhvdXQgYSBkb3QuCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLAogICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBQT1JUOyBEaXNjYXJkOyBWZXJzaW9uPTE7IikKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBkb21haW49Ii5sb2NhbCI7IFZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28xPWJhciIgaW4gY29va2llKQoKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLCAnZm9vMz1iYXI7IFZlcnNpb249MScpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIikKICAgICAgICBzZWxmLmFzc2VydF8oImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQoKICAgIGRlZiB0ZXN0X2ludHJhbmV0X2RvbWFpbnNfbnMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IEZhbHNlKSkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwgImZvbzE9YmFyIikKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0ubG9jYWwnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKICAgICAgICBzZWxmLmFzc2VydF8oImZvbzE9YmFyIiBpbiBjb29raWUpCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iKQogICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vMj1iYXIiIGluIGNvb2tpZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCgogICAgZGVmIHRlc3RfZW1wdHlfcGF0aChzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CgogICAgICAgICMgVGVzdCBmb3IgZW1wdHkgcGF0aAogICAgICAgICMgQnJva2VuIHdlYi1zZXJ2ZXIgT1JJT04vMS4zLjM4IHJldHVybnMgdG8gdGhlIGNsaWVudCByZXNwb25zZSBsaWtlCiAgICAgICAgIwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMzsgUGF0aD0KICAgICAgICAjCiAgICAgICAgIyBpZS4gd2l0aCBQYXRoIHNldCB0byBub3RoaW5nLgogICAgICAgICMgSW4gdGhpcyBjYXNlLCBleHRyYWN0X2Nvb2tpZXMoKSBtdXN0IHNldCBjb29raWUgdG8gLyAocm9vdCkKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IFRydWUpKQogICAgICAgIGhlYWRlcnMgPSBbXQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IEpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjM7IFBhdGg9IikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYW50cy5jb20vIikKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQoKICAgICAgICAjIG1pc3NpbmcgcGF0aCBpbiB0aGUgcmVxdWVzdCBVUkkKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tOjgwODAiKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQoKICAgIGRlZiB0ZXN0X3Nlc3Npb25fY29va2llcyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CgogICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQoKICAgICAgICAjIENoZWNrIHNlc3Npb24gY29va2llcyBhcmUgZGVsZXRlZCBwcm9wZXJseSBieQogICAgICAgICMgQ29va2llSmFyLmNsZWFyX3Nlc3Npb25fY29va2llcyBtZXRob2QKCiAgICAgICAgcmVxID0gUmVxdWVzdCgnaHR0cDovL3d3dy5wZXJsbWVpc3Rlci5jb20vc2NyaXB0cycpCiAgICAgICAgaGVhZGVycyA9IFtdCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHMxPXNlc3Npb247UGF0aD0vc2NyaXB0cyIpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHAxPXBlcm07IERvbWFpbj0ucGVybG1laXN0ZXIuY29tOyIKICAgICAgICAgICAgICAgICAgICAgICAiUGF0aD0vO2V4cGlyZXM9RnJpLCAwMi1GZWItJWQgMjM6MjQ6MjAgR01UIiAlCiAgICAgICAgICAgICAgICAgICAgICAgeWVhcl9wbHVzX29uZSkKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogcDI9cGVybTtQYXRoPS87ZXhwaXJlcz1GcmksICIKICAgICAgICAgICAgICAgICAgICAgICAiMDItRmViLSVkIDIzOjI0OjIwIEdNVCIgJSB5ZWFyX3BsdXNfb25lKQogICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBzMj1zZXNzaW9uO1BhdGg9L3NjcmlwdHM7IgogICAgICAgICAgICAgICAgICAgICAgICJEb21haW49LnBlcmxtZWlzdGVyLmNvbSIpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUyOiBzMz1zZXNzaW9uO1ZlcnNpb249MTtEaXNjYXJkO1BhdGg9Ii8iJykKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgJ2h0dHA6Ly93d3cucGVybG1laXN0ZXIuY29tL3NjcmlwdHMnKQoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICAjIEhvdyBtYW55IHNlc3Npb24vcGVybWFuZW50IGNvb2tpZXMgZG8gd2UgaGF2ZT8KICAgICAgICBjb3VudGVyID0geyJzZXNzaW9uX2FmdGVyIjogMCwKICAgICAgICAgICAgICAgICAgICJwZXJtX2FmdGVyIjogMCwKICAgICAgICAgICAgICAgICAgICJzZXNzaW9uX2JlZm9yZSI6IDAsCiAgICAgICAgICAgICAgICAgICAicGVybV9iZWZvcmUiOiAwfQogICAgICAgIGZvciBjb29raWUgaW4gYzoKICAgICAgICAgICAga2V5ID0gIiVzX2JlZm9yZSIgJSBjb29raWUudmFsdWUKICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQogICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKICAgICAgICAjIEhvdyBtYW55IG5vdz8KICAgICAgICBmb3IgY29va2llIGluIGM6CiAgICAgICAgICAgIGtleSA9ICIlc19hZnRlciIgJSBjb29raWUudmFsdWUKICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQoKICAgICAgICBzZWxmLmFzc2VydF8obm90ICgKICAgICAgICAgICAgIyBhIHBlcm1hbmVudCBjb29raWUgZ290IGxvc3QgYWNjaWRlbnRseQogICAgICAgICAgICBjb3VudGVyWyJwZXJtX2FmdGVyIl0gIT0gY291bnRlclsicGVybV9iZWZvcmUiXSBvcgogICAgICAgICAgICAjIGEgc2Vzc2lvbiBjb29raWUgaGFzbid0IGJlZW4gY2xlYXJlZAogICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2FmdGVyIl0gIT0gMCBvcgogICAgICAgICAgICAjIHdlIGRpZG4ndCBoYXZlIHNlc3Npb24gY29va2llcyBpbiB0aGUgZmlyc3QgcGxhY2UKICAgICAgICAgICAgY291bnRlclsic2Vzc2lvbl9iZWZvcmUiXSA9PSAwKSkKCgpkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc2V0cwogICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICBEYXRlVGltZVRlc3RzLAogICAgICAgIEhlYWRlclRlc3RzLAogICAgICAgIENvb2tpZVRlc3RzLAogICAgICAgIEZpbGVDb29raWVKYXJUZXN0cywKICAgICAgICBMV1BDb29raWVUZXN0cywKICAgICAgICApCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkK