IiBUZXN0IGZvciA6bWtzZXNzaW9uLCA6bWt2aWV3IGFuZCA6bG9hZHZpZXcgaW4gbGF0aW4xIGVuY29kaW5nCgpzZXQgZW5jb2Rpbmc9bGF0aW4xCnNjcmlwdGVuY29kaW5nIGxhdGluMQoKc291cmNlIGNoZWNrLnZpbQpDaGVja0ZlYXR1cmUgbWtzZXNzaW9uCgpzb3VyY2Ugc2hhcmVkLnZpbQpzb3VyY2UgdGVybV91dGlsLnZpbQoKIiBUZXN0IGZvciBzdG9yaW5nIGdsb2JhbCBhbmQgbG9jYWwgYXJndW1lbnQgbGlzdCBpbiBhIHNlc3Npb24gZmlsZQoiIFRoaXMgb25lIG11c3QgYmUgZG9uZSBmaXJzdC4KZnVuYyBUZXN0X19ta3Nlc3Npb25fYXJnbG9jYWwoKQogIGVuZXcgfCBvbmx5CiAgbiBhIGIgYwogIG5ldwogIGFyZ2xvY2FsCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CgogICVid2lwZSEKICAlYXJnZGVsZXRlCiAgYXJnZ2xvYmFsCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgyLCB3aW5ucignJCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsIGFyZ2xpc3RpZCgxKSkKICBjYWxsIGFzc2VydF9lcXVhbCgwLCBhcmdsaXN0aWQoMikpCgogICVid2lwZSEKICAlYXJnZGVsZXRlCiAgYXJnZ2xvYmFsCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uKCkKICB0YWJuZXcKICBsZXQgd3JhcF9zYXZlID0gJndyYXAKICBzZXQgc2Vzc2lvbm9wdGlvbnM9YnVmZmVycyBzcGxpdGJlbG93IGZpbGVlbmNvZGluZz1sYXRpbjEKICBjYWxsIHNldGxpbmUoMSwgWwogICAgXCAgICdzdGFydDonLAogICAgXCAgICdubyBtdWx0aWJ5dGUgY2hBcmFjdGVyJywKICAgIFwgICAnCW9uZSBsZWFEaW5nIHRhYicsCiAgICBcICAgJyAgICBmb3VyIGxlYWRpbkcgc3BhY2VzJywKICAgIFwgICAndHdvCQljb25zZWN1dGl2ZSB0YWJzJywKICAgIFwgICAndHdvCXRhYnMJaW4gb25lIGxpbmUnLAogICAgXCAgICdvbmUg5CBtdWx0aWJ5dGVDaGFyYWN0ZXInLAogICAgXCAgICdh5CDEICB0d28gbXVsdGlCeXRlIGNoYXJhY3RlcnMnLAogICAgXCAgICdB5Pb8ICB0aHJlZSBtdWxUaWJ5dGUgY2hhcmFjdGVycycsCiAgICBcICAgJ3Nob3J0IGxpbmUnLAogICAgXCBdKQogIGxldCB0bXBmaWxlID0gJ1h0ZW1wJwogIGV4ZWMgJ3chICcgLiB0bXBmaWxlCiAgL15zdGFydDoKICBzZXQgd3JhcAogIHZzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGo4fAogIHNwbGl0CiAgbm9ybSEgajh8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqJAogIHdpbmNtZCBsCgogIHNldCBub3dyYXAKICAvXnN0YXJ0OgogIG5vcm0hIGoxNnwzemwKICBzcGxpdAogIG5vcm0hIGowMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgbm9ybSEgajA4fDN6bAogIHNwbGl0CiAgbm9ybSEgajA4fDN6bAogIHNwbGl0CiAgbm9ybSEgajAxNnwzemwKICBzcGxpdAogIG5vcm0hIGowMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgY2FsbCB3aW5jb2woKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaSA9IGZpbHRlcihyZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpLCAndjp2YWwgPX4jICJcXCheICpub3JtYWwhIFswJF1cXHxeICpleGUgJydub3JtYWwhXFwpIicpCiAgbGV0IGV4cGVjdGVkID0gWwogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDA4fCcsCiAgICBcICAgJ25vcm1hbCEgMDh8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAkJywKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gOCAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwOHwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiA4IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDA4fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiCiAgICBcIF0KICBjYWxsIGFzc2VydF9lcXVhbChleHBlY3RlZCwgbGkpCiAgdGFiY2xvc2UhCgogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBjYWxsIGRlbGV0ZSh0bXBmaWxlKQogIGxldCAmd3JhcCA9IHdyYXBfc2F2ZQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZGVmIFRlc3RfbWtzZXNzaW9uX3NraXBydHAoKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHZhciBmb3VuZF9ydHAgPSAwCiAgdmFyIGZvdW5kX3BwID0gMAogIGZvciBsaW5lIGluIHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICAgIGlmIGxpbmUgPX4gJ3NldCBydW50aW1lcGF0aCcKICAgICAgZm91bmRfcnRwICs9IDEKICAgIGVuZGlmCiAgICBpZiBsaW5lID1+ICdzZXQgcGFja3BhdGgnCiAgICAgIGZvdW5kX3BwICs9IDEKICAgIGVuZGlmCiAgZW5kZm9yCiAgYXNzZXJ0X2VxdWFsKDEsIGZvdW5kX3J0cCkKICBhc3NlcnRfZXF1YWwoMSwgZm91bmRfcHApCiAgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKCiAgc2V0IHNlc3Npb25vcHRpb25zKz1za2lwcnRwCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgdmFyIGZvdW5kID0gMAogIGZvciBsaW5lIGluIHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICAgIGlmIGxpbmUgPX4gJ3NldCBcKHJ1bnRpbWVwYXRoXHxwYWNrcGF0aFwpJwogICAgICBmb3VuZCA9IDEKICAgICAgYnJlYWsKICAgIGVuZGlmCiAgZW5kZm9yCiAgYXNzZXJ0X2VxdWFsKDAsIGZvdW5kKQogIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRkZWYKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fd2luaGVpZ2h0KCkKICBuZXcKICBzZXQgd2luaGVpZ2h0PTEwCiAgc2V0IHdpbm1pbmhlaWdodD0yCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2xhcmdlX3dpbmhlaWdodCgpCiAgc2V0IHdpbmhlaWdodD05OTkKICBta3Nlc3Npb24hIFh0ZXN0X21rc193aW5oZWlnaHQub3V0CiAgc2V0IHdpbmhlaWdodCYKICBzb3VyY2UgWHRlc3RfbWtzX3dpbmhlaWdodC5vdXQKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzX3dpbmhlaWdodC5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3plcm9fd2luaGVpZ2h0KCkKICBzZXQgd2lubWluaGVpZ2h0PTAKICBlZGl0IFNvbWVGaWxlCiAgc3BsaXQKICB3aW5jbWQgXwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzX3plcm8KICBzZXQgd2lubWluaGVpZ2h0JgogIGxldCB0ZXh0ID0gcmVhZGZpbGUoJ1h0ZXN0X21rc196ZXJvJyktPmpvaW4oKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3NfemVybycpCiAgY2xvc2UKICAiIGNoZWNrIHRoZXJlIGlzIG5vIGRpdmlkZSBieSB6ZXJvCiAgY2FsbCBhc3NlcnRfbm90bWF0Y2goJy8gMFteMC05XScsIHRleHQpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fcnRwKCkKICAiIFRPRE86IGZpeCBwcm9ibGVtIHdpdGggYmFja3NsYXNoZXMgb24gV2luMzIKICBDaGVja05vdE1TV2luZG93cwoKICBuZXcKICBsZXQgX3J0cD0mcnRwCiAgIiBNYWtlIGEgcmVhbCBsb25nIChpbnZhbGlkKSBydW50aW1lcGF0aCB2YWx1ZSwKICAiIHRoYXQgc2hvdWxkIGV4Y2VlZCBQQVRIX01BWCAoaG9wZWZ1bGx5KQogIGxldCBuZXdydHA9JnJ0cC4nLH4nLnJlcGVhdCgnL2Zvb2JhcicsIDEwMDApCiAgbGV0IG5ld3J0cC49IiwiLmV4cGFuZCgiJEhPTUUiKS4iLy52aW0iCiAgbGV0ICZydHA9bmV3cnRwCgogICIgZGV0ZXJtaW5lIGV4cGVjdGVkIHZhbHVlCiAgbGV0IGV4cGVjdGVkPXNwbGl0KCZydHAsICcsJykKICBsZXQgZXhwZWN0ZWQgPSBtYXAoZXhwZWN0ZWQsICcic2V0IHJ1bnRpbWVwYXRoKz0iLnY6dmFsJykKICBsZXQgZXhwZWN0ZWQgPSBbJ3NldCBydW50aW1lcGF0aD0nXSArIGV4cGVjdGVkCiAgbGV0IGV4cGVjdGVkID0gbWFwKGV4cGVjdGVkLCB7dix3IC0+IHN1YnN0aXR1dGUodywgJEhPTUUsICJ+IiwgImciKX0pCgogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCAmcnRwPV9ydHAKICBsZXQgbGkgPSBmaWx0ZXIocmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKSwgJ3Y6dmFsID1+IyAicnVudGltZXBhdGgiJykKICBjYWxsIGFzc2VydF9lcXVhbChleHBlY3RlZCwgbGkpCgogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9hcmdsaXN0KCkKICAlYXJnZGVsCiAgbmV4dCBmaWxlMSBmaWxlMiBmaWxlMyBmaWxlNAogIG5ldwogIG5leHQgfCBuZXh0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbChbJ2ZpbGUxJywgJ2ZpbGUyJywgJ2ZpbGUzJywgJ2ZpbGU0J10sIGFyZ3YoKSkKICBjYWxsIGFzc2VydF9lcXVhbCgyLCBhcmdpZHgoKSkKICB3aW5jbWQgdwogIGNhbGwgYXNzZXJ0X2VxdWFsKDAsIGFyZ2lkeCgpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgZW5ldyB8IG9ubHkKICBhcmdkZWwgKgplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX29uZV9idWZmZXJfdHdvX3dpbmRvd3MoKQogIGVkaXQgWHRlc3QxCiAgbmV3IFh0ZXN0MgogIHNwbGl0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCBjb3VudDEgPSAwCiAgbGV0IGNvdW50MiA9IDAKICBsZXQgY291bnQyYnVmID0gMAogIGxldCBidWZleGlzdHMgPSAwCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ2VkaXQgXGYqWHRlc3QxJCcKICAgICAgbGV0IGNvdW50MSArPSAxCiAgICBlbmRpZgogICAgaWYgbGluZSA9fiAnZWRpdCBcZlx7LX1YdGVzdDInCiAgICAgIGxldCBjb3VudDIgKz0gMQogICAgZW5kaWYKICAgIGlmIGxpbmUgPX4gJ2J1ZmZlciBcZlx7LX1YdGVzdDInCiAgICAgIGxldCBjb3VudDJidWYgKz0gMQogICAgZW5kaWYKICAgIGlmIGxpbmUgPX4gJ2J1ZmV4aXN0cyhmbmFtZW1vZGlmeSguKiwgIjpwIiknCiAgICAgIGxldCBidWZleGlzdHMgKz0gMQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9lcXVhbCgxLCBjb3VudDEsICdYdGVzdDEgY291bnQnKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsIGNvdW50MiwgJ1h0ZXN0MiBjb3VudCcpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMiwgY291bnQyYnVmLCAnWHRlc3QyIGJ1ZmZlciBjb3VudCcpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMiwgYnVmZXhpc3RzKQoKICBjbG9zZQogIGJ3aXBlIQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9sY2RfbXVsdGlwbGVfdGFicygpCiAgdGFibmV3CiAgdGFibmV3CiAgbGNkIC4KICB0YWJmaXJzdAogIGxjZCAuCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgdGFib25seQogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfdHJ1ZShoYXNsb2NhbGRpcigpLCAnVGFiIDEgbG9jYWxkaXInKQogIHRhYm5leHQgMgogIGNhbGwgYXNzZXJ0X3RydWUoIWhhc2xvY2FsZGlyKCksICdUYWIgMiBsb2NhbGRpcicpCiAgdGFibmV4dCAzCiAgY2FsbCBhc3NlcnRfdHJ1ZShoYXNsb2NhbGRpcigpLCAnVGFiIDMgbG9jYWxkaXInKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKIiBUZXN0IGZvciB0YWJwYWdlLWxvY2FsIGRpcmVjdG9yeQpmdW5jIFRlc3RfbWtzZXNzaW9uX3RjZF9tdWx0aXBsZV90YWJzKCkKICBsZXQgc2F2ZV9jd2QgPSBnZXRjd2QoKQogIGNhbGwgbWtkaXIoJ1h0b3BkaXInKQogIGNkIFh0b3BkaXIKICBjYWxsIG1rZGlyKCdYdGFiZGlyMScpCiAgY2FsbCBta2RpcignWHRhYmRpcjInKQogIGNhbGwgbWtkaXIoJ1h0YWJkaXIzJykKICBjYWxsIG1rZGlyKCdYd2luZGlyMScpCiAgY2FsbCBta2RpcignWHdpbmRpcjInKQogIGNhbGwgbWtkaXIoJ1h3aW5kaXIzJykKICB0Y2QgWHRhYmRpcjEKICBib3RyaWdodCBuZXcKICB3aW5jbWQgdAogIGxjZCAuLi9Yd2luZGlyMQogIHRhYm5ldwogIHRjZCAuLi9YdGFiZGlyMgogIGJvdHJpZ2h0IG5ldwogIGxjZCAuLi9Yd2luZGlyMgogIHRhYm5ldwogIHRjZCAuLi9YdGFiZGlyMwogIGJvdHJpZ2h0IG5ldwogIGxjZCAuLi9Yd2luZGlyMwogIHRhYmZpcnN0CiAgMXdpbmNtZCB3CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgb25seSB8IHRhYm9ubHkKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdGFiZGlyMScsIGZuYW1lbW9kaWZ5KGdldGN3ZCgtMSwgMSksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYd2luZGlyMScsIGZuYW1lbW9kaWZ5KGdldGN3ZCgxLCAxKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIxJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDIsIDEpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjInLCBmbmFtZW1vZGlmeShnZXRjd2QoLTEsIDIpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjInLCBmbmFtZW1vZGlmeShnZXRjd2QoMSwgMiksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYd2luZGlyMicsIGZuYW1lbW9kaWZ5KGdldGN3ZCgyLCAyKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIzJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKC0xLCAzKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIzJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDEsIDMpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHdpbmRpcjMnLCBmbmFtZW1vZGlmeShnZXRjd2QoMiwgMyksICc6dCcpKQogICVid2lwZQogIGNhbGwgY2hkaXIoc2F2ZV9jd2QpCiAgY2FsbCBkZWxldGUoIlh0b3BkaXIiLCAicmYiKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2JsYW5rX3RhYnMoKQogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5leHQgMwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5leHQgMgogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoNCwgdGFicGFnZW5yKCckJyksICdzZXNzaW9uIHJlc3RvcmUgc2hvdWxkIHJlc3RvcmUgbnVtYmVyIG9mIHRhYnMnKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDMsIHRhYnBhZ2VucigpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIHRoZSBhY3RpdmUgdGFiJykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fYnVmZmVyX2NvdW50KCkKICBzZXQgaGlkZGVuCgogICIgRWRpdCBleGFjdGx5IHRocmVlIGZpbGVzIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCiAgJWJ3aXBlIQogIGUgWGZvbyB8IHRhYmUgWGJhciB8IHRhYmUgWGJhegogIHRhYmRvIHdyaXRlCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CgogICIgVmVyaWZ5IHRoYXQgbG9hZGluZyB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBjcmVhdGUgYWRkaXRpb25hbCBidWZmZXJzLgogICVid2lwZSEKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDMsIGxlbihnZXRidWZpbmZvKCkpKQoKICAiIENsZWFuIHVwLgogIGNhbGwgZGVsZXRlKCdYZm9vJykKICBjYWxsIGRlbGV0ZSgnWGJhcicpCiAgY2FsbCBkZWxldGUoJ1hiYXonKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICAlYndpcGUhCiAgc2V0IGhpZGRlbiYKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9idWZmZXJfb3JkZXIoKQogICVid2lwZSEKICBlIFhmb28gfCBlIFhiYXIgfCBlIFhiYXogfCBlIFhxdXgKICBidWZkbyB3cml0ZQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAoKICAiIFZlcmlmeSB0aGF0IGxvYWRpbmcgdGhlIHNlc3Npb24gcHJlc2VydmVzIG9yZGVyIG9mIGJ1ZmZlcnMKICAlYndpcGUhCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKCiAgbGV0IHM6YnVmX2luZm8gPSBnZXRidWZpbmZvKCkKICBjYWxsIGFzc2VydF90cnVlKHM6YnVmX2luZm9bMF1bJ25hbWUnXSA9fiMgJ1hmb28kJykKICBjYWxsIGFzc2VydF90cnVlKHM6YnVmX2luZm9bMV1bJ25hbWUnXSA9fiMgJ1hiYXIkJykKICBjYWxsIGFzc2VydF90cnVlKHM6YnVmX2luZm9bMl1bJ25hbWUnXSA9fiMgJ1hiYXokJykKICBjYWxsIGFzc2VydF90cnVlKHM6YnVmX2luZm9bM11bJ25hbWUnXSA9fiMgJ1hxdXgkJykKCiAgIiBDbGVhbiB1cC4KICBjYWxsIGRlbGV0ZSgnWGZvbycpCiAgY2FsbCBkZWxldGUoJ1hiYXInKQogIGNhbGwgZGVsZXRlKCdYYmF6JykKICBjYWxsIGRlbGV0ZSgnWHF1eCcpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogICVid2lwZSEKZW5kZnVuYwoKaWYgaGFzKCdleHRyYV9zZWFyY2gnKQoKZnVuYyBUZXN0X21rc2Vzc2lvbl9obHNlYXJjaCgpCiAgc2V0IGhsc2VhcmNoCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbm9obHNlYXJjaAogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgdjpobHNlYXJjaCwgJ3Nlc3Npb24gc2hvdWxkIHJlc3RvcmUgc2VhcmNoIGhpZ2hsaWdodGluZyBzdGF0ZScpCiAgbm9obHNlYXJjaAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoMCwgdjpobHNlYXJjaCwgJ3Nlc3Npb24gc2hvdWxkIHJlc3RvcmUgc2VhcmNoIGhpZ2hsaWdodGluZyBzdGF0ZScpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgplbmRpZgoKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fYmxhbmtfd2luZG93cygpCiAgc3BsaXQKICBzcGxpdAogIHNwbGl0CiAgMyB3aW5jbWQgdwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNwbGl0CiAgc3BsaXQKICAyIHdpbmNtZCB3CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCg0LCB3aW5ucignJCcpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIG51bWJlciBvZiB3aW5kb3dzJykKICBjYWxsIGFzc2VydF9lcXVhbCgzLCB3aW5ucigpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIHRoZSBhY3RpdmUgd2luZG93JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fdGVybWluYWxfc2hlbGwoKQogIENoZWNrRmVhdHVyZSB0ZXJtaW5hbAogIENoZWNrRmVhdHVyZSBxdWlja2ZpeAoKICB0ZXJtaW5hbAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGxldCB0ZXJtX2NtZCA9IGxpbmUKICAgIGVsc2VpZiBsaW5lID1+ICdiYWRkLionIC4gJnNoZWxsCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgndW5leHBlY3RlZCBzaGVsbCBsaW5lOiAnIC4gbGluZSkKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfbWF0Y2goJ3Rlcm1pbmFsICsrY3Vyd2luICsrY29scz1cZFwrICsrcm93cz1cZFwrXHMqLiokJywgdGVybV9jbWQpCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbChidWZucignJScpKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9ub19yZXN0b3JlX2NtZGFyZygpCiAgQ2hlY2tGZWF0dXJlIHRlcm1pbmFsCgogIHRlcm1pbmFsICsrbm9yZXN0b3JlCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCB0ZXJtX2NtZCA9ICcnCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ150ZXJtaW5hbCcKICAgICAgY2FsbCBhc3NlcnRfcmVwb3J0KCdzZXNzaW9uIG11c3Qgbm90IHJlc3RvcmUgdGVybWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Jlc3RvcmVfZnVuY2FyZygpCiAgQ2hlY2tGZWF0dXJlIHRlcm1pbmFsCgogIGxldCBidWYgPSBSdW5fc2hlbGxfaW5fdGVybWluYWwoeydub3Jlc3RvcmUnOiAxfSkKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IHRlcm1fY21kID0gJycKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXnRlcm1pbmFsJwogICAgICBjYWxsIGFzc2VydF9yZXBvcnQoJ3Nlc3Npb24gbXVzdCBub3QgcmVzdG9yZSB0ZXJtaW5hbCcpCiAgICBlbmRpZgogIGVuZGZvcgoKICBjYWxsIFN0b3BTaGVsbEluVGVybWluYWwoYnVmKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9ub19yZXN0b3JlX2Z1bmMoKQogIENoZWNrRmVhdHVyZSB0ZXJtaW5hbAoKICB0ZXJtaW5hbAogIGNhbGwgdGVybV9zZXRyZXN0b3JlKGJ1Zm5yKCclJyksICdOT05FJykKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IHRlcm1fY21kID0gJycKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXnRlcm1pbmFsJwogICAgICBjYWxsIGFzc2VydF9yZXBvcnQoJ3Nlc3Npb24gbXVzdCBub3QgcmVzdG9yZSB0ZXJtaW5hbCcpCiAgICBlbmRpZgogIGVuZGZvcgoKICBjYWxsIFN0b3BTaGVsbEluVGVybWluYWwoYnVmbnIoJyUnKSkKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fdGVybWluYWxfbm9fc3NvcCgpCiAgQ2hlY2tGZWF0dXJlIHRlcm1pbmFsCgogIHRlcm1pbmFsCiAgc2V0IHNlc3Npb25vcHRpb25zLT10ZXJtaW5hbAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlcm1pbmFsJykKICAgIGVuZGlmCiAgZW5kZm9yCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbChidWZucignJScpKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fdGVybWluYWxfcmVzdG9yZV9vdGhlcigpCiAgQ2hlY2tGZWF0dXJlIHRlcm1pbmFsCiAgQ2hlY2tGZWF0dXJlIHF1aWNrZml4CgogIHRlcm1pbmFsCiAgZXZhbCBidWZucignJScpLT50ZXJtX3NldHJlc3RvcmUoJ290aGVyJykKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IHRlcm1fY21kID0gJycKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXnRlcm1pbmFsJwogICAgICBsZXQgdGVybV9jbWQgPSBsaW5lCiAgICBlbmRpZgogIGVuZGZvcgogIGNhbGwgYXNzZXJ0X21hdGNoKCd0ZXJtaW5hbCArK2N1cndpbiArK2NvbHM9XGRcKyArK3Jvd3M9XGRcKy4qb3RoZXInLCB0ZXJtX2NtZCkKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX3NoYXJlZF93aW5kb3dzKCkKICBDaGVja0ZlYXR1cmUgdGVybWluYWwKCiAgdGVybWluYWwKICBsZXQgdGVybV9idWYgPSBidWZucigpCiAgbmV3CiAgZXhlY3V0ZSAiYnVmZmVyIiB0ZXJtX2J1ZgogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAoKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IGZvdW5kX2NyZWF0aW9uID0gMAogIGxldCBmb3VuZF91c2UgPSAwCgogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGxldCBmb3VuZF9jcmVhdGlvbiA9IDEKICAgICAgY2FsbCBhc3NlcnRfbWF0Y2goJ3Rlcm1pbmFsICsrY3Vyd2luICsrY29scz1cZFwrICsrcm93cz1cZFwrJywgbGluZSkKICAgIGVsc2VpZiBsaW5lID1+ICJeZXhlY3V0ZSAnYnVmZmVyICcgLiBzOnRlcm1fYnVmXyIgLiB0ZXJtX2J1ZiAuICIkIgogICAgICBsZXQgZm91bmRfdXNlID0gMQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBhc3NlcnRfdHJ1ZShmb3VuZF9jcmVhdGlvbiAmJiBmb3VuZF91c2UpCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbCh0ZXJtX2J1ZikKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3ZpZXdfdGVybWluYWxfd2luZG93cygpCiAgQ2hlY2tGZWF0dXJlIHRlcm1pbmFsCgogICIgY3JlYXRlIHR3byB3aW5kb3cgb24gdGhlIHNhbWUgdGVybWluYWwgdG8gY2hlY2sgdGhpcyBpcyBoYW5kbGVkIE9LCiAgdGVybWluYWwKICBsZXQgdGVybV9idWYgPSBidWZucigpCiAgZXhlICdzYnVmICcgLi4gdGVybV9idWYKICBta3ZpZXchIFh0ZXN0dmlldwoKICBjYWxsIFN0b3BTaGVsbEluVGVybWluYWwodGVybV9idWYpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0dmlldycpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3ZpZXdfb3Blbl9mb2xkcygpCiAgZW5ldyEKCiAgY2FsbCBhcHBlbmQoMCwgWydhJywgJ2InLCAnYyddKQogIDEsM2ZvbGQKICB3cml0ZSEgWHRlc3RmaWxlCgogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDEpKQogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDIpKQogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDMpKQoKICAiIFNhdmUgdGhlIHZpZXcgd2l0aCBmb2xkcyBjbG9zZWQKICBta3ZpZXchIFh0ZXN0dmlldwoKICAiIHpSIGFmZmVjdHMgJ2ZvbGRsZXZlbCcsIG1ha2Ugc3VyZSB0aGUgb3B0aW9uIGlzIGFwcGxpZWQgYWZ0ZXIgdGhlIGZvbGRzCiAgIiBoYXZlIGJlZW4gcmVjcmVhdGVkLgogICIgT3BlbiBmb2xkcyB0byBlbnN1cmUgdGhleSBnZXQgY2xvc2VkIHdoZW4gcmVzdG9yaW5nIHRoZSB2aWV3CiAgbm9ybWFsIHpSCgogIGNhbGwgYXNzZXJ0X2VxdWFsKC0xLCBmb2xkY2xvc2VkKDEpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKC0xLCBmb2xkY2xvc2VkKDIpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKC0xLCBmb2xkY2xvc2VkKDMpKQoKICBzb3VyY2UgWHRlc3R2aWV3CgogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDEpKQogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDIpKQogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBmb2xkY2xvc2VkKDMpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3R2aWV3JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RmaWxlJykKICAlYndpcGUKZW5kZnVuYwoKZnVuYyBUZXN0X21rdmlld19ub19iYWx0KCkKICBlZGl0IFh0ZXN0ZmlsZTEKICBlZGl0IFh0ZXN0ZmlsZTIKCiAgbWt2aWV3ISBYdGVzdHZpZXcKICBiZGVsZXRlIFh0ZXN0ZmlsZTEKCiAgc291cmNlIFh0ZXN0dmlldwogIGNhbGwgYXNzZXJ0X2VxdWFsKDAsIGJ1Zmxpc3RlZCgnWHRlc3RmaWxlMScpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3R2aWV3JykKICAlYndpcGUKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9ub19iYWx0KCkKICBlZGl0IFh0ZXN0ZmlsZTEKICBlZGl0IFh0ZXN0ZmlsZTIKCiAgYmRlbGV0ZSBYdGVzdGZpbGUxCiAgbWtzZXNzaW9uISBYdGVzdHZpZXcKCiAgc291cmNlIFh0ZXN0dmlldwogIGNhbGwgYXNzZXJ0X2VxdWFsKDAsIGJ1Zmxpc3RlZCgnWHRlc3RmaWxlMScpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3R2aWV3JykKICAlYndpcGUKZW5kZnVuYwoKIiBUZXN0IDpta3ZpZXcgd2l0aCBhIGZpbGUgYXJndW1lbnQuCmZ1bmMgVGVzdF9ta3ZpZXdfZmlsZSgpCiAgIiBDcmVhdGUgYSB2aWV3IHdpdGggbGluZSBudW1iZXIgYW5kIGEgZm9sZC4KICBoZWxwIDpta3ZpZXcKICBzZXQgbnVtYmVyCiAgbm9ybSEgVn16ZjAKICBsZXQgcG9zID0gZ2V0cG9zKCcuJykKICBsZXQgbGluZWZvbGRjbG9zZWQxID0gZm9sZGNsb3NlZCgnLicpCiAgbWt2aWV3ISBYdmlldwogIHNldCBub251bWJlcgogIG5vcm0hIHpyagogICIgV2UgY2FuIGNsb3NlIHRoZSBoZWxwIHdpbmRvdywgYXMgbWt2aWV3IHdpdGggYSBmaWxlIG5hbWUgc2hvdWxkCiAgIiBnZW5lcmF0ZSBhIGNvbW1hbmQgdG8gZWRpdCB0aGUgZmlsZS4KICBoZWxwY2xvc2UKCiAgc291cmNlIFh2aWV3CiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgJm51bWJlcikKICBjYWxsIGFzc2VydF9tYXRjaCgnXCo6bWt2aWV3XCokJywgZ2V0bGluZSgnLicpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKHBvcywgZ2V0cG9zKCcuJykpCiAgY2FsbCBhc3NlcnRfZXF1YWwobGluZWZvbGRjbG9zZWQxLCBmb2xkY2xvc2VkKCcuJykpCgogICIgQ3JlYXRpbmcgYSB2aWV3IGFnYWluIHdpdGggdGhlIHNhbWUgZmlsZSBuYW1lIHNob3VsZCBmYWlsIChmaWxlCiAgIiBhbHJlYWR5IGV4aXN0cykuIEJ1dCB3aXRoIGEgISwgdGhlIHByZXZpb3VzIHZpZXcgc2hvdWxkIGJlCiAgIiBvdmVyd3JpdHRlbiB3aXRob3V0IGVycm9yLgogIGhlbHAgOmxvYWR2aWV3CiAgY2FsbCBhc3NlcnRfZmFpbHMoJ21rdmlldyBYdmlldycsICdFMTg5OicpCiAgY2FsbCBhc3NlcnRfbWF0Y2goJ1wqOmxvYWR2aWV3XCokJywgZ2V0bGluZSgnLicpKQogIG1rdmlldyEgWHZpZXcKICBjYWxsIGFzc2VydF9tYXRjaCgnXCo6bG9hZHZpZXdcKiQnLCBnZXRsaW5lKCcuJykpCgogIGNhbGwgZGVsZXRlKCdYdmlldycpCiAgYndpcGUKZW5kZnVuYwoKIiBUZXN0IDpta3ZpZXcgYW5kIDpsb2FkdmlldyB3aXRoIGEgY3VzdG9tICd2aWV3ZGlyJy4KZnVuYyBUZXN0X21rdmlld19sb2Fkdmlld193aXRoX3ZpZXdkaXIoKQogIHNldCB2aWV3ZGlyPVh2aWV3ZGlyCgogIGhlbHAgOm1rdmlldwogIHNldCBudW1iZXIKICBub3JtISBWfXpmCiAgbGV0IHBvcyA9IGdldHBvcygnLicpCiAgbGV0IGxpbmVmb2xkY2xvc2VkMSA9IGZvbGRjbG9zZWQoJy4nKQogIG1rdmlldyAxCiAgc2V0IG5vbnVtYmVyCiAgbm9ybSEgenJqCgogIGxvYWR2aWV3IDEKCiAgIiBUaGUgZGlyZWN0b3J5IFh2aWV3ZGlyLyBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIHRoZSB2aWV3CiAgIiBzaG91bGQgYmUgc3RvcmVkIGluIHRoYXQgZGlyZWN0b3J5LgogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdmlld2Rpci8nIC4KICAgICAgICBcICAgICAgICAgICBzdWJzdGl0dXRlKAogICAgICAgIFwgICAgICAgICAgICAgc3Vic3RpdHV0ZSgKICAgICAgICBcICAgICAgICAgICAgICAgZXhwYW5kKCclOnAnKSwgJy8nLCAnPSsnLCAnZycpLCAnOicsICc9LScsICdnJykgLiAnPTEudmltJywKICAgICAgICBcICAgICAgICAgICBnbG9iKCdYdmlld2Rpci8qJykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgJm51bWJlcikKICBjYWxsIGFzc2VydF9tYXRjaCgnXCo6bWt2aWV3XCokJywgZ2V0bGluZSgnLicpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKHBvcywgZ2V0cG9zKCcuJykpCiAgY2FsbCBhc3NlcnRfZXF1YWwobGluZWZvbGRjbG9zZWQxLCBmb2xkY2xvc2VkKCcuJykpCgogIGNhbGwgZGVsZXRlKCdYdmlld2RpcicsICdyZicpCiAgc2V0IHZpZXdkaXImCiAgaGVscGNsb3NlCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3ZpZXdfbm9fZmlsZV9uYW1lKCkKICBuZXcKICAiIDpta3ZpZXcgb3IgOm1rdmlldyB7bnJ9IHNob3VsZCBmYWlsIGluIGEgdW5uYW1lZCBidWZmZXIuCiAgY2FsbCBhc3NlcnRfZmFpbHMoJ21rdmlldycsICdFMzI6JykKICBjYWxsIGFzc2VydF9mYWlscygnbWt2aWV3IDEnLCAnRTMyOicpCgogICIgOm1rdmlldyB7ZmlsZX0gc2hvdWxkIHN1Y2NlZWQgaW4gYSB1bm5hbWVkIGJ1ZmZlci4KICBta3ZpZXcgWHZpZXcKICBoZWxwCiAgc291cmNlIFh2aWV3CiAgY2FsbCBhc3NlcnRfZXF1YWwoJycsIGJ1Zm5hbWUoJyUnKSkKCiAgY2FsbCBkZWxldGUoJ1h2aWV3JykKICAlYndpcGUKZW5kZnVuYwoKZnVuYyBUZXN0X21rdmlld19sb2Fkdmlld19qdW1wbGlzdCgpCiAgc2V0IHZpZXdkaXI9WHZpZXdkaXIKICBhdSBCdWZXaW5MZWF2ZSAqIHNpbGVudCBta3ZpZXcKICBhdSBCdWZXaW5FbnRlciAqIHNpbGVudCBsb2FkdmlldwoKICBlZGl0IFhmaWxlMQogIGNhbGwgc2V0bGluZSgxLCBbJ2EnLCAnYmJiYmJiYicsICdjJ10pCiAgbm9ybWFsIGozbAogIGNhbGwgYXNzZXJ0X2VxdWFsKFsyLCA0XSwgZ2V0Y3VycG9zKClbMToyXSkKICB3cml0ZQoKICBlZGl0IFhmaWxlMgogIGNhbGwgc2V0bGluZSgxLCBbJ2QnLCAnZWVlZWVlZScsICdmJ10pCiAgbm9ybWFsIGo1bAogIGNhbGwgYXNzZXJ0X2VxdWFsKFsyLCA2XSwgZ2V0Y3VycG9zKClbMToyXSkKICB3cml0ZQoKICBlZGl0IFhmaWxlMwogIGNhbGwgc2V0bGluZSgxLCBbJ2cnLCAnaCcsICdpaWlpaSddKQogIG5vcm1hbCBqajNsCiAgY2FsbCBhc3NlcnRfZXF1YWwoWzMsIDRdLCBnZXRjdXJwb3MoKVsxOjJdKQogIHdyaXRlCgogIGVkaXQgWGZpbGUxCiAgY2FsbCBhc3NlcnRfZXF1YWwoWzIsIDRdLCBnZXRjdXJwb3MoKVsxOjJdKQogIGVkaXQgWGZpbGUyCiAgY2FsbCBhc3NlcnRfZXF1YWwoWzIsIDZdLCBnZXRjdXJwb3MoKVsxOjJdKQogIGVkaXQgWGZpbGUzCiAgY2FsbCBhc3NlcnRfZXF1YWwoWzMsIDRdLCBnZXRjdXJwb3MoKVsxOjJdKQoKICBleGUgIm5vcm1hbCBcPEMtTz4iCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1hmaWxlMicsIGV4cGFuZCgnJScpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKFsyLCA2XSwgZ2V0Y3VycG9zKClbMToyXSkKICBleGUgIm5vcm1hbCBcPEMtTz4iCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1hmaWxlMScsIGV4cGFuZCgnJScpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKFsyLCA0XSwgZ2V0Y3VycG9zKClbMToyXSkKCiAgYXUhIEJ1ZldpbkxlYXZlCiAgYXUhIEJ1ZldpbkVudGVyCiAgYndpcGUhCiAgY2FsbCBkZWxldGUoJ1h2aWV3ZGlyJywgJ3JmJykKICBjYWxsIGRlbGV0ZSgnWGZpbGUxJykKICBjYWxsIGRlbGV0ZSgnWGZpbGUyJykKICBjYWxsIGRlbGV0ZSgnWGZpbGUzJykKICBzZXQgdmlld2RpciYKZW5kZnVuYwoKIiBBIGNsZWFuIHNlc3Npb24gKG9uZSBlbXB0eSBidWZmZXIsIG9uZSB3aW5kb3csIGFuZCBvbmUgdGFiKSBzaG91bGQgbm90CiIgc2V0IGFueSBlcnJvciBtZXNzYWdlcyB3aGVuIHNvdXJjZWQgYmVjYXVzZSBubyBjb21tYW5kcyBzaG91bGQgZmFpbC4KZnVuYyBUZXN0X21rc2Vzc2lvbl9ub19lcnJtc2coKQogIGxldCB2OmVycm1zZyA9ICcnCiAgJWJ3aXBlIQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoJycsIHY6ZXJybXNnKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9xdW90ZV9pbl9maWxlbmFtZSgpCiAgIiBvbmx5IFVuaXggY2FuIGhhbmRsZSB0aGlzIHdlaXJkIGZpbGVuYW1lCiAgQ2hlY2tVbml4CgogIGxldCB2OmVycm1zZyA9ICcnCiAgJWJ3aXBlIQogIHNwbGl0IGFub3RoZXIKICBzcGxpdCB4J3lcInoKICBta3Nlc3Npb24hIFh0ZXN0X21rc19xdW90ZWQub3V0CiAgJWJ3aXBlIQogIHNvdXJjZSBYdGVzdF9ta3NfcXVvdGVkLm91dAogIGNhbGwgYXNzZXJ0X3RydWUoYnVmZXhpc3RzKCJ4J3lcInoiKSkKCiAgJWJ3aXBlIQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3NfcXVvdGVkLm91dCcpCmVuZGZ1bmMKCiIgVGVzdCBmb3Igc3RvcmluZyBnbG9iYWwgdmFyaWFibGVzIGluIGEgc2Vzc2lvbiBmaWxlCmZ1bmMgVGVzdF9ta3Nlc3Npb25fZ2xvYmFscygpCiAgc2V0IHNlc3Npb25vcHRpb25zKz1nbG9iYWxzCgogICIgY3JlYXRlIGRpZmZlcmVudCBnbG9iYWwgdmFyaWFibGVzCiAgbGV0IGc6R2xvYmFsX3N0cmluZyA9ICJTdW4gaXMgc2hpbmluZ1xyXG4iCiAgbGV0IGc6R2xvYmFsX2NvdW50ID0gMTAwCiAgbGV0IGc6R2xvYmFsX3BpID0gMy4xNAogIGxldCBnOkdsb2JhbF9uZWdfZmxvYXQgPSAtMi42OAoKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKCiAgdW5sZXQgZzpHbG9iYWxfc3RyaW5nCiAgdW5sZXQgZzpHbG9iYWxfY291bnQKICB1bmxldCBnOkdsb2JhbF9waQogIHVubGV0IGc6R2xvYmFsX25lZ19mbG9hdAoKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCJTdW4gaXMgc2hpbmluZ1xyXG4iLCBnOkdsb2JhbF9zdHJpbmcpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMTAwLCBnOkdsb2JhbF9jb3VudCkKICBjYWxsIGFzc2VydF9lcXVhbCgzLjE0LCBnOkdsb2JhbF9waSkKICBjYWxsIGFzc2VydF9lcXVhbCgtMi42OCwgZzpHbG9iYWxfbmVnX2Zsb2F0KQoKICB1bmxldCBnOkdsb2JhbF9zdHJpbmcKICB1bmxldCBnOkdsb2JhbF9jb3VudAogIHVubGV0IGc6R2xvYmFsX3BpCiAgdW5sZXQgZzpHbG9iYWxfbmVnX2Zsb2F0CiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKIiBUZXN0IGZvciBjaGFuZ2luZyBiYWNrc2xhc2ggdG8gZm9yd2FyZCBzbGFzaCBpbiBmaWxlbmFtZXMKZnVuYyBUZXN0X21rc2Vzc2lvbl9zbGFzaCgpCiAgaWYgZXhpc3RzKCcrc2hlbGxzbGFzaCcpCiAgICB0aHJvdyAnU2tpcHBlZDogY2Fubm90IHVzZSBiYWNrc2xhc2ggaW4gZmlsZSBuYW1lJwogIGVuZGlmCiAgZW5ldwogICVid2lwZSEKICBlIGFcXGJcXGMKICBta3Nlc3Npb24hIFh0ZXN0X21rczEub3V0CiAgc2V0IHNlc3Npb25vcHRpb25zKz1zbGFzaAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzMi5vdXQKCiAgJWJ3aXBlIQogIHNvdXJjZSBYdGVzdF9ta3MxLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdhXGJcYycsIGJ1Zm5hbWUoJycpKQogICVid2lwZSEKICBzb3VyY2UgWHRlc3RfbWtzMi5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgnYS9iL2MnLCBidWZuYW1lKCcnKSkKCiAgJWJ3aXBlIQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3MxLm91dCcpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rczIub3V0JykKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCiIgVGVzdCBmb3IgY2hhbmdpbmcgZGlyZWN0b3J5IHRvIHRoZSBzZXNzaW9uIGZpbGUgZGlyZWN0b3J5CmZ1bmMgVGVzdF9ta3Nlc3Npb25fc2VzZGlyKCkKICBsZXQgc2F2ZV9jd2QgPSBnZXRjd2QoKQogIGNhbGwgbWtkaXIoJ1hwcm9qJykKICBta3Nlc3Npb24hIFhwcm9qL1h0ZXN0X21rczEub3V0CiAgc2V0IHNlc3Npb25vcHRpb25zLT1jdXJkaXIKICBzZXQgc2Vzc2lvbm9wdGlvbnMrPXNlc2RpcgogIG1rc2Vzc2lvbiEgWHByb2ovWHRlc3RfbWtzMi5vdXQKCiAgc291cmNlIFhwcm9qL1h0ZXN0X21rczEub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoJ3Rlc3RkaXInLCBmbmFtZW1vZGlmeShnZXRjd2QoKSwgJzp0JykpCiAgc291cmNlIFhwcm9qL1h0ZXN0X21rczIub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1hwcm9qJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKCksICc6dCcpKQogIGNhbGwgY2hkaXIoc2F2ZV9jd2QpCiAgJWJ3aXBlCgogIHNldCBzZXNzaW9ub3B0aW9ucyYKICBjYWxsIGRlbGV0ZSgnWHByb2onLCAncmYnKQplbmRmdW5jCgoiIFRlc3QgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSB0YWItbG9jYWwgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGVyZSBpcwoiIG9ubHkgYSBzaW5nbGUgdGFiIGFuZCAndGFicGFnZXMnIGlzIG5vdCBpbiAnc2Vzc2lvbm9wdGlvbnMnLgpmdW5jIFRlc3RfbWtzZXNzaW9uX3RjZF9zaW5nbGVfdGFicygpCiAgb25seSB8IHRhYm9ubHkKCiAgbGV0IHNhdmVfY3dkID0gZ2V0Y3dkKCkKICBzZXQgc2Vzc2lvbm9wdGlvbnMtPXRhYnBhZ2VzCiAgc2V0IHNlc3Npb25vcHRpb25zKz1jdXJkaXIKICBjYWxsIG1rZGlyKCdYdG9wZGlyMScpCiAgY2FsbCBta2RpcignWHRvcGRpcjInKQoKICAiIFRoZXJlIGFyZSB0d28gdGFiIHBhZ2VzLCB0aGUgY3VycmVudCBvbmUgaGFzIGxvY2FsIGN3ZCBzZXQgdG8gJ1h0b3BkaXIyJy4KICBleGVjICd0Y2QgJyAuLiBzYXZlX2N3ZCAuLiAnL1h0b3BkaXIxJwogIHRhYm5ldwogIGV4ZWMgJ3RjZCAnIC4uIHNhdmVfY3dkIC4uICcvWHRvcGRpcjInCiAgbWtzZXNzaW9uISBYdGVzdF90Y2Rfc2luZ2xlCgogIHNvdXJjZSBYdGVzdF90Y2Rfc2luZ2xlCiAgY2FsbCBhc3NlcnRfZXF1YWwoMiwgaGFzbG9jYWxkaXIoKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRvcGRpcjInLCBmbmFtZW1vZGlmeShnZXRjd2QoLTEsIDApLCAnOnQnKSkKICAlYndpcGUKCiAgc2V0IHNlc3Npb25vcHRpb25zJgogIGNhbGwgY2hkaXIoc2F2ZV9jd2QpCiAgY2FsbCBkZWxldGUoJ1h0b3BkaXIxJywgJ3JmJykKICBjYWxsIGRlbGV0ZSgnWHRvcGRpcjInLCAncmYnKQplbmRmdW5jCgoiIFRlc3QgZm9yIHN0b3JpbmcgdGhlICdsaW5lcycgYW5kICdjb2x1bW5zJyBzZXR0aW5ncwpmdW5jIFRlc3RfbWtzZXNzaW9uX3Jlc2l6ZSgpCiAgbWtzZXNzaW9uISBYdGVzdF9ta3MxLm91dAogIHNldCBzZXNzaW9ub3B0aW9ucys9cmVzaXplCiAgbWtzZXNzaW9uISBYdGVzdF9ta3MyLm91dAoKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzMS5vdXQnKQogIGxldCBmb3VuZF9yZXNpemUgPSB2OmZhbHNlCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ15zZXQgbGluZXM9JwogICAgICBsZXQgZm91bmRfcmVzaXplID0gdjp0cnVlCiAgICAgIGJyZWFrCiAgICBlbmRpZgogIGVuZGZvcgogIGNhbGwgYXNzZXJ0X2ZhbHNlKGZvdW5kX3Jlc2l6ZSkKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzMi5vdXQnKQogIGxldCBmb3VuZF9yZXNpemUgPSB2OmZhbHNlCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ15zZXQgbGluZXM9JwogICAgICBsZXQgZm91bmRfcmVzaXplID0gdjp0cnVlCiAgICAgIGJyZWFrCiAgICBlbmRpZgogIGVuZGZvcgogIGNhbGwgYXNzZXJ0X3RydWUoZm91bmRfcmVzaXplKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzMS5vdXQnKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3MyLm91dCcpCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgoiIFRlc3QgZm9yIG1rc2Vzc2lvbiB3aXRoIGEgbmFtZWQgc2NyYXRjaCBidWZmZXIKZnVuYyBUZXN0X21rc2Vzc2lvbl9zY3JhdGNoKCkKICBlbmV3IHwgb25seQogIGZpbGUgWHNjcmF0Y2gKICBzZXQgYnVmdHlwZT1ub2ZpbGUKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICAlYndpcGUKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYc2NyYXRjaCcsIGJ1Zm5hbWUoJycpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdub2ZpbGUnLCAmYnVmdHlwZSkKICAlYndpcGUKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCiIgVGVzdCBmb3IgbWtzZXNzaW9uIHdpdGggZm9sZCBvcHRpb25zCmZ1bmMgVGVzdF9ta3Nlc3Npb25fZm9sZG9wdCgpCiAgc2V0IHNlc3Npb25vcHRpb25zLT1vcHRpb25zCiAgc2V0IHNlc3Npb25vcHRpb25zKz1mb2xkcwogIG5ldwogIHNldGxvY2FsIGZvbGRlbmFibGUKICBzZXRsb2NhbCBmb2xkbWV0aG9kPWV4cHIKICBzZXRsb2NhbCBmb2xkbWFya2VyPTw8PCw+Pj4KICBzZXRsb2NhbCBmb2xkaWdub3JlPSUKICBzZXRsb2NhbCBmb2xkbGV2ZWw9MgogIHNldGxvY2FsIGZvbGRtaW5saW5lcz0xMAogIHNldGxvY2FsIGZvbGRuZXN0bWF4PTE1CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgY2xvc2UKICAlYndpcGUKCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF90cnVlKCZmb2xkZW5hYmxlKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdleHByJywgJmZvbGRtZXRob2QpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJzw8PCw+Pj4nLCAmZm9sZG1hcmtlcikKICBjYWxsIGFzc2VydF9lcXVhbCgnJScsICZmb2xkaWdub3JlKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsICZmb2xkbGV2ZWwpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMTAsICZmb2xkbWlubGluZXMpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMTUsICZmb2xkbmVzdG1heCkKCiAgY2xvc2UKICAlYndpcGUKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCiIgVGVzdCBmb3IgbWtzZXNzaW9uIHdpdGggImhlbHAiIGJ1dCBub3QgIm9wdGlvbnMiIGluICdzZXNzaW9ub3B0aW9ucycKZnVuYyBUZXN0X21rc2Vzc2lvbl9oZWxwX25vb3B0KCkKICBzZXQgc2Vzc2lvbm9wdGlvbnMtPW9wdGlvbnMKICBzZXQgc2Vzc2lvbm9wdGlvbnMrPWhlbHAKICBoZWxwCiAgbGV0IGZuYW1lID0gZXhwYW5kKCclJykKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBid2lwZQoKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdoZWxwJywgJmJ1ZnR5cGUpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ2hlbHAnLCAmZmlsZXR5cGUpCiAgY2FsbCBhc3NlcnRfZXF1YWwoZm5hbWUsIGV4cGFuZCgnJScpKQogIGNhbGwgYXNzZXJ0X2ZhbHNlKCZtb2RpZmlhYmxlKQogIGNhbGwgYXNzZXJ0X3RydWUoJnJlYWRvbmx5KQoKICBoZWxwY2xvc2UKICBoZWxwIGluZGV4CiAgbGV0IGZuYW1lID0gZXhwYW5kKCclJykKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBid2lwZQoKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdoZWxwJywgJmJ1ZnR5cGUpCiAgY2FsbCBhc3NlcnRfZXF1YWwoZm5hbWUsIGV4cGFuZCgnJScpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgoiIFRlc3QgZm9yIG1rc2Vzc2lvbiB3aXRoIHdpbmRvdyBwb3NpdGlvbgpmdW5jIFRlc3RfbWtzZXNzaW9uX3dpbnBvcygpCiAgIiBPbmx5IGFwcGxpY2FibGUgaW4gR1VJIFZpbQogIENoZWNrR3VpCgogIHNldCBzZXNzaW9ub3B0aW9ucys9d2lucG9zCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGZvdW5kX3dpbnBvcyA9IHY6ZmFsc2UKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ153aW5wb3MgJwogICAgICBsZXQgZm91bmRfd2lucG9zID0gdjp0cnVlCiAgICAgIGJyZWFrCiAgICBlbmRpZgogIGVuZGZvcgogIGNhbGwgYXNzZXJ0X3RydWUoZm91bmRfd2lucG9zKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCiIgVGVzdCBmb3IgbWtzZXNzaW9uIHdpdGhvdXQgb3B0aW9ucyByZXN0b3JlcyB3aW5taW5oZWlnaHQKZnVuYyBUZXN0X21rc2Vzc2lvbl93aW5taW5oZWlnaHQoKQogIHNldCBzZXNzaW9ub3B0aW9ucy09b3B0aW9ucwogIHNwbGl0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGZvdW5kX3Jlc3RvcmUgPSAwCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICc9IHM6c2F2ZV93aW5taW5cKHdpZHRoXHxoZWlnaHRcKScKICAgICAgbGV0IGZvdW5kX3Jlc3RvcmUgKz0gMQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9lcXVhbCgyLCBmb3VuZF9yZXN0b3JlKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBjbG9zZQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKIiBUZXN0IGZvciBta3Nlc3Npb24gd2l0aCBhbmQgd2l0aG91dCBvcHRpb25zIHJlc3RvcmVzIHNob3J0bWVzcwpmdW5jIFRlc3RfbWtzZXNzaW9uX3Nob3J0bWVzcygpCiAgIiBXaXRob3V0IG9wdGlvbnMKICBzZXQgc2Vzc2lvbm9wdGlvbnMtPW9wdGlvbnMKICBzcGxpdAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBmb3VuZF9zYXZlID0gMAogIGxldCBmb3VuZF9yZXN0b3JlID0gMAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBmb3IgbGluZSBpbiBsaW5lcwogICAgbGV0IGxpbmUgPSB0cmltKGxpbmUpCgogICAgaWYgbGluZSA9PSMgJ2xldCBzOnNob3J0bWVzc19zYXZlID0gJnNob3J0bWVzcycKICAgICAgbGV0IGZvdW5kX3NhdmUgKz0gMQogICAgZW5kaWYKCiAgICBpZiBmb3VuZF9zYXZlICE9IyAwICYmIGxpbmUgPT0jICdsZXQgJnNob3J0bWVzcyA9IHM6c2hvcnRtZXNzX3NhdmUnCiAgICAgIGxldCBmb3VuZF9yZXN0b3JlICs9IDEKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgZm91bmRfc2F2ZSkKICBjYWxsIGFzc2VydF9lcXVhbCgxLCBmb3VuZF9yZXN0b3JlKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBjbG9zZQogIHNldCBzZXNzaW9ub3B0aW9ucyYKCiAgIiBXaXRoIG9wdGlvbnMKICBzZXQgc2Vzc2lvbm9wdGlvbnMrPW9wdGlvbnMKICBzcGxpdAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBmb3VuZF9yZXN0b3JlID0gMAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiMgJ3M6c2hvcnRtZXNzX3NhdmUnCiAgICAgIGxldCBmb3VuZF9yZXN0b3JlICs9IDEKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfZXF1YWwoMCwgZm91bmRfcmVzdG9yZSkKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgY2xvc2UKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCiIgVGVzdCB0aGF0IHdoZW4gVmltIGxvYWRpbmcgc2Vzc2lvbiBoYXMgJ0EnIGluICdzaG9ydG1lc3MnIGl0IGRvZXMgbm90CiIgY29tcGxhaW4gYWJvdXQgYW4gZXhpc3Rpbmcgc3dhcGZpbGUuCmZ1bmMgVGVzdF9ta3Nlc3Npb25fc2hvcnRtZXNzX3dpdGhfQSgpCiAgZWRpdCBYdGVzdGZpbGUKICB3cml0ZQogIGxldCBmbmFtZSA9IHN3YXBuYW1lKCclJykKICBsZXQgY29udCA9IHJlYWRibG9iKGZuYW1lKQogIHNldCBzZXNzaW9ub3B0aW9ucy09b3B0aW9ucwogIG1rc2Vzc2lvbiBYdGVzdHNlc3Npb24KICBid2lwZSEKCiAgIiBSZWNyZWF0ZSB0aGUgc3dhcCBmaWxlIHRvIHByZXRlbmQgdGhlIGZpbGUgaXMgYmVpbmcgZWRpdGVkCiAgY2FsbCB3cml0ZWZpbGUoY29udCwgZm5hbWUsICdEJykKICBzZXQgc2hvcnRtZXNzKz1BCiAgc291cmNlIFh0ZXN0c2Vzc2lvbgoKICBzZXQgc2hvcnRtZXNzJgogIHNldCBzZXNzaW9ub3B0aW9ucyYKICBjYWxsIGRlbGV0ZSgnWHRlc3RzZXNzaW9uJykKZW5kZnVuYwoKIiBUZXN0IGZvciBta3Nlc3Npb24gd2l0aCAnY29tcGF0aWJsZScgb3B0aW9uCmZ1bmMgVGVzdF9ta3Nlc3Npb25fY29tcGF0aWJsZSgpCiAgbWtzZXNzaW9uISBYdGVzdF9ta3MxLm91dAogIHNldCBjb21wYXRpYmxlCiAgbWtzZXNzaW9uISBYdGVzdF9ta3MyLm91dAogIHNldCBub2NwCgogIGxldCB0ZXN0X3N1Y2Nlc3MgPSB2OmZhbHNlCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rczEub3V0JykKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXmlmICZjcCB8IHNldCBub2NwIHwgZW5kaWYnCiAgICAgIGxldCB0ZXN0X3N1Y2Nlc3MgPSB2OnRydWUKICAgICAgYnJlYWsKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfdHJ1ZSh0ZXN0X3N1Y2Nlc3MpCgogIGxldCB0ZXN0X3N1Y2Nlc3MgPSB2OmZhbHNlCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rczIub3V0JykKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXmlmICEmY3AgfCBzZXQgY3AgfCBlbmRpZicKICAgICAgbGV0IHRlc3Rfc3VjY2VzcyA9IHY6dHJ1ZQogICAgICBicmVhawogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF90cnVlKHRlc3Rfc3VjY2VzcykKCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rczEub3V0JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzMi5vdXQnKQogIHNldCBjb21wYXRpYmxlJgogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZnVuYyBzOkNsZWFyTWFwcGluZ3MoKQogIG1hcGNsZWFyCiAgb21hcGNsZWFyCiAgbWFwY2xlYXIhCiAgbG1hcGNsZWFyCiAgdG1hcGNsZWFyCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3ZpbXJjKCkKICBsZXQgZW50cmllcyA9IFsKICAgICAgICBcIFsnJywgJ25vdGhpbmcnLCAnPE5vcD4nXSwKICAgICAgICBcIFsnbicsICdub3JtYWwnLCAnTk9STUFMJ10sCiAgICAgICAgXCBbJ3YnLCAndmlzdWFsJywgJ1ZJU1VBTCddLAogICAgICAgIFwgWydzJywgJ3NlbGVjdCcsICdTRUxFQ1QnXSwKICAgICAgICBcIFsneCcsICd2aXN1YWxvbmx5JywgJ1ZJU1VBTE9OTFknXSwKICAgICAgICBcIFsnbycsICdvcGVyYXRvcicsICdPUEVSQVRPUiddLAogICAgICAgIFwgWydpJywgJ2luc2VydCcsICdJTlNFUlQnXSwKICAgICAgICBcIFsnbCcsICdsYW5nJywgJ0xBTkcnXSwKICAgICAgICBcIFsnYycsICdjb21tYW5kJywgJ0NPTU1BTkQnXSwKICAgICAgICBcIFsndCcsICd0ZXJtaW5hbCcsICdURVJNSU5BTCddLAogICAgICAgIFwgXQogIGZvciBlbnRyeSBpbiBlbnRyaWVzCiAgICBleGUgZW50cnlbMF0gLi4gJ21hcCAnIC4uIGVudHJ5WzFdIC4uICcgJyAuLiBlbnRyeVsyXQogIGVuZGZvcgoKICBta3ZpbXJjIFh0ZXN0dmltcmMKCiAgY2FsbCBzOkNsZWFyTWFwcGluZ3MoKQogIGZvciBlbnRyeSBpbiBlbnRyaWVzCiAgICBjYWxsIGFzc2VydF9lcXVhbCgnJywgbWFwYXJnKGVudHJ5WzFdLCBlbnRyeVswXSkpCiAgZW5kZm9yCgogIHNvdXJjZSBYdGVzdHZpbXJjCgogIGZvciBlbnRyeSBpbiBlbnRyaWVzCiAgICBjYWxsIGFzc2VydF9lcXVhbChlbnRyeVsyXSwgbWFwYXJnKGVudHJ5WzFdLCBlbnRyeVswXSkpCiAgZW5kZm9yCgogIGNhbGwgczpDbGVhck1hcHBpbmdzKCkKCiAgIiB0aGUgJ3Bhc3RldG9nZ2xlJywgJ3dpbGRjaGFyJyBhbmQgJ3dpbGRjaGFybScgb3B0aW9uIHZhbHVlcyBzaG91bGQgYmUKICAiIHN0b3JlZCBhcyBrZXkgbmFtZXMgaW4gdGhlIHZpbXJjIGZpbGUKICBzZXQgcGFzdGV0b2dnbGU9PEY1PgogIHNldCB3aWxkY2hhcj08RjY+CiAgc2V0IHdpbGRjaGFybT08Rjc+CiAgY2FsbCBhc3NlcnRfZmFpbHMoJ21rdmltcmMgWHRlc3R2aW1yYycpCiAgbWt2aW1yYyEgWHRlc3R2aW1yYwogIGNhbGwgYXNzZXJ0X25vdGVxdWFsKC0xLCBpbmRleChyZWFkZmlsZSgnWHRlc3R2aW1yYycpLCAnc2V0IHBhc3RldG9nZ2xlPTxGNT4nKSkKICBjYWxsIGFzc2VydF9ub3RlcXVhbCgtMSwgaW5kZXgocmVhZGZpbGUoJ1h0ZXN0dmltcmMnKSwgJ3NldCB3aWxkY2hhcj08RjY+JykpCiAgY2FsbCBhc3NlcnRfbm90ZXF1YWwoLTEsIGluZGV4KHJlYWRmaWxlKCdYdGVzdHZpbXJjJyksICdzZXQgd2lsZGNoYXJtPTxGNz4nKSkKICBzZXQgcGFzdGV0b2dnbGUmIHdpbGRjaGFyJiB3aWxkY2hhcm0mCgogIGNhbGwgZGVsZXRlKCdYdGVzdHZpbXJjJykKZW5kZnVuYwoKZnVuYyBUZXN0X3Njcm9sbG9mZigpCiAgc2V0IHNlc3Npb25vcHRpb25zKz1sb2NhbG9wdGlvbnMKICBzZXRsb2NhbCBzbz0xIHNpc289MQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNldGxvY2FsIHNvPS0xIHNpc289LTEKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDEsICZsOnNvKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDEsICZsOnNpc28pCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogIHNldGxvY2FsIHNvJiBzaXNvJgogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZnVuYyBUZXN0X2FsdGZpbGUoKQogIGVkaXQgWG9uZQogIHNwbGl0IFh0d28KICBlZGl0IFh0d29hbHQKICBlZGl0ICMKICB3aW5jbWQgdwogIGVkaXQgWG9uZWFsdAogIGVkaXQgIwogIG1rc2Vzc2lvbiEgWHRlc3RfYWx0ZmlsZQogIG9ubHkKICBid2lwZSBYb25lYWx0CiAgYndpcGUgWHR3b2FsdAogIGJ3aXBlIQogIHNvdXJjZSBYdGVzdF9hbHRmaWxlCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1hvbmUnLCBidWZuYW1lKCkpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1hvbmVhbHQnLCBidWZuYW1lKCcjJykpCiAgd2luY21kIHcKICBjYWxsIGFzc2VydF9lcXVhbCgnWHR3bycsIGJ1Zm5hbWUoKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHR3b2FsdCcsIGJ1Zm5hbWUoJyMnKSkKICBvbmx5CiAgYndpcGUhCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X2FsdGZpbGUnKQplbmRmdW5jCgoiIFRlc3QgZm9yIGNyZWF0aW5nIHZpZXdzIHdpdGggbWFudWFsIGZvbGRzCmZ1bmMgVGVzdF9ta3ZpZXdfbWFudWFsX2ZvbGQoKQogIGNhbGwgd3JpdGVmaWxlKHJhbmdlKDEsMTApLCAnWG1rdmZpbGUnLCAnRCcpCiAgbmV3IFhta3ZmaWxlCiAgIiBjcmVhdGUgcmVjdXJzaXZlIGZvbGRzCiAgNSw2Zm9sZAogIDQsN2ZvbGQKICBta3ZpZXcgWHZpZXcKICBub3JtYWwgekUKICBzb3VyY2UgWHZpZXcKICBjYWxsIGFzc2VydF9lcXVhbChbLTEsIDQsIDQsIDQsIDQsIC0xXSwgW2ZvbGRjbG9zZWQoMyksIGZvbGRjbG9zZWQoNCksCiAgICAgICAgXCBmb2xkY2xvc2VkKDUpLCBmb2xkY2xvc2VkKDYpLCBmb2xkY2xvc2VkKDcpLCBmb2xkY2xvc2VkKDgpXSkKICAiIG9wZW4gb25lIGxldmVsIG9mIGZvbGQKICA0Zm9sZG9wZW4KICBta3ZpZXchIFh2aWV3CiAgbm9ybWFsIHpFCiAgc291cmNlIFh2aWV3CiAgY2FsbCBhc3NlcnRfZXF1YWwoWy0xLCAtMSwgNSwgNSwgLTEsIC0xXSwgW2ZvbGRjbG9zZWQoMyksIGZvbGRjbG9zZWQoNCksCiAgICAgICAgXCBmb2xkY2xvc2VkKDUpLCBmb2xkY2xvc2VkKDYpLCBmb2xkY2xvc2VkKDcpLCBmb2xkY2xvc2VkKDgpXSkKICAiIG9wZW4gYWxsIHRoZSBmb2xkcwogICVmb2xkb3BlbiEKICBta3ZpZXchIFh2aWV3CiAgbm9ybWFsIHpFCiAgc291cmNlIFh2aWV3CiAgY2FsbCBhc3NlcnRfZXF1YWwoWy0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdLCBbZm9sZGNsb3NlZCgzKSwgZm9sZGNsb3NlZCg0KSwKICAgICAgICBcIGZvbGRjbG9zZWQoNSksIGZvbGRjbG9zZWQoNiksIGZvbGRjbG9zZWQoNyksIGZvbGRjbG9zZWQoOCldKQogIGNhbGwgZGVsZXRlKCdYdmlldycpCiAgYnchCmVuZGZ1bmMKCiIgdmltOiBzaGlmdHdpZHRoPTIgc3RzPTIgZXhwYW5kdGFiCg==