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BgAAAGRvdWJsZTMAAABzAgAAAAAFYwEAAAABAAAAAQAAAEMAAABzBwAAAHwAAGoAAFMoAQAAAHM8AAAACiAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzKC01KS5nZXQoKQogICAgICAgIC01CiAgICAgICAgKAEAAABSBAAAACgBAAAAUgUAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAMAAABnZXQ6AAAAcwIAAAAABWMBAAAAAQAAAAIAAABDAAAAcwgAAAB8AABkAQAXUygCAAAAc0UAAAAKICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QoMTApCiAgICAgICAgMTEKICAgICAgICBpAQAAACgAAAAAKAEAAABSAQAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0DgAAAGFfc3RhdGljbWV0aG9kQQAAAHMCAAAAAAVjAgAAAAIAAAACAAAAQwAAAHMIAAAAfAEAZAEAF1MoAgAAAHOCAAAACiAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QoMTApCiAgICAgICAgMTIKICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MoMCkuYV9jbGFzc21ldGhvZCgxMCkKICAgICAgICAxMgogICAgICAgIGkCAAAAKAAAAAAoAgAAAHQDAAAAY2xzUgEAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dA0AAABhX2NsYXNzbWV0aG9kSQAAAHMCAAAAAAd0AwAAAGRvY3NBAAAACiAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzKDIyKS5hX3Byb3BlcnR5CiAgICAgICAgMjIKICAgICAgICB0CwAAAE5lc3RlZENsYXNzYwAAAAAAAAAAAgAAAEIAAABzLAAAAGUAAFoBAGQAAFoCAGQBAGQCAIQBAFoDAGQDAIQAAFoEAGQEAIQAAFoFAFJTKAUAAABzdAAAAAogICAgICAgID4+PiB4ID0gU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MoNSkKICAgICAgICA+Pj4geSA9IHguc3F1YXJlKCkKICAgICAgICA+Pj4gcHJpbnQgeS5nZXQoKQogICAgICAgIDI1CiAgICAgICAgaQAAAABjAgAAAAIAAAACAAAAQwAAAHMNAAAAfAEAfAAAXwAAZAEAUygCAAAAc1EAAAAKICAgICAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzKCkuZ2V0KCkKICAgICAgICAgICAgMAogICAgICAgICAgICBOKAEAAABSBAAAACgCAAAAUgUAAABSBAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlSBgAAAF8AAABzAgAAAAAFYwEAAAABAAAAAwAAAEMAAABzFwAAAHQAAGoBAHwAAGoCAHwAAGoCABSDAQBTKAEAAABOKAMAAABSAwAAAFINAAAAUgQAAAAoAQAAAFIFAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weXQGAAAAc3F1YXJlZQAAAHMCAAAAAAFjAQAAAAEAAAABAAAAQwAAAHMHAAAAfAAAagAAUygBAAAATigBAAAAUgQAAAAoAQAAAFIFAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIIAAAAZwAAAHMCAAAAAAEoBgAAAHQIAAAAX19uYW1lX190CgAAAF9fbW9kdWxlX190BwAAAF9fZG9jX19SBgAAAFIOAAAAUggAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlSDQAAAFgAAABzCAAAAAYGBgEMBgkCKAAAAAAoDQAAAFIPAAAAUhAAAABSEQAAAFIGAAAAUgcAAABSCAAAAFIJAAAAdAwAAABzdGF0aWNtZXRob2RSCwAAAHQLAAAAY2xhc3NtZXRob2R0CAAAAHByb3BlcnR5dAoAAABhX3Byb3BlcnR5Ug0AAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlSAwAAABwAAABzFgAAAAYPBgEJBwkHCQcJBgwCCQgMAgkDCQJ0EwAAAFNhbXBsZU5ld1N0eWxlQ2xhc3NjAAAAAAAAAAABAAAAQgAAAHMpAAAAZQAAWgEAZAAAWgIAZAEAhAAAWgMAZAIAhAAAWgQAZAMAhAAAWgUAUlMoBAAAAHMvAAAACiAgICA+Pj4gcHJpbnQgJzFcbjJcbjMnCiAgICAxCiAgICAyCiAgICAzCiAgICBjAgAAAAIAAAACAAAAQwAAAHMNAAAAfAEAfAAAXwAAZAEAUygCAAAAc0QAAAAKICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlTmV3U3R5bGVDbGFzcygxMikuZ2V0KCkKICAgICAgICAxMgogICAgICAgIE4oAQAAAFIEAAAAKAIAAABSBQAAAFIEAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIGAAAAcQAAAHMCAAAAAAVjAQAAAAEAAAADAAAAQwAAAHMUAAAAdAAAfAAAagEAfAAAagEAF4MBAFMoAQAAAHNNAAAACiAgICAgICAgPj4+IHByaW50IFNhbXBsZU5ld1N0eWxlQ2xhc3MoMTIpLmRvdWJsZSgpLmdldCgpCiAgICAgICAgMjQKICAgICAgICAoAgAAAFIWAAAAUgQAAAAoAQAAAFIFAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIHAAAAeAAAAHMCAAAAAAVjAQAAAAEAAAABAAAAQwAAAHMHAAAAfAAAagAAUygBAAAAc0QAAAAKICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlTmV3U3R5bGVDbGFzcygtNSkuZ2V0KCkKICAgICAgICAtNQogICAgICAgICgBAAAAUgQAAAAoAQAAAFIFAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIIAAAAfwAAAHMCAAAAAAUoBgAAAFIPAAAAUhAAAABSEQAAAFIGAAAAUgcAAABSCAAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIWAAAAagAAAHMIAAAABgYGAQkHCQd0CgAAAF9GYWtlSW5wdXRjAAAAAAAAAAABAAAAQgAAAHMgAAAAZQAAWgEAZAAAWgIAZAEAhAAAWgMAZAIAhAAAWgQAUlMoAwAAAHMHAQAACiAgICBBIGZha2UgaW5wdXQgc3RyZWFtIGZvciBwZGIncyBpbnRlcmFjdGl2ZSBkZWJ1Z2dlci4gIFdoZW5ldmVyIGEKICAgIGxpbmUgaXMgcmVhZCwgcHJpbnQgaXQgKHRvIHNpbXVsYXRlIHRoZSB1c2VyIHR5cGluZyBpdCksIGFuZCB0aGVuCiAgICByZXR1cm4gaXQuICBUaGUgc2V0IG9mIGxpbmVzIHRvIHJldHVybiBpcyBzcGVjaWZpZWQgaW4gdGhlCiAgICBjb25zdHJ1Y3RvcjsgdGhleSBzaG91bGQgbm90IGhhdmUgdHJhaWxpbmcgbmV3bGluZXMuCiAgICBjAgAAAAIAAAACAAAAQwAAAHMNAAAAfAEAfAAAXwAAZAAAUygBAAAATigBAAAAdAUAAABsaW5lcygCAAAAUgUAAABSGAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlSBgAAAJEAAABzAgAAAAABYwEAAAACAAAAAgAAAEMAAABzHwAAAHwAAGoAAGoBAGQBAIMBAH0BAHwBAEdIfAEAZAIAF1MoAwAAAE5pAAAAAHMBAAAACigCAAAAUhgAAAB0AwAAAHBvcCgCAAAAUgUAAAB0BAAAAGxpbmUoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAgAAAByZWFkbGluZZQAAABzBgAAAAABEgEFASgFAAAAUg8AAABSEAAAAFIRAAAAUgYAAABSGwAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weVIXAAAAigAAAHMGAAAABgYGAQkDYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHNdDwAAClVuaXQgdGVzdHMgZm9yIHRoZSBgRXhhbXBsZWAgY2xhc3MuCgpFeGFtcGxlIGlzIGEgc2ltcGxlIGNvbnRhaW5lciBjbGFzcyB0aGF0IGhvbGRzOgogIC0gYHNvdXJjZWA6IEEgc291cmNlIHN0cmluZy4KICAtIGB3YW50YDogQW4gZXhwZWN0ZWQgb3V0cHV0IHN0cmluZy4KICAtIGBleGNfbXNnYDogQW4gZXhwZWN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2Ugc3RyaW5nIChvciBOb25lIGlmIG5vCiAgICBleGNlcHRpb24gaXMgZXhwZWN0ZWQpLgogIC0gYGxpbmVub2A6IEEgbGluZSBudW1iZXIgKHdpdGhpbiB0aGUgZG9jc3RyaW5nKS4KICAtIGBpbmRlbnRgOiBUaGUgZXhhbXBsZSdzIGluZGVudGF0aW9uIGluIHRoZSBpbnB1dCBzdHJpbmcuCiAgLSBgb3B0aW9uc2A6IEFuIG9wdGlvbiBkaWN0aW9uYXJ5LCBtYXBwaW5nIG9wdGlvbiBmbGFncyB0byBUcnVlIG9yCiAgICBGYWxzZS4KClRoZXNlIGF0dHJpYnV0ZXMgYXJlIHNldCBieSB0aGUgY29uc3RydWN0b3IuICBgc291cmNlYCBhbmQgYHdhbnRgIGFyZQpyZXF1aXJlZDsgdGhlIG90aGVyIGF0dHJpYnV0ZXMgYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXM6CgogICAgPj4+IGV4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKICAgID4+PiAoZXhhbXBsZS5zb3VyY2UsIGV4YW1wbGUud2FudCwgZXhhbXBsZS5leGNfbXNnLAogICAgLi4uICBleGFtcGxlLmxpbmVubywgZXhhbXBsZS5pbmRlbnQsIGV4YW1wbGUub3B0aW9ucykKICAgICgncHJpbnQgMVxuJywgJzFcbicsIE5vbmUsIDAsIDAsIHt9KQoKVGhlIGZpcnN0IHRocmVlIGF0dHJpYnV0ZXMgKGBzb3VyY2VgLCBgd2FudGAsIGFuZCBgZXhjX21zZ2ApIG1heSBiZQpzcGVjaWZpZWQgcG9zaXRpb25hbGx5OyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBzaG91bGQgYmUgc3BlY2lmaWVkIGFzCmtleXdvcmQgYXJndW1lbnRzOgoKICAgID4+PiBleGNfbXNnID0gJ0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGxpc3QnCiAgICA+Pj4gZXhhbXBsZSA9IGRvY3Rlc3QuRXhhbXBsZSgnW10ucG9wKCknLCAnJywgZXhjX21zZywKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz01LCBpbmRlbnQ9NCwKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e2RvY3Rlc3QuRUxMSVBTSVM6IFRydWV9KQogICAgPj4+IChleGFtcGxlLnNvdXJjZSwgZXhhbXBsZS53YW50LCBleGFtcGxlLmV4Y19tc2csCiAgICAuLi4gIGV4YW1wbGUubGluZW5vLCBleGFtcGxlLmluZGVudCwgZXhhbXBsZS5vcHRpb25zKQogICAgKCdbXS5wb3AoKVxuJywgJycsICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nLCA1LCA0LCB7ODogVHJ1ZX0pCgpUaGUgY29uc3RydWN0b3Igbm9ybWFsaXplcyB0aGUgYHNvdXJjZWAgc3RyaW5nIHRvIGVuZCBpbiBhIG5ld2xpbmU6CgogICAgU291cmNlIHNwYW5zIGEgc2luZ2xlIGxpbmU6IG5vIHRlcm1pbmF0aW5nIG5ld2xpbmUuCiAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMScsICcxXG4nKQogICAgPj4+IGUuc291cmNlLCBlLndhbnQKICAgICgncHJpbnQgMVxuJywgJzFcbicpCgogICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDFcbicsICcxXG4nKQogICAgPj4+IGUuc291cmNlLCBlLndhbnQKICAgICgncHJpbnQgMVxuJywgJzFcbicpCgogICAgU291cmNlIHNwYW5zIG11bHRpcGxlIGxpbmVzOiByZXF1aXJlIHRlcm1pbmF0aW5nIG5ld2xpbmUuCiAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMTtcbnByaW50IDJcbicsICcxXG4yXG4nKQogICAgPj4+IGUuc291cmNlLCBlLndhbnQKICAgICgncHJpbnQgMTtcbnByaW50IDJcbicsICcxXG4yXG4nKQoKICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxO1xucHJpbnQgMicsICcxXG4yXG4nKQogICAgPj4+IGUuc291cmNlLCBlLndhbnQKICAgICgncHJpbnQgMTtcbnByaW50IDJcbicsICcxXG4yXG4nKQoKICAgIEVtcHR5IHNvdXJjZSBzdHJpbmcgKHdoaWNoIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gcmVhbCBleGFtcGxlcykKICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCcnLCAnJykKICAgID4+PiBlLnNvdXJjZSwgZS53YW50CiAgICAoJ1xuJywgJycpCgpUaGUgY29uc3RydWN0b3Igbm9ybWFsaXplcyB0aGUgYHdhbnRgIHN0cmluZyB0byBlbmQgaW4gYSBuZXdsaW5lLAp1bmxlc3MgaXQncyB0aGUgZW1wdHkgc3RyaW5nOgoKICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCiAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAogICAgKCdwcmludCAxXG4nLCAnMVxuJykKCiAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMScsICcxJykKICAgID4+PiBlLnNvdXJjZSwgZS53YW50CiAgICAoJ3ByaW50IDFcbicsICcxXG4nKQoKICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCcsICcnKQogICAgPj4+IGUuc291cmNlLCBlLndhbnQKICAgICgncHJpbnRcbicsICcnKQoKVGhlIGNvbnN0cnVjdG9yIG5vcm1hbGl6ZXMgdGhlIGBleGNfbXNnYCBzdHJpbmcgdG8gZW5kIGluIGEgbmV3bGluZSwKdW5sZXNzIGl0J3MgYE5vbmVgOgoKICAgIE1lc3NhZ2Ugc3BhbnMgb25lIGxpbmUKICAgID4+PiBleGNfbXNnID0gJ0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGxpc3QnCiAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgnW10ucG9wKCknLCAnJywgZXhjX21zZykKICAgID4+PiBlLmV4Y19tc2cKICAgICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nCgogICAgPj4+IGV4Y19tc2cgPSAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdFxuJwogICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ1tdLnBvcCgpJywgJycsIGV4Y19tc2cpCiAgICA+Pj4gZS5leGNfbXNnCiAgICAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdFxuJwoKICAgIE1lc3NhZ2Ugc3BhbnMgbXVsdGlwbGUgbGluZXMKICAgID4+PiBleGNfbXNnID0gJ1ZhbHVlRXJyb3I6IDFcbiAgMicKICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdyYWlzZSBWYWx1ZUVycm9yKCIxXG4gIDIiKScsICcnLCBleGNfbXNnKQogICAgPj4+IGUuZXhjX21zZwogICAgJ1ZhbHVlRXJyb3I6IDFcbiAgMlxuJwoKICAgID4+PiBleGNfbXNnID0gJ1ZhbHVlRXJyb3I6IDFcbiAgMlxuJwogICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3JhaXNlIFZhbHVlRXJyb3IoIjFcbiAgMiIpJywgJycsIGV4Y19tc2cpCiAgICA+Pj4gZS5leGNfbXNnCiAgICAnVmFsdWVFcnJvcjogMVxuICAyXG4nCgogICAgRW1wdHkgKGJ1dCBub24tTm9uZSkgZXhjZXB0aW9uIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBuZXZlciBhcHBlYXIKICAgIGluIHJlYWwgZXhhbXBsZXMpCiAgICA+Pj4gZXhjX21zZyA9ICcnCiAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncmFpc2UgWCgpJywgJycsIGV4Y19tc2cpCiAgICA+Pj4gZS5leGNfbXNnCiAgICAnXG4nCgpDb21wYXJlIGBFeGFtcGxlYDoKICAgID4+PiBleGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCiAgICA+Pj4gc2FtZV9leGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCiAgICA+Pj4gb3RoZXJfZXhhbXBsZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgNDInLCAnNDJcbicpCiAgICA+Pj4gZXhhbXBsZSA9PSBzYW1lX2V4YW1wbGUKICAgIFRydWUKICAgID4+PiBleGFtcGxlICE9IHNhbWVfZXhhbXBsZQogICAgRmFsc2UKICAgID4+PiBoYXNoKGV4YW1wbGUpID09IGhhc2goc2FtZV9leGFtcGxlKQogICAgVHJ1ZQogICAgPj4+IGV4YW1wbGUgPT0gb3RoZXJfZXhhbXBsZQogICAgRmFsc2UKICAgID4+PiBleGFtcGxlICE9IG90aGVyX2V4YW1wbGUKICAgIFRydWUKTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAwAAAB0ZXN0X0V4YW1wbGWdAAAAcwAAAABjAAAAAAAAAAABAAAAQwAAAHMEAAAAZAEAUygCAAAAc3QQAAAKVW5pdCB0ZXN0cyBmb3IgdGhlIGBEb2NUZXN0YCBjbGFzcy4KCkRvY1Rlc3QgaXMgYSBjb2xsZWN0aW9uIG9mIGV4YW1wbGVzLCBleHRyYWN0ZWQgZnJvbSBhIGRvY3N0cmluZywgYWxvbmcKd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgZG9jc3RyaW5nIGNvbWVzIGZyb20gKGEgbmFtZSwKZmlsZW5hbWUsIGFuZCBsaW5lIG51bWJlcikuICBUaGUgZG9jc3RyaW5nIGlzIHBhcnNlZCBieSB0aGUgYERvY1Rlc3RgCmNvbnN0cnVjdG9yOgoKICAgID4+PiBkb2NzdHJpbmcgPSAnJycKICAgIC4uLiAgICAgPj4+IHByaW50IDEyCiAgICAuLi4gICAgIDEyCiAgICAuLi4KICAgIC4uLiBOb24tZXhhbXBsZSB0ZXh0LgogICAgLi4uCiAgICAuLi4gICAgID4+PiBwcmludCAnYW5vdGhlclxleGFtcGxlJwogICAgLi4uICAgICBhbm90aGVyCiAgICAuLi4gICAgIGV4YW1wbGUKICAgIC4uLiAnJycKICAgID4+PiBnbG9icyA9IHt9ICMgZ2xvYmFscyB0byBydW4gdGhlIHRlc3QgaW4uCiAgICA+Pj4gcGFyc2VyID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkKICAgID4+PiB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWVfZmlsZScsIDIwKQogICAgPj4+IHByaW50IHRlc3QKICAgIDxEb2NUZXN0IHNvbWVfdGVzdCBmcm9tIHNvbWVfZmlsZToyMCAoMiBleGFtcGxlcyk+CiAgICA+Pj4gbGVuKHRlc3QuZXhhbXBsZXMpCiAgICAyCiAgICA+Pj4gZTEsIGUyID0gdGVzdC5leGFtcGxlcwogICAgPj4+IChlMS5zb3VyY2UsIGUxLndhbnQsIGUxLmxpbmVubykKICAgICgncHJpbnQgMTJcbicsICcxMlxuJywgMSkKICAgID4+PiAoZTIuc291cmNlLCBlMi53YW50LCBlMi5saW5lbm8pCiAgICAoInByaW50ICdhbm90aGVyXFxleGFtcGxlJ1xuIiwgJ2Fub3RoZXJcbmV4YW1wbGVcbicsIDYpCgpTb3VyY2UgaW5mb3JtYXRpb24gKG5hbWUsIGZpbGVuYW1lLCBhbmQgbGluZSBudW1iZXIpIGlzIGF2YWlsYWJsZSBhcwphdHRyaWJ1dGVzIG9uIHRoZSBkb2N0ZXN0IG9iamVjdDoKCiAgICA+Pj4gKHRlc3QubmFtZSwgdGVzdC5maWxlbmFtZSwgdGVzdC5saW5lbm8pCiAgICAoJ3NvbWVfdGVzdCcsICdzb21lX2ZpbGUnLCAyMCkKClRoZSBsaW5lIG51bWJlciBvZiBhbiBleGFtcGxlIHdpdGhpbiBpdHMgY29udGFpbmluZyBmaWxlIGlzIGZvdW5kIGJ5CmFkZGluZyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4YW1wbGUgYW5kIHRoZSBsaW5lIG51bWJlciBvZiBpdHMKY29udGFpbmluZyB0ZXN0OgoKICAgID4+PiB0ZXN0LmxpbmVubyArIGUxLmxpbmVubwogICAgMjEKICAgID4+PiB0ZXN0LmxpbmVubyArIGUyLmxpbmVubwogICAgMjYKCklmIHRoZSBkb2NzdHJpbmcgY29udGFpbnMgaW5jb25zaXN0YW50IGxlYWRpbmcgd2hpdGVzcGFjZSBpbiB0aGUKZXhwZWN0ZWQgb3V0cHV0IG9mIGFuIGV4YW1wbGUsIHRoZW4gYERvY1Rlc3RgIHdpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgoKICAgID4+PiBkb2NzdHJpbmcgPSByJycnCiAgICAuLi4gICAgICAgPj4+IHByaW50ICdiYWRcbmluZGVudGF0aW9uJwogICAgLi4uICAgICAgIGJhZAogICAgLi4uICAgICBpbmRlbnRhdGlvbgogICAgLi4uICAgICAnJycKICAgID4+PiBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsICdmaWxlbmFtZScsIDApCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICBWYWx1ZUVycm9yOiBsaW5lIDQgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGhhcyBpbmNvbnNpc3RlbnQgbGVhZGluZyB3aGl0ZXNwYWNlOiAnaW5kZW50YXRpb24nCgpJZiB0aGUgZG9jc3RyaW5nIGNvbnRhaW5zIGluY29uc2lzdGVudCBsZWFkaW5nIHdoaXRlc3BhY2Ugb24KY29udGludWF0aW9uIGxpbmVzLCB0aGVuIGBEb2NUZXN0YCB3aWxsIHJhaXNlIGEgVmFsdWVFcnJvcjoKCiAgICA+Pj4gZG9jc3RyaW5nID0gcicnJwogICAgLi4uICAgICAgID4+PiBwcmludCAoJ2JhZCBpbmRlbnRhdGlvbicsCiAgICAuLi4gICAgIC4uLiAgICAgICAgICAyKQogICAgLi4uICAgICAgICgnYmFkJywgJ2luZGVudGF0aW9uJykKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLCAnZmlsZW5hbWUnLCAwKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgVmFsdWVFcnJvcjogbGluZSAyIG9mIHRoZSBkb2NzdHJpbmcgZm9yIHNvbWVfdGVzdCBoYXMgaW5jb25zaXN0ZW50IGxlYWRpbmcgd2hpdGVzcGFjZTogJy4uLiAgICAgICAgICAyKScKCklmIHRoZXJlJ3Mgbm8gYmxhbmsgc3BhY2UgYWZ0ZXIgYSBQUzEgcHJvbXB0ICgnPj4+JyksIHRoZW4gYERvY1Rlc3RgCndpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgoKICAgID4+PiBkb2NzdHJpbmcgPSAnPj4+cHJpbnQgMVxuMScKICAgID4+PiBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsICdmaWxlbmFtZScsIDApCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICBWYWx1ZUVycm9yOiBsaW5lIDEgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGxhY2tzIGJsYW5rIGFmdGVyID4+PjogJz4+PnByaW50IDEnCgpJZiB0aGVyZSdzIG5vIGJsYW5rIHNwYWNlIGFmdGVyIGEgUFMyIHByb21wdCAoJy4uLicpLCB0aGVuIGBEb2NUZXN0YAp3aWxsIHJhaXNlIGEgVmFsdWVFcnJvcjoKCiAgICA+Pj4gZG9jc3RyaW5nID0gJz4+PiBpZiAxOlxuLi4ucHJpbnQgMVxuMScKICAgID4+PiBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsICdmaWxlbmFtZScsIDApCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICBWYWx1ZUVycm9yOiBsaW5lIDIgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGxhY2tzIGJsYW5rIGFmdGVyIC4uLjogJy4uLnByaW50IDEnCgpDb21wYXJlIGBEb2NUZXN0YDoKCiAgICA+Pj4gZG9jc3RyaW5nID0gJycnCiAgICAuLi4gICAgID4+PiBwcmludCAxMgogICAgLi4uICAgICAxMgogICAgLi4uICcnJwogICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsCiAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV90ZXN0JywgMjApCiAgICA+Pj4gc2FtZV90ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV90ZXN0JywgMjApCiAgICA+Pj4gdGVzdCA9PSBzYW1lX3Rlc3QKICAgIFRydWUKICAgID4+PiB0ZXN0ICE9IHNhbWVfdGVzdAogICAgRmFsc2UKICAgID4+PiBoYXNoKHRlc3QpID09IGhhc2goc2FtZV90ZXN0KQogICAgVHJ1ZQogICAgPj4+IGRvY3N0cmluZyA9ICcnJwogICAgLi4uICAgICA+Pj4gcHJpbnQgNDIKICAgIC4uLiAgICAgNDIKICAgIC4uLiAnJycKICAgID4+PiBvdGhlcl90ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdvdGhlcl90ZXN0JywKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcl9maWxlJywgMTApCiAgICA+Pj4gdGVzdCA9PSBvdGhlcl90ZXN0CiAgICBGYWxzZQogICAgPj4+IHRlc3QgIT0gb3RoZXJfdGVzdAogICAgVHJ1ZQoKQ29tcGFyZSBgRG9jVGVzdENhc2VgOgoKICAgID4+PiBEb2NUZXN0Q2FzZSA9IGRvY3Rlc3QuRG9jVGVzdENhc2UKICAgID4+PiB0ZXN0X2Nhc2UgPSBEb2NUZXN0Q2FzZSh0ZXN0KQogICAgPj4+IHNhbWVfdGVzdF9jYXNlID0gRG9jVGVzdENhc2Uoc2FtZV90ZXN0KQogICAgPj4+IG90aGVyX3Rlc3RfY2FzZSA9IERvY1Rlc3RDYXNlKG90aGVyX3Rlc3QpCiAgICA+Pj4gdGVzdF9jYXNlID09IHNhbWVfdGVzdF9jYXNlCiAgICBUcnVlCiAgICA+Pj4gdGVzdF9jYXNlICE9IHNhbWVfdGVzdF9jYXNlCiAgICBGYWxzZQogICAgPj4+IGhhc2godGVzdF9jYXNlKSA9PSBoYXNoKHNhbWVfdGVzdF9jYXNlKQogICAgVHJ1ZQogICAgPj4+IHRlc3QgPT0gb3RoZXJfdGVzdF9jYXNlCiAgICBGYWxzZQogICAgPj4+IHRlc3QgIT0gb3RoZXJfdGVzdF9jYXNlCiAgICBUcnVlCgpOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0DAAAAHRlc3RfRG9jVGVzdBYBAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzIx0AAApVbml0IHRlc3RzIGZvciB0aGUgYERvY1Rlc3RGaW5kZXJgIGNsYXNzLgoKRG9jVGVzdEZpbmRlciBpcyB1c2VkIHRvIGV4dHJhY3QgRG9jVGVzdHMgZnJvbSBhbiBvYmplY3QncyBkb2NzdHJpbmcKYW5kIHRoZSBkb2NzdHJpbmdzIG9mIGl0cyBjb250YWluZWQgb2JqZWN0cy4gIEl0IGNhbiBiZSB1c2VkIHdpdGgKbW9kdWxlcywgZnVuY3Rpb25zLCBjbGFzc2VzLCBtZXRob2RzLCBzdGF0aWNtZXRob2RzLCBjbGFzc21ldGhvZHMsIGFuZApwcm9wZXJ0aWVzLgoKRmluZGluZyBUZXN0cyBpbiBGdW5jdGlvbnMKfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KRm9yIGEgZnVuY3Rpb24gd2hvc2UgZG9jc3RyaW5nIGNvbnRhaW5zIGV4YW1wbGVzLCBEb2NUZXN0RmluZGVyLmZpbmQoKQp3aWxsIHJldHVybiBhIHNpbmdsZSB0ZXN0IChmb3IgdGhhdCBmdW5jdGlvbidzIGRvY3N0cmluZyk6CgogICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpCgpXZSdsbCBzaW11bGF0ZSBhIF9fZmlsZV9fIGF0dHIgdGhhdCBlbmRzIGluIHB5YzoKCiAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CiAgICA+Pj4gb2xkID0gdGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18KICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5fX2ZpbGVfXyA9ICd0ZXN0X2RvY3Rlc3QucHljJwoKICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKHNhbXBsZV9mdW5jKQoKICAgID4+PiBwcmludCB0ZXN0cyAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIFs8RG9jVGVzdCBzYW1wbGVfZnVuYyBmcm9tIC4uLjoxNyAoMSBleGFtcGxlKT5dCgpUaGUgZXhhY3QgbmFtZSBkZXBlbmRzIG9uIGhvdyB0ZXN0X2RvY3Rlc3Qgd2FzIGludm9rZWQsIHNvIGFsbG93IGZvcgpsZWFkaW5nIHBhdGggY29tcG9uZW50cy4KCiAgICA+Pj4gdGVzdHNbMF0uZmlsZW5hbWUgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICcuLi50ZXN0X2RvY3Rlc3QucHknCgogICAgPj4+IHRlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fID0gb2xkCgoKICAgID4+PiBlID0gdGVzdHNbMF0uZXhhbXBsZXNbMF0KICAgID4+PiAoZS5zb3VyY2UsIGUud2FudCwgZS5saW5lbm8pCiAgICAoJ3ByaW50IHNhbXBsZV9mdW5jKDIyKVxuJywgJzQ0XG4nLCAzKQoKQnkgZGVmYXVsdCwgdGVzdHMgYXJlIGNyZWF0ZWQgZm9yIG9iamVjdHMgd2l0aCBubyBkb2NzdHJpbmc6CgogICAgPj4+IGRlZiBub19kb2NzdHJpbmcodik6CiAgICAuLi4gICAgIHBhc3MKICAgID4+PiBmaW5kZXIuZmluZChub19kb2NzdHJpbmcpCiAgICBbXQoKSG93ZXZlciwgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBleGNsdWRlX2VtcHR5YCB0byB0aGUgRG9jVGVzdEZpbmRlcgpjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBleGNsdWRlIHRlc3RzIGZvciBvYmplY3RzIHdpdGggZW1wdHkKZG9jc3RyaW5nczoKCiAgICA+Pj4gZGVmIG5vX2RvY3N0cmluZyh2KToKICAgIC4uLiAgICAgcGFzcwogICAgPj4+IGV4Y2xfZW1wdHlfZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKGV4Y2x1ZGVfZW1wdHk9VHJ1ZSkKICAgID4+PiBleGNsX2VtcHR5X2ZpbmRlci5maW5kKG5vX2RvY3N0cmluZykKICAgIFtdCgpJZiB0aGUgZnVuY3Rpb24gaGFzIGEgZG9jc3RyaW5nIHdpdGggbm8gZXhhbXBsZXMsIHRoZW4gYSB0ZXN0IHdpdGggbm8KZXhhbXBsZXMgaXMgcmV0dXJuZWQuICAoVGhpcyBsZXRzIGBEb2NUZXN0UnVubmVyYCBjb2xsZWN0IHN0YXRpc3RpY3MKYWJvdXQgd2hpY2ggZnVuY3Rpb25zIGhhdmUgbm8gdGVzdHMgLS0gYnV0IGlzIHRoYXQgdXNlZnVsPyAgQW5kIHNob3VsZAphbiBlbXB0eSB0ZXN0IGFsc28gYmUgY3JlYXRlZCB3aGVuIHRoZXJlJ3Mgbm8gZG9jc3RyaW5nPykKCiAgICA+Pj4gZGVmIG5vX2V4YW1wbGVzKHYpOgogICAgLi4uICAgICAnJycgbm8gZG9jdGVzdCBleGFtcGxlcyAnJycKICAgID4+PiBmaW5kZXIuZmluZChub19leGFtcGxlcykgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIFs8RG9jVGVzdCBub19leGFtcGxlcyBmcm9tIC4uLjoxIChubyBleGFtcGxlcyk+XQoKRmluZGluZyBUZXN0cyBpbiBDbGFzc2VzCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpGb3IgYSBjbGFzcywgRG9jVGVzdEZpbmRlciB3aWxsIGNyZWF0ZSBhIHRlc3QgZm9yIHRoZSBjbGFzcydzCmRvY3N0cmluZywgYW5kIHdpbGwgcmVjdXJzaXZlbHkgZXhwbG9yZSBpdHMgY29udGVudHMsIGluY2x1ZGluZwptZXRob2RzLCBjbGFzc21ldGhvZHMsIHN0YXRpY21ldGhvZHMsIHByb3BlcnRpZXMsIGFuZCBuZXN0ZWQgY2xhc3Nlcy4KCiAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkKICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKFNhbXBsZUNsYXNzKQogICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCiAgICAgMyAgU2FtcGxlQ2xhc3MKICAgICAzICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcwogICAgIDEgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLl9faW5pdF9fCiAgICAgMSAgU2FtcGxlQ2xhc3MuX19pbml0X18KICAgICAyICBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kCiAgICAgMSAgU2FtcGxlQ2xhc3MuYV9wcm9wZXJ0eQogICAgIDEgIFNhbXBsZUNsYXNzLmFfc3RhdGljbWV0aG9kCiAgICAgMSAgU2FtcGxlQ2xhc3MuZG91YmxlCiAgICAgMSAgU2FtcGxlQ2xhc3MuZ2V0CgpOZXctc3R5bGUgY2xhc3NlcyBhcmUgYWxzbyBzdXBwb3J0ZWQ6CgogICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlTmV3U3R5bGVDbGFzcykKICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgIDEgIFNhbXBsZU5ld1N0eWxlQ2xhc3MKICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzLl9faW5pdF9fCiAgICAgMSAgU2FtcGxlTmV3U3R5bGVDbGFzcy5kb3VibGUKICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzLmdldAoKRmluZGluZyBUZXN0cyBpbiBNb2R1bGVzCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpGb3IgYSBtb2R1bGUsIERvY1Rlc3RGaW5kZXIgd2lsbCBjcmVhdGUgYSB0ZXN0IGZvciB0aGUgY2xhc3Mncwpkb2NzdHJpbmcsIGFuZCB3aWxsIHJlY3Vyc2l2ZWx5IGV4cGxvcmUgaXRzIGNvbnRlbnRzLCBpbmNsdWRpbmcKZnVuY3Rpb25zLCBjbGFzc2VzLCBhbmQgdGhlIGBfX3Rlc3RfX2AgZGljdGlvbmFyeSwgaWYgaXQgZXhpc3RzOgoKICAgID4+PiAjIEEgbW9kdWxlCiAgICA+Pj4gaW1wb3J0IHR5cGVzCiAgICA+Pj4gbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ3NvbWVfbW9kdWxlJykKICAgID4+PiBkZWYgdHJpcGxlKHZhbCk6CiAgICAuLi4gICAgICcnJwogICAgLi4uICAgICA+Pj4gcHJpbnQgdHJpcGxlKDExKQogICAgLi4uICAgICAzMwogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgcmV0dXJuIHZhbCozCiAgICA+Pj4gbS5fX2RpY3RfXy51cGRhdGUoewogICAgLi4uICAgICAnc2FtcGxlX2Z1bmMnOiBzYW1wbGVfZnVuYywKICAgIC4uLiAgICAgJ1NhbXBsZUNsYXNzJzogU2FtcGxlQ2xhc3MsCiAgICAuLi4gICAgICdfX2RvY19fJzogJycnCiAgICAuLi4gICAgICAgICBNb2R1bGUgZG9jc3RyaW5nLgogICAgLi4uICAgICAgICAgICAgID4+PiBwcmludCAnbW9kdWxlJwogICAgLi4uICAgICAgICAgICAgIG1vZHVsZQogICAgLi4uICAgICAgICAgJycnLAogICAgLi4uICAgICAnX190ZXN0X18nOiB7CiAgICAuLi4gICAgICAgICAnZCc6ICc+Pj4gcHJpbnQgNlxuNlxuPj4+IHByaW50IDdcbjdcbicsCiAgICAuLi4gICAgICAgICAnYyc6IHRyaXBsZX19KQoKICAgID4+PiBmaW5kZXIgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKQogICAgPj4+ICMgVXNlIG1vZHVsZT10ZXN0LnRlc3RfZG9jdGVzdCwgdG8gcHJldmVudCBkb2N0ZXN0IGZyb20KICAgID4+PiAjIGlnbm9yaW5nIHRoZSBvYmplY3RzIHNpbmNlIHRoZXkgd2VyZW4ndCBkZWZpbmVkIGluIG0uCiAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CiAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChtLCBtb2R1bGU9dGVzdC50ZXN0X2RvY3Rlc3QpCiAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CiAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAxICBzb21lX21vZHVsZQogICAgIDMgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzCiAgICAgMyAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXwogICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLl9faW5pdF9fCiAgICAgMiAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZAogICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmFfcHJvcGVydHkKICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAogICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmRvdWJsZQogICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmdldAogICAgIDEgIHNvbWVfbW9kdWxlLl9fdGVzdF9fLmMKICAgICAyICBzb21lX21vZHVsZS5fX3Rlc3RfXy5kCiAgICAgMSAgc29tZV9tb2R1bGUuc2FtcGxlX2Z1bmMKCkR1cGxpY2F0ZSBSZW1vdmFsCn5+fn5+fn5+fn5+fn5+fn5+CklmIGEgc2luZ2xlIG9iamVjdCBpcyBsaXN0ZWQgdHdpY2UgKHVuZGVyIGRpZmZlcmVudCBuYW1lcyksIHRoZW4gdGVzdHMKd2lsbCBvbmx5IGJlIGdlbmVyYXRlZCBmb3IgaXQgb25jZToKCiAgICA+Pj4gZnJvbSB0ZXN0IGltcG9ydCBkb2N0ZXN0X2FsaWFzZXMKICAgID4+PiBhc3NlcnQgZG9jdGVzdF9hbGlhc2VzLlR3b05hbWVzLmYKICAgID4+PiBhc3NlcnQgZG9jdGVzdF9hbGlhc2VzLlR3b05hbWVzLmcKICAgID4+PiB0ZXN0cyA9IGV4Y2xfZW1wdHlfZmluZGVyLmZpbmQoZG9jdGVzdF9hbGlhc2VzKQogICAgPj4+IHByaW50IGxlbih0ZXN0cykKICAgIDIKICAgID4+PiBwcmludCB0ZXN0c1swXS5uYW1lCiAgICB0ZXN0LmRvY3Rlc3RfYWxpYXNlcy5Ud29OYW1lcwoKICAgIFR3b05hbWVzLmYgYW5kIFR3b05hbWVzLmcgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdC4KICAgIFdlIGNhbid0IGd1ZXNzIHdoaWNoIHdpbGwgYmUgZm91bmQgaW4gZG9jdGVzdCdzIHRyYXZlcnNhbCBvZgogICAgVHdvTmFtZXMuX19kaWN0X18gZmlyc3QsIHNvIHdlIGhhdmUgdG8gYWxsb3cgZm9yIGVpdGhlci4KCiAgICA+Pj4gdGVzdHNbMV0ubmFtZS5zcGxpdCgnLicpWy0xXSBpbiBbJ2YnLCAnZyddCiAgICBUcnVlCgpFbXB0eSBUZXN0cwp+fn5+fn5+fn5+fgpCeSBkZWZhdWx0LCBhbiBvYmplY3Qgd2l0aCBubyBkb2N0ZXN0cyBkb2Vzbid0IGNyZWF0ZSBhbnkgdGVzdHM6CgogICAgPj4+IHRlc3RzID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChTYW1wbGVDbGFzcykKICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgIDMgIFNhbXBsZUNsYXNzCiAgICAgMyAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKICAgICAxICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXwogICAgIDEgIFNhbXBsZUNsYXNzLl9faW5pdF9fCiAgICAgMiAgU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZAogICAgIDEgIFNhbXBsZUNsYXNzLmFfcHJvcGVydHkKICAgICAxICBTYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAogICAgIDEgIFNhbXBsZUNsYXNzLmRvdWJsZQogICAgIDEgIFNhbXBsZUNsYXNzLmdldAoKQnkgZGVmYXVsdCwgdGhhdCBleGNsdWRlZCBvYmplY3RzIHdpdGggbm8gZG9jdGVzdHMuICBleGNsdWRlX2VtcHR5PUZhbHNlCnRlbGxzIGl0IHRvIGluY2x1ZGUgKGVtcHR5KSB0ZXN0cyBmb3Igb2JqZWN0cyB3aXRoIG5vIGRvY3Rlc3RzLiAgVGhpcyBmZWF0dXJlCmlzIHJlYWxseSB0byBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaW4gd2hhdCBkb2N0ZXN0Lm1hc3Rlci5zdW1tYXJpemUoKQpkaXNwbGF5cy4KCiAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1GYWxzZSkuZmluZChTYW1wbGVDbGFzcykKICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgIDMgIFNhbXBsZUNsYXNzCiAgICAgMyAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKICAgICAxICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXwogICAgIDAgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLmdldAogICAgIDAgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLnNxdWFyZQogICAgIDEgIFNhbXBsZUNsYXNzLl9faW5pdF9fCiAgICAgMiAgU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZAogICAgIDEgIFNhbXBsZUNsYXNzLmFfcHJvcGVydHkKICAgICAxICBTYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAogICAgIDEgIFNhbXBsZUNsYXNzLmRvdWJsZQogICAgIDEgIFNhbXBsZUNsYXNzLmdldAoKVHVybmluZyBvZmYgUmVjdXJzaW9uCn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpEb2NUZXN0RmluZGVyIGNhbiBiZSB0b2xkIG5vdCB0byBsb29rIGZvciB0ZXN0cyBpbiBjb250YWluZWQgb2JqZWN0cwp1c2luZyB0aGUgYHJlY3Vyc2VgIGZsYWc6CgogICAgPj4+IHRlc3RzID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKHJlY3Vyc2U9RmFsc2UpLmZpbmQoU2FtcGxlQ2xhc3MpCiAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CiAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAzICBTYW1wbGVDbGFzcwoKTGluZSBudW1iZXJzCn5+fn5+fn5+fn5+fgpEb2NUZXN0RmluZGVyIGZpbmRzIHRoZSBsaW5lIG51bWJlciBvZiBlYWNoIGV4YW1wbGU6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgLi4uCiAgICAuLi4gICAgIHNvbWUgdGV4dAogICAgLi4uCiAgICAuLi4gICAgID4+PiAjIGV4YW1wbGVzIGFyZSBub3QgY3JlYXRlZCBmb3IgY29tbWVudHMgJiBiYXJlIHByb21wdHMuCiAgICAuLi4gICAgID4+PgogICAgLi4uICAgICAuLi4KICAgIC4uLgogICAgLi4uICAgICA+Pj4gZm9yIHggaW4gcmFuZ2UoMTApOgogICAgLi4uICAgICAuLi4gICAgIHByaW50IHgsCiAgICAuLi4gICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkKICAgIC4uLiAgICAgPj4+IHgvLzIKICAgIC4uLiAgICAgNgogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IFtlLmxpbmVubyBmb3IgZSBpbiB0ZXN0LmV4YW1wbGVzXQogICAgWzEsIDksIDEyXQpOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0EgAAAHRlc3RfRG9jVGVzdEZpbmRlcpsBAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzpQYAAApVbml0IHRlc3RzIGZvciB0aGUgYERvY1Rlc3RQYXJzZXJgIGNsYXNzLgoKRG9jVGVzdFBhcnNlciBpcyB1c2VkIHRvIHBhcnNlIGRvY3N0cmluZ3MgY29udGFpbmluZyBkb2N0ZXN0IGV4YW1wbGVzLgoKVGhlIGBwYXJzZWAgbWV0aG9kIGRpdmlkZXMgYSBkb2NzdHJpbmcgaW50byBleGFtcGxlcyBhbmQgaW50ZXJ2ZW5pbmcKdGV4dDoKCiAgICA+Pj4gcyA9ICcnJwogICAgLi4uICAgICA+Pj4geCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkCiAgICAuLi4gICAgID4+PiBpZiAxOgogICAgLi4uICAgICAuLi4gICAgIHByaW50IHgKICAgIC4uLiAgICAgLi4uICAgICBwcmludCB5CiAgICAuLi4gICAgIDIKICAgIC4uLiAgICAgMwogICAgLi4uCiAgICAuLi4gICAgIFNvbWUgdGV4dC4KICAgIC4uLiAgICAgPj4+IHgreQogICAgLi4uICAgICA1CiAgICAuLi4gICAgICcnJwogICAgPj4+IHBhcnNlciA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpCiAgICA+Pj4gZm9yIHBpZWNlIGluIHBhcnNlci5wYXJzZShzKToKICAgIC4uLiAgICAgaWYgaXNpbnN0YW5jZShwaWVjZSwgZG9jdGVzdC5FeGFtcGxlKToKICAgIC4uLiAgICAgICAgIHByaW50ICdFeGFtcGxlOicsIChwaWVjZS5zb3VyY2UsIHBpZWNlLndhbnQsIHBpZWNlLmxpbmVubykKICAgIC4uLiAgICAgZWxzZToKICAgIC4uLiAgICAgICAgIHByaW50ICcgICBUZXh0OicsIGBwaWVjZWAKICAgICAgIFRleHQ6ICdcbicKICAgIEV4YW1wbGU6ICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKICAgICAgIFRleHQ6ICcnCiAgICBFeGFtcGxlOiAoJ2lmIDE6XG4gICAgcHJpbnQgeFxuICAgIHByaW50IHlcbicsICcyXG4zXG4nLCAyKQogICAgICAgVGV4dDogJ1xuU29tZSB0ZXh0LlxuJwogICAgRXhhbXBsZTogKCd4K3lcbicsICc1XG4nLCA5KQogICAgICAgVGV4dDogJycKClRoZSBgZ2V0X2V4YW1wbGVzYCBtZXRob2QgcmV0dXJucyBqdXN0IHRoZSBleGFtcGxlczoKCiAgICA+Pj4gZm9yIHBpZWNlIGluIHBhcnNlci5nZXRfZXhhbXBsZXMocyk6CiAgICAuLi4gICAgIHByaW50IChwaWVjZS5zb3VyY2UsIHBpZWNlLndhbnQsIHBpZWNlLmxpbmVubykKICAgICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKICAgICgnaWYgMTpcbiAgICBwcmludCB4XG4gICAgcHJpbnQgeVxuJywgJzJcbjNcbicsIDIpCiAgICAoJ3greVxuJywgJzVcbicsIDkpCgpUaGUgYGdldF9kb2N0ZXN0YCBtZXRob2QgY3JlYXRlcyBhIFRlc3QgZnJvbSB0aGUgZXhhbXBsZXMsIGFsb25nIHdpdGggdGhlCmdpdmVuIGFyZ3VtZW50czoKCiAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChzLCB7fSwgJ25hbWUnLCAnZmlsZW5hbWUnLCBsaW5lbm89NSkKICAgID4+PiAodGVzdC5uYW1lLCB0ZXN0LmZpbGVuYW1lLCB0ZXN0LmxpbmVubykKICAgICgnbmFtZScsICdmaWxlbmFtZScsIDUpCiAgICA+Pj4gZm9yIHBpZWNlIGluIHRlc3QuZXhhbXBsZXM6CiAgICAuLi4gICAgIHByaW50IChwaWVjZS5zb3VyY2UsIHBpZWNlLndhbnQsIHBpZWNlLmxpbmVubykKICAgICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKICAgICgnaWYgMTpcbiAgICBwcmludCB4XG4gICAgcHJpbnQgeVxuJywgJzJcbjNcbicsIDIpCiAgICAoJ3greVxuJywgJzVcbicsIDkpCk4oAAAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weXQSAAAAdGVzdF9Eb2NUZXN0UGFyc2VyiAIAAHMAAAAAdBIAAAB0ZXN0X0RvY1Rlc3RSdW5uZXJjAAAAAAAAAAABAAAAQgAAAHNHAAAAZQAAWgEAZAAAhAAAWgIAZAEAhAAAWgMAZAIAhAAAWgQAZAMAhAAAWgUAZAQAhAAAWgYAZAUAhAAAWgcAZAYAhAAAWggAUlMoBwAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzvgUAAApVbml0IHRlc3RzIGZvciB0aGUgYERvY1Rlc3RSdW5uZXJgIGNsYXNzLgoKRG9jVGVzdFJ1bm5lciBpcyB1c2VkIHRvIHJ1biBEb2NUZXN0IHRlc3QgY2FzZXMsIGFuZCB0byBhY2N1bXVsYXRlCnN0YXRpc3RpY3MuICBIZXJlJ3MgYSBzaW1wbGUgRG9jVGVzdCBjYXNlIHdlIGNhbiB1c2U6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgLi4uICAgICAxMgogICAgLi4uICAgICA+Pj4geC8vMgogICAgLi4uICAgICA2CiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCgpUaGUgbWFpbiBEb2NUZXN0UnVubmVyIGludGVyZmFjZSBpcyB0aGUgYHJ1bmAgbWV0aG9kLCB3aGljaCBydW5zIGEKZ2l2ZW4gRG9jVGVzdCBjYXNlIGluIGEgZ2l2ZW4gbmFtZXNwYWNlIChnbG9icykuICBJdCByZXR1cm5zIGEgdHVwbGUKYChmLHQpYCwgd2hlcmUgYGZgIGlzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGFuZCBgdGAgaXMgdGhlIG51bWJlcgpvZiB0cmllZCB0ZXN0cy4KCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQoKSWYgYW55IGV4YW1wbGUgcHJvZHVjZXMgaW5jb3JyZWN0IG91dHB1dCwgdGhlbiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cwp0aGUgZmFpbHVyZSBhbmQgcHJvY2VlZHMgdG8gdGhlIG5leHQgZXhhbXBsZToKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgICcnJwogICAgLi4uICAgICA+Pj4geCA9IDEyCiAgICAuLi4gICAgID4+PiBwcmludCB4CiAgICAuLi4gICAgIDE0CiAgICAuLi4gICAgID4+PiB4Ly8yCiAgICAuLi4gICAgIDYKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1UcnVlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgVHJ5aW5nOgogICAgICAgIHggPSAxMgogICAgRXhwZWN0aW5nIG5vdGhpbmcKICAgIG9rCiAgICBUcnlpbmc6CiAgICAgICAgcHJpbnQgeAogICAgRXhwZWN0aW5nOgogICAgICAgIDE0CiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSA0LCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBwcmludCB4CiAgICBFeHBlY3RlZDoKICAgICAgICAxNAogICAgR290OgogICAgICAgIDEyCiAgICBUcnlpbmc6CiAgICAgICAgeC8vMgogICAgRXhwZWN0aW5nOgogICAgICAgIDYKICAgIG9rCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTMpCk4oAAAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weXQGAAAAYmFzaWNzwAIAAHMAAAAAYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHOZBQAAClRoZSBgdmVyYm9zZWAgZmxhZyBtYWtlcyB0aGUgdGVzdCBydW5uZXIgZ2VuZXJhdGUgbW9yZSBkZXRhaWxlZApvdXRwdXQ6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgLi4uICAgICAxMgogICAgLi4uICAgICA+Pj4geC8vMgogICAgLi4uICAgICA2CiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCgogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPVRydWUpLnJ1bih0ZXN0KQogICAgVHJ5aW5nOgogICAgICAgIHggPSAxMgogICAgRXhwZWN0aW5nIG5vdGhpbmcKICAgIG9rCiAgICBUcnlpbmc6CiAgICAgICAgcHJpbnQgeAogICAgRXhwZWN0aW5nOgogICAgICAgIDEyCiAgICBvawogICAgVHJ5aW5nOgogICAgICAgIHgvLzIKICAgIEV4cGVjdGluZzoKICAgICAgICA2CiAgICBvawogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQoKSWYgdGhlIGB2ZXJib3NlYCBmbGFnIGlzIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSB2ZXJib3NlCmlmZiBgLXZgIGFwcGVhcnMgaW4gc3lzLmFyZ3Y6CgogICAgPj4+ICMgU2F2ZSB0aGUgcmVhbCBzeXMuYXJndiBsaXN0LgogICAgPj4+IG9sZF9hcmd2ID0gc3lzLmFyZ3YKCiAgICA+Pj4gIyBJZiAtdiBkb2VzIG5vdCBhcHBlYXIgaW4gc3lzLmFyZ3YsIHRoZW4gb3V0cHV0IGlzbid0IHZlcmJvc2UuCiAgICA+Pj4gc3lzLmFyZ3YgPSBbJ3Rlc3QnXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcigpLnJ1bih0ZXN0KQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQoKICAgID4+PiAjIElmIC12IGRvZXMgYXBwZWFyIGluIHN5cy5hcmd2LCB0aGVuIG91dHB1dCBpcyB2ZXJib3NlLgogICAgPj4+IHN5cy5hcmd2ID0gWyd0ZXN0JywgJy12J10KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIoKS5ydW4odGVzdCkKICAgIFRyeWluZzoKICAgICAgICB4ID0gMTIKICAgIEV4cGVjdGluZyBub3RoaW5nCiAgICBvawogICAgVHJ5aW5nOgogICAgICAgIHByaW50IHgKICAgIEV4cGVjdGluZzoKICAgICAgICAxMgogICAgb2sKICAgIFRyeWluZzoKICAgICAgICB4Ly8yCiAgICBFeHBlY3Rpbmc6CiAgICAgICAgNgogICAgb2sKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MykKCiAgICA+Pj4gIyBSZXN0b3JlIHN5cy5hcmd2CiAgICA+Pj4gc3lzLmFyZ3YgPSBvbGRfYXJndgoKSW4gdGhlIHJlbWFpbmluZyBleGFtcGxlcywgdGhlIHRlc3QgcnVubmVyJ3MgdmVyYm9zaXR5IHdpbGwgYmUKZXhwbGljaXRseSBzZXQsIHRvIGVuc3VyZSB0aGF0IHRoZSB0ZXN0IGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQuCiAgICBOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0DAAAAHZlcmJvc2VfZmxhZ/0CAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzcRwAAApUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBleGNlcHRpb24gaGFuZGxpbmcuCgpBbiBleHBlY3RlZCBleGNlcHRpb24gaXMgc3BlY2lmaWVkIHdpdGggYSB0cmFjZWJhY2sgbWVzc2FnZS4gIFRoZQpsaW5lcyBiZXR3ZWVuIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgdHlwZS92YWx1ZSBtYXkgYmUgb21pdHRlZCBvcgpyZXBsYWNlZCB3aXRoIGFueSBvdGhlciBzdHJpbmc6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgLi4uICAgICA+Pj4gcHJpbnQgeC8vMAogICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4gICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQoKQW4gZXhhbXBsZSBtYXkgbm90IGdlbmVyYXRlIG91dHB1dCBiZWZvcmUgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbjsgaWYKaXQgZG9lcywgdGhlbiB0aGUgdHJhY2ViYWNrIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcwpzaWduYWxpbmcgYW4gZXhwZWN0ZWQgZXhjZXB0aW9uLCBzbyB0aGUgZXhhbXBsZSB3aWxsIGJlIHJlcG9ydGVkIGFzIGFuCnVuZXhwZWN0ZWQgZXhjZXB0aW9uOgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgJycnCiAgICAuLi4gICAgID4+PiB4ID0gMTIKICAgIC4uLiAgICAgPj4+IHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvLzAKICAgIC4uLiAgICAgcHJlLWV4Y2VwdGlvbiBvdXRwdXQKICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgJ3ByZS1leGNlcHRpb24gb3V0cHV0JywgeC8vMAogICAgRXhjZXB0aW9uIHJhaXNlZDoKICAgICAgICAuLi4KICAgICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQoKRXhjZXB0aW9uIG1lc3NhZ2VzIG1heSBjb250YWluIG5ld2xpbmVzOgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgcicnJwogICAgLi4uICAgICA+Pj4gcmFpc2UgVmFsdWVFcnJvciwgJ211bHRpXG5saW5lXG5tZXNzYWdlJwogICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4gICAgIFZhbHVlRXJyb3I6IG11bHRpCiAgICAuLi4gICAgIGxpbmUKICAgIC4uLiAgICAgbWVzc2FnZQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKCklmIGFuIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCwgYnV0IGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSB3cm9uZyB0eXBlIG9yCm1lc3NhZ2UgaXMgcmFpc2VkLCB0aGVuIGl0IGlzIHJlcG9ydGVkIGFzIGEgZmFpbHVyZToKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJwogICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4gICAgIFZhbHVlRXJyb3I6IHdyb25nIG1lc3NhZ2UKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJwogICAgRXhwZWN0ZWQ6CiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIFZhbHVlRXJyb3I6IHdyb25nIG1lc3NhZ2UKICAgIEdvdDoKICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgLi4uCiAgICAgICAgVmFsdWVFcnJvcjogbWVzc2FnZQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQoKSG93ZXZlciwgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgY2FuIGJlIHVzZWQgdG8gYWxsb3cgYSBtaXNtYXRjaCBpbiB0aGUKZGV0YWlsOgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgcicnJwogICAgLi4uICAgICA+Pj4gcmFpc2UgVmFsdWVFcnJvciwgJ21lc3NhZ2UnICNkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgLi4uICAgICBWYWx1ZUVycm9yOiB3cm9uZyBtZXNzYWdlCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQoKSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgYWxzbyBpZ25vcmVzIGRpZmZlcmVuY2UgaW4gZXhjZXB0aW9uIGZvcm1hdHRpbmcKYmV0d2VlbiBQeXRob24gdmVyc2lvbnMuIEZvciBleGFtcGxlLCBpbiBQeXRob24gMy54LCB0aGUgbW9kdWxlIHBhdGggb2YKdGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgb3V0cHV0LCBidXQgdGhpcyB3aWxsIGZhaWwgdW5kZXIgUHl0aG9uIDI6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICByJycnCiAgICAuLi4gICAgID4+PiBmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KICAgIC4uLiAgICAgPj4+IHJhaXNlIEhUVFBFeGNlcHRpb24oJ21lc3NhZ2UnKQogICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4gICAgIGh0dHBsaWIuSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpCiAgICBFeHBlY3RlZDoKICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgaHR0cGxpYi5IVFRQRXhjZXB0aW9uOiBtZXNzYWdlCiAgICBHb3Q6CiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIC4uLgogICAgICAgIEhUVFBFeGNlcHRpb246IG1lc3NhZ2UKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKCkJ1dCBpbiBQeXRob24gMiB0aGUgbW9kdWxlIHBhdGggaXMgbm90IGluY2x1ZGVkLCBhbiB0aGVyZWZvcmUgYSB0ZXN0IG11c3QgbG9vawpsaWtlIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBzdWNjZWVkIGluIFB5dGhvbiAyLiBCdXQgdGhhdCB0ZXN0IHdpbGwgZmFpbCB1bmRlcgpQeXRob24gMy4KCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IGZyb20gaHR0cGxpYiBpbXBvcnQgSFRUUEV4Y2VwdGlvbgogICAgLi4uICAgICA+Pj4gcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpCiAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgIC4uLiAgICAgSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKCkhvd2V2ZXIsIHdpdGggSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwsIHRoZSBtb2R1bGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uCihpZiBhbnkpIHdpbGwgYmUgaWdub3JlZDoKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IGZyb20gaHR0cGxpYiBpbXBvcnQgSFRUUEV4Y2VwdGlvbgogICAgLi4uICAgICA+Pj4gcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpICNkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgLi4uICAgICBIVFRQRXhjZXB0aW9uOiBtZXNzYWdlCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQoKVGhlIG1vZHVsZSBwYXRoIHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkLCBzbyB0d28gZGlmZmVyZW50IG1vZHVsZSBwYXRocyB3aWxsCnN0aWxsIHBhc3MgaWYgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgaXMgZ2l2ZW4uIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNvIGl0IGNhbgpiZSB1c2VkIHdoZW4gZXhjZXB0aW9ucyBoYXZlIGNoYW5nZWQgbW9kdWxlLgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgcicnJwogICAgLi4uICAgICA+Pj4gZnJvbSBodHRwbGliIGltcG9ydCBIVFRQRXhjZXB0aW9uCiAgICAuLi4gICAgID4+PiByYWlzZSBIVFRQRXhjZXB0aW9uKCdtZXNzYWdlJykgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAogICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4gICAgIGZvby5iYXIuSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKCkJ1dCBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCBkb2VzIG5vdCBhbGxvdyBhIG1pc21hdGNoIGluIHRoZSBleGNlcHRpb24gdHlwZToKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJyAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCiAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgIC4uLiAgICAgVHlwZUVycm9yOiB3cm9uZyB0eXBlCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnbWVzc2FnZScgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAogICAgRXhwZWN0ZWQ6CiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIFR5cGVFcnJvcjogd3JvbmcgdHlwZQogICAgR290OgogICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAuLi4KICAgICAgICBWYWx1ZUVycm9yOiBtZXNzYWdlCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCgpJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGJ1dCBub3QgZXhwZWN0ZWQsIHRoZW4gaXQgaXMgcmVwb3J0ZWQgYXMgYW4KdW5leHBlY3RlZCBleGNlcHRpb246CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICByJycnCiAgICAuLi4gICAgID4+PiAxLy8wCiAgICAuLi4gICAgIDAKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIDEvLzAKICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIC4uLgogICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCk4oAAAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weXQKAAAAZXhjZXB0aW9uc0ADAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABz5AIAAApUZXN0IHRoYXQgY2hhbmdpbmcgc3lzLmRpc3BsYXlob29rIGRvZXNuJ3QgbWF0dGVyIGZvciBkb2N0ZXN0LgoKICAgID4+PiBpbXBvcnQgc3lzCiAgICA+Pj4gb3JpZ19kaXNwbGF5aG9vayA9IHN5cy5kaXNwbGF5aG9vawogICAgPj4+IGRlZiBteV9kaXNwbGF5aG9vayh4KToKICAgIC4uLiAgICAgcHJpbnQoJ2hpIScpCiAgICA+Pj4gc3lzLmRpc3BsYXlob29rID0gbXlfZGlzcGxheWhvb2sKICAgID4+PiBkZWYgZigpOgogICAgLi4uICAgICAnJycKICAgIC4uLiAgICAgPj4+IDMKICAgIC4uLiAgICAgMwogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IHIgPSBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICA+Pj4gcG9zdF9kaXNwbGF5aG9vayA9IHN5cy5kaXNwbGF5aG9vawoKICAgIFdlIG5lZWQgdG8gcmVzdG9yZSBzeXMuZGlzcGxheWhvb2sgbm93LCBzbyB0aGF0IHdlJ2xsIGJlIGFibGUgdG8gdGVzdAogICAgcmVzdWx0cy4KCiAgICA+Pj4gc3lzLmRpc3BsYXlob29rID0gb3JpZ19kaXNwbGF5aG9vawoKICAgIE9rLCBub3cgd2UgY2FuIGNoZWNrIHRoYXQgZXZlcnl0aGluZyBpcyBvay4KCiAgICA+Pj4gcgogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQogICAgPj4+IHBvc3RfZGlzcGxheWhvb2sgaXMgbXlfZGlzcGxheWhvb2sKICAgIFRydWUKTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAsAAABkaXNwbGF5aG9vaxMEAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABz5SsAAApUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBvcHRpb24gZmxhZyBoYW5kbGluZy4KClNldmVyYWwgb3B0aW9uIGZsYWdzIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHRlc3QKcnVubmVyLiAgVGhlc2UgYXJlIGRlZmluZWQgYXMgbW9kdWxlIGNvbnN0YW50cyBpbiBkb2N0ZXN0LCBhbmQgcGFzc2VkCnRvIHRoZSBEb2NUZXN0UnVubmVyIGNvbnN0cnVjdG9yIChtdWx0aXBsZSBjb25zdGFudHMgc2hvdWxkIGJlIE9SZWQKdG9nZXRoZXIpLgoKVGhlIERPTlRfQUNDRVBUX1RSVUVfRk9SXzEgZmxhZyBkaXNhYmxlcyBtYXRjaGVzIGJldHdlZW4gVHJ1ZS9GYWxzZQphbmQgMS8wOgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgJz4+PiBUcnVlXG4xXG4nCgogICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKCiAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LkRPTlRfQUNDRVBUX1RSVUVfRk9SXzEKICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBUcnVlCiAgICBFeHBlY3RlZDoKICAgICAgICAxCiAgICBHb3Q6CiAgICAgICAgVHJ1ZQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQoKVGhlIERPTlRfQUNDRVBUX0JMQU5LTElORSBmbGFnIGRpc2FibGVzIHRoZSBtYXRjaCBiZXR3ZWVuIGJsYW5rIGxpbmVzCmFuZCB0aGUgJzxCTEFOS0xJTkU+JyBtYXJrZXI6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnPj4+IHByaW50ICJhXFxuXFxuYiJcbmFcbjxCTEFOS0xJTkU+XG5iXG4nCgogICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKCiAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LkRPTlRfQUNDRVBUX0JMQU5LTElORQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50ICJhXG5cbmIiCiAgICBFeHBlY3RlZDoKICAgICAgICBhCiAgICAgICAgPEJMQU5LTElORT4KICAgICAgICBiCiAgICBHb3Q6CiAgICAgICAgYQogICAgPEJMQU5LTElORT4KICAgICAgICBiCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCgpUaGUgTk9STUFMSVpFX1dISVRFU1BBQ0UgZmxhZyBjYXVzZXMgYWxsIHNlcXVlbmNlcyBvZiB3aGl0ZXNwYWNlIHRvIGJlCnRyZWF0ZWQgYXMgZXF1YWw6CgogICAgPj4+IGRlZiBmKHgpOgogICAgLi4uICAgICAnPj4+IHByaW50IDEsIDIsIDNcbiAgMSAgIDJcbiAzJwoKICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50IDEsIDIsIDMKICAgIEV4cGVjdGVkOgogICAgICAgICAgMSAgIDIKICAgICAgICAgMwogICAgR290OgogICAgICAgIDEgMiAzCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCgogICAgPj4+ICMgV2l0aCB0aGUgZmxhZzoKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGZsYWdzID0gZG9jdGVzdC5OT1JNQUxJWkVfV0hJVEVTUEFDRQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCgogICAgQW4gZXhhbXBsZSBmcm9tIHRoZSBkb2NzOgogICAgPj4+IHByaW50IHJhbmdlKDIwKSAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCiAgICBbMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksCiAgICAxMCwgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCgpUaGUgRUxMSVBTSVMgZmxhZyBjYXVzZXMgZWxsaXBzaXMgbWFya2VyICgiLi4uIikgaW4gdGhlIGV4cGVjdGVkCm91dHB1dCB0byBtYXRjaCBhbnkgc3Vic3RyaW5nIGluIHRoZSBhY3R1YWwgb3V0cHV0OgoKICAgID4+PiBkZWYgZih4KToKICAgIC4uLiAgICAgJz4+PiBwcmludCByYW5nZSgxNSlcblswLCAxLCAyLCAuLi4sIDE0XVxuJwoKICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50IHJhbmdlKDE1KQogICAgRXhwZWN0ZWQ6CiAgICAgICAgWzAsIDEsIDIsIC4uLiwgMTRdCiAgICBHb3Q6CiAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNF0KICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKCiAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LkVMTElQU0lTCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKCiAgICAuLi4gYWxzbyBtYXRjaGVzIG5vdGhpbmc6CgogICAgPj4+IGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAuLi4gICAgIHByaW50IGkqKjIsICNkb2N0ZXN0OiArRUxMSVBTSVMKICAgIDAgMS4uLjQuLi45IDE2IC4uLiAzNiA0OSA2NCAuLi4gOTgwMQoKICAgIC4uLiBjYW4gYmUgc3VycHJpc2luZzsgZS5nLiwgdGhpcyB0ZXN0IHBhc3NlczoKCiAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMjEpOiAjZG9jdGVzdDogK0VMTElQU0lTCiAgICAuLi4gICAgIHByaW50IGksCiAgICAwIDEgMiAuLi4xLi4uMi4uLjAKCiAgICBFeGFtcGxlcyBmcm9tIHRoZSBkb2NzOgoKICAgID4+PiBwcmludCByYW5nZSgyMCkgIyBkb2N0ZXN0OitFTExJUFNJUwogICAgWzAsIDEsIC4uLiwgMTgsIDE5XQoKICAgID4+PiBwcmludCByYW5nZSgyMCkgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIC4uLiAgICAgICAgICAgICAgICAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgIFswLCAgICAxLCAuLi4sICAgMTgsICAgIDE5XQoKVGhlIFNLSVAgZmxhZyBjYXVzZXMgYW4gZXhhbXBsZSB0byBiZSBza2lwcGVkIGVudGlyZWx5LiAgSS5lLiwgdGhlCmV4YW1wbGUgaXMgbm90IHJ1bi4gIEl0IGNhbiBiZSB1c2VmdWwgaW4gY29udGV4dHMgd2hlcmUgZG9jdGVzdApleGFtcGxlcyBzZXJ2ZSBhcyBib3RoIGRvY3VtZW50YXRpb24gYW5kIHRlc3QgY2FzZXMsIGFuZCBhbiBleGFtcGxlCnNob3VsZCBiZSBpbmNsdWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcywgYnV0IHNob3VsZCBub3QgYmUKY2hlY2tlZCAoZS5nLiwgYmVjYXVzZSBpdHMgb3V0cHV0IGlzIHJhbmRvbSwgb3IgZGVwZW5kcyBvbiByZXNvdXJjZXMKd2hpY2ggd291bGQgYmUgdW5hdmFpbGFibGUuKSAgVGhlIFNLSVAgZmxhZyBjYW4gYWxzbyBiZSB1c2VkIGZvcgonY29tbWVudGluZyBvdXQnIGJyb2tlbiBleGFtcGxlcy4KCiAgICA+Pj4gaW1wb3J0IHVuYXZhaWxhYmxlX3Jlc291cmNlICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICA+Pj4gdW5hdmFpbGFibGVfcmVzb3VyY2UuZG9fc29tZXRoaW5nKCkgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICA+Pj4gdW5hdmFpbGFibGVfcmVzb3VyY2UuYmxvd191cCgpICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgLi4uCiAgICBVbmNoZWNrZWRCbG93VXBFcnJvcjogIE5vYm9keSBjaGVja3MgbWUuCgogICAgPj4+IGltcG9ydCByYW5kb20KICAgID4+PiBwcmludCByYW5kb20ucmFuZG9tKCkgIyBkb2N0ZXN0OiArU0tJUAogICAgMC43MjEyMTY5MjM4ODkKClRoZSBSRVBPUlRfVURJRkYgZmxhZyBjYXVzZXMgZmFpbHVyZXMgdGhhdCBpbnZvbHZlIG11bHRpLWxpbmUgZXhwZWN0ZWQKYW5kIGFjdHVhbCBvdXRwdXRzIHRvIGJlIGRpc3BsYXllZCB1c2luZyBhIHVuaWZpZWQgZGlmZjoKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHByaW50ICdcbicuam9pbignYWJjZGVmZycpCiAgICAuLi4gICAgIGEKICAgIC4uLiAgICAgQgogICAgLi4uICAgICBjCiAgICAuLi4gICAgIGQKICAgIC4uLiAgICAgZgogICAgLi4uICAgICBnCiAgICAuLi4gICAgIGgKICAgIC4uLiAgICAgJycnCgogICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgJ1xuJy5qb2luKCdhYmNkZWZnJykKICAgIEV4cGVjdGVkOgogICAgICAgIGEKICAgICAgICBCCiAgICAgICAgYwogICAgICAgIGQKICAgICAgICBmCiAgICAgICAgZwogICAgICAgIGgKICAgIEdvdDoKICAgICAgICBhCiAgICAgICAgYgogICAgICAgIGMKICAgICAgICBkCiAgICAgICAgZQogICAgICAgIGYKICAgICAgICBnCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCgogICAgPj4+ICMgV2l0aCB0aGUgZmxhZzoKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfVURJRkYKICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBwcmludCAnXG4nLmpvaW4oJ2FiY2RlZmcnKQogICAgRGlmZmVyZW5jZXMgKHVuaWZpZWQgZGlmZiB3aXRoIC1leHBlY3RlZCArYWN0dWFsKToKICAgICAgICBAQCAtMSw3ICsxLDcgQEAKICAgICAgICAgYQogICAgICAgIC1CCiAgICAgICAgK2IKICAgICAgICAgYwogICAgICAgICBkCiAgICAgICAgK2UKICAgICAgICAgZgogICAgICAgICBnCiAgICAgICAgLWgKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKClRoZSBSRVBPUlRfQ0RJRkYgZmxhZyBjYXVzZXMgZmFpbHVyZXMgdGhhdCBpbnZvbHZlIG11bHRpLWxpbmUgZXhwZWN0ZWQKYW5kIGFjdHVhbCBvdXRwdXRzIHRvIGJlIGRpc3BsYXllZCB1c2luZyBhIGNvbnRleHQgZGlmZjoKCiAgICA+Pj4gIyBSZXVzZSBmKCkgZnJvbSB0aGUgUkVQT1JUX1VESUZGIGV4YW1wbGUsIGFib3ZlLgogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LlJFUE9SVF9DRElGRgogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50ICdcbicuam9pbignYWJjZGVmZycpCiAgICBEaWZmZXJlbmNlcyAoY29udGV4dCBkaWZmIHdpdGggZXhwZWN0ZWQgZm9sbG93ZWQgYnkgYWN0dWFsKToKICAgICAgICAqKioqKioqKioqKioqKioKICAgICAgICAqKiogMSw3ICoqKioKICAgICAgICAgIGEKICAgICAgICAhIEIKICAgICAgICAgIGMKICAgICAgICAgIGQKICAgICAgICAgIGYKICAgICAgICAgIGcKICAgICAgICAtIGgKICAgICAgICAtLS0gMSw3IC0tLS0KICAgICAgICAgIGEKICAgICAgICAhIGIKICAgICAgICAgIGMKICAgICAgICAgIGQKICAgICAgICArIGUKICAgICAgICAgIGYKICAgICAgICAgIGcKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKCgpUaGUgUkVQT1JUX05ESUZGIGZsYWcgY2F1c2VzIGZhaWx1cmVzIHRvIHVzZSB0aGUgZGlmZmxpYi5EaWZmZXIgYWxnb3JpdGhtCnVzZWQgYnkgdGhlIHBvcHVsYXIgbmRpZmYucHkgdXRpbGl0eS4gIFRoaXMgZG9lcyBpbnRyYWxpbmUgZGlmZmVyZW5jZQptYXJraW5nLCBhcyB3ZWxsIGFzIGludGVybGluZSBkaWZmZXJlbmNlcy4KCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHByaW50ICJhIGIgIGMgZCBlIGYgZyBoIGkgICBqIGsgbCBtIgogICAgLi4uICAgICBhIGIgYyBkIGUgZiBnIGggaSBqIGsgMSBtCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LlJFUE9SVF9ORElGRgogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50ICJhIGIgIGMgZCBlIGYgZyBoIGkgICBqIGsgbCBtIgogICAgRGlmZmVyZW5jZXMgKG5kaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwpOgogICAgICAgIC0gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIDEgbQogICAgICAgID8gICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICArIGEgYiAgYyBkIGUgZiBnIGggaSAgIGogayBsIG0KICAgICAgICA/ICAgICArICAgICAgICAgICAgICArKyAgICBeCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCgpUaGUgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSBzdXBwcmVzc2VzIHJlc3VsdCBvdXRwdXQgYWZ0ZXIgdGhlIGZpcnN0CmZhaWxpbmcgZXhhbXBsZToKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHByaW50IDEgIyBmaXJzdCBzdWNjZXNzCiAgICAuLi4gICAgIDEKICAgIC4uLiAgICAgPj4+IHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCiAgICAuLi4gICAgIDIwMAogICAgLi4uICAgICA+Pj4gcHJpbnQgMyAjIHNlY29uZCBmYWlsdXJlCiAgICAuLi4gICAgIDMwMAogICAgLi4uICAgICA+Pj4gcHJpbnQgNCAjIHNlY29uZCBzdWNjZXNzCiAgICAuLi4gICAgIDQKICAgIC4uLiAgICAgPj4+IHByaW50IDUgIyB0aGlyZCBmYWlsdXJlCiAgICAuLi4gICAgIDUwMAogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgNSwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgMiAjIGZpcnN0IGZhaWx1cmUKICAgIEV4cGVjdGVkOgogICAgICAgIDIwMAogICAgR290OgogICAgICAgIDIKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0zLCBhdHRlbXB0ZWQ9NSkKCkhvd2V2ZXIsIG91dHB1dCBmcm9tIGByZXBvcnRfc3RhcnRgIGlzIG5vdCBzdXBwcmVzc2VkOgoKICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1UcnVlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIFRyeWluZzoKICAgICAgICBwcmludCAxICMgZmlyc3Qgc3VjY2VzcwogICAgRXhwZWN0aW5nOgogICAgICAgIDEKICAgIG9rCiAgICBUcnlpbmc6CiAgICAgICAgcHJpbnQgMiAjIGZpcnN0IGZhaWx1cmUKICAgIEV4cGVjdGluZzoKICAgICAgICAyMDAKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDUsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCiAgICBFeHBlY3RlZDoKICAgICAgICAyMDAKICAgIEdvdDoKICAgICAgICAyCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MywgYXR0ZW1wdGVkPTUpCgpGb3IgdGhlIHB1cnBvc2VzIG9mIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUsIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucwpjb3VudCBhcyBmYWlsdXJlczoKCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIHInJycKICAgIC4uLiAgICAgPj4+IHByaW50IDEgIyBmaXJzdCBzdWNjZXNzCiAgICAuLi4gICAgIDEKICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IoMikgIyBmaXJzdCBmYWlsdXJlCiAgICAuLi4gICAgIDIwMAogICAgLi4uICAgICA+Pj4gcHJpbnQgMyAjIHNlY29uZCBmYWlsdXJlCiAgICAuLi4gICAgIDMwMAogICAgLi4uICAgICA+Pj4gcHJpbnQgNCAjIHNlY29uZCBzdWNjZXNzCiAgICAuLi4gICAgIDQKICAgIC4uLiAgICAgPj4+IHByaW50IDUgIyB0aGlyZCBmYWlsdXJlCiAgICAuLi4gICAgIDUwMAogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgNSwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigyKSAjIGZpcnN0IGZhaWx1cmUKICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgLi4uCiAgICAgICAgVmFsdWVFcnJvcjogMgogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTMsIGF0dGVtcHRlZD01KQoKTmV3IG9wdGlvbiBmbGFncyBjYW4gYWxzbyBiZSByZWdpc3RlcmVkLCB2aWEgcmVnaXN0ZXJfb3B0aW9uZmxhZygpLiAgSGVyZQp3ZSByZWFjaCBpbnRvIGRvY3Rlc3QncyBpbnRlcm5hbHMgYSBiaXQuCgogICAgPj4+IHVubGlrZWx5ID0gIlVOTElLRUxZX09QVElPTl9OQU1FIgogICAgPj4+IHVubGlrZWx5IGluIGRvY3Rlc3QuT1BUSU9ORkxBR1NfQllfTkFNRQogICAgRmFsc2UKICAgID4+PiBuZXdfZmxhZ192YWx1ZSA9IGRvY3Rlc3QucmVnaXN0ZXJfb3B0aW9uZmxhZyh1bmxpa2VseSkKICAgID4+PiB1bmxpa2VseSBpbiBkb2N0ZXN0Lk9QVElPTkZMQUdTX0JZX05BTUUKICAgIFRydWUKCkJlZm9yZSAyLjQuNC8yLjUsIHJlZ2lzdGVyaW5nIGEgbmFtZSBtb3JlIHRoYW4gb25jZSBlcnJvbmVvdXNseSBjcmVhdGVkCm1vcmUgdGhhbiBvbmUgZmxhZyB2YWx1ZS4gIEhlcmUgd2UgdmVyaWZ5IHRoYXQncyBmaXhlZDoKCiAgICA+Pj4gcmVkdW5kYW50X2ZsYWdfdmFsdWUgPSBkb2N0ZXN0LnJlZ2lzdGVyX29wdGlvbmZsYWcodW5saWtlbHkpCiAgICA+Pj4gcmVkdW5kYW50X2ZsYWdfdmFsdWUgPT0gbmV3X2ZsYWdfdmFsdWUKICAgIFRydWUKCkNsZWFuIHVwLgogICAgPj4+IGRlbCBkb2N0ZXN0Lk9QVElPTkZMQUdTX0JZX05BTUVbdW5saWtlbHldCgogICAgTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAsAAABvcHRpb25mbGFnczAEAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABz3R0AAApUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBvcHRpb24gZGlyZWN0aXZlIG1lY2hhbmlzbS4KCk9wdGlvbiBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIHR1cm4gb3B0aW9uIGZsYWdzIG9uIG9yIG9mZiBmb3IgYQpzaW5nbGUgZXhhbXBsZS4gIFRvIHR1cm4gYW4gb3B0aW9uIG9uIGZvciBhbiBleGFtcGxlLCBmb2xsb3cgdGhhdApleGFtcGxlIHdpdGggYSBjb21tZW50IG9mIHRoZSBmb3JtIGBgIyBkb2N0ZXN0OiArT1BUSU9OYGA6CgogICAgPj4+IGRlZiBmKHgpOiByJycnCiAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBzaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KICAgIC4uLgogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBzaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKICAgIEV4cGVjdGVkOgogICAgICAgIFswLCAxLCAuLi4sIDldCiAgICBHb3Q6CiAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCgpUbyB0dXJuIGFuIG9wdGlvbiBvZmYgZm9yIGFuIGV4YW1wbGUsIGZvbGxvdyB0aGF0IGV4YW1wbGUgd2l0aCBhCmNvbW1lbnQgb2YgdGhlIGZvcm0gYGAjIGRvY3Rlc3Q6IC1PUFRJT05gYDoKCiAgICA+Pj4gZGVmIGYoeCk6IHInJycKICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKQogICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQogICAgLi4uCiAgICAuLi4gICAgID4+PiAjIHNob3VsZCBmYWlsOiBubyBlbGxpcHNpcwogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgZG9jdGVzdDogLUVMTElQU0lTCiAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCiAgICAuLi4gICAgICcnJwogICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsCiAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMpLnJ1bih0ZXN0KQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGaWxlIC4uLiwgbGluZSA2LCBpbiBmCiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBkb2N0ZXN0OiAtRUxMSVBTSVMKICAgIEV4cGVjdGVkOgogICAgICAgIFswLCAxLCAuLi4sIDldCiAgICBHb3Q6CiAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCgpPcHRpb24gZGlyZWN0aXZlcyBhZmZlY3Qgb25seSB0aGUgZXhhbXBsZSB0aGF0IHRoZXkgYXBwZWFyIHdpdGg7IHRoZXkKZG8gbm90IGNoYW5nZSB0aGUgb3B0aW9ucyBmb3Igc3Vycm91bmRpbmcgZXhhbXBsZXM6CgogICAgPj4+IGRlZiBmKHgpOiByJycnCiAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KICAgIC4uLgogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCiAgICAuLi4KICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsOiBubyBlbGxpcHNpcwogICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCiAgICBFeHBlY3RlZDoKICAgICAgICBbMCwgMSwgLi4uLCA5XQogICAgR290OgogICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgOCwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCiAgICBFeHBlY3RlZDoKICAgICAgICBbMCwgMSwgLi4uLCA5XQogICAgR290OgogICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTIsIGF0dGVtcHRlZD0zKQoKTXVsdGlwbGUgb3B0aW9ucyBtYXkgYmUgbW9kaWZpZWQgYnkgYSBzaW5nbGUgb3B0aW9uIGRpcmVjdGl2ZS4gIFRoZXkKbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBjb21tYXMsIG9yIGJvdGg6CgogICAgPj4+IGRlZiBmKHgpOiByJycnCiAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAogICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIHN1Y2NlZWQKICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTICtOT1JNQUxJWkVfV0hJVEVTUEFDRQogICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWwKICAgIEV4cGVjdGVkOgogICAgICAgIFswLCAxLCAgLi4uLCAgIDldCiAgICBHb3Q6CiAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCgogICAgPj4+IGRlZiBmKHgpOiByJycnCiAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAogICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIHN1Y2NlZWQKICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTLCtOT1JNQUxJWkVfV0hJVEVTUEFDRQogICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgLi4uICAgICAnJycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWwKICAgIEV4cGVjdGVkOgogICAgICAgIFswLCAxLCAgLi4uLCAgIDldCiAgICBHb3Q6CiAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCgogICAgPj4+IGRlZiBmKHgpOiByJycnCiAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAogICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIHN1Y2NlZWQKICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTLCArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgIC4uLiAgICAgWzAsIDEsICAuLi4sICAgOV0KICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsCiAgICBFeHBlY3RlZDoKICAgICAgICBbMCwgMSwgIC4uLiwgICA5XQogICAgR290OgogICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQoKVGhlIG9wdGlvbiBkaXJlY3RpdmUgbWF5IGJlIHB1dCBvbiB0aGUgbGluZSBmb2xsb3dpbmcgdGhlIHNvdXJjZSwgYXMKbG9uZyBhcyBhIGNvbnRpbnVhdGlvbiBwcm9tcHQgaXMgdXNlZDoKCiAgICA+Pj4gZGVmIGYoeCk6IHInJycKICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKQogICAgLi4uICAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCgpGb3IgZXhhbXBsZXMgd2l0aCBtdWx0aS1saW5lIHNvdXJjZSwgdGhlIG9wdGlvbiBkaXJlY3RpdmUgbWF5IGFwcGVhcgphdCB0aGUgZW5kIG9mIGFueSBsaW5lOgoKICAgID4+PiBkZWYgZih4KTogcicnJwogICAgLi4uICAgICA+Pj4gZm9yIHggaW4gcmFuZ2UoMTApOiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgLi4uICAgICAuLi4gICAgIHByaW50IHgsCiAgICAuLi4gICAgIDAgMSAyIC4uLiA5CiAgICAuLi4KICAgIC4uLiAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKToKICAgIC4uLiAgICAgLi4uICAgICBwcmludCB4LCAgICAgICAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgIC4uLiAgICAgMCAxIDIgLi4uIDkKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCgpJZiBtb3JlIHRoYW4gb25lIGxpbmUgb2YgYW4gZXhhbXBsZSB3aXRoIG11bHRpLWxpbmUgc291cmNlIGhhcyBhbgpvcHRpb24gZGlyZWN0aXZlLCB0aGVuIHRoZXkgYXJlIGNvbWJpbmVkOgoKICAgID4+PiBkZWYgZih4KTogcicnJwogICAgLi4uICAgICBTaG91bGQgZmFpbCAob3B0aW9uIGRpcmVjdGl2ZSBub3Qgb24gdGhlIGxhc3QgbGluZSk6CiAgICAuLi4gICAgICAgICA+Pj4gZm9yIHggaW4gcmFuZ2UoMTApOiAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgLi4uICAgICAgICAgLi4uICAgICBwcmludCB4LCAgICAgICAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgIC4uLiAgICAgICAgIDAgIDEgICAgMi4uLjkKICAgIC4uLiAgICAgJycnCiAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCgpJdCBpcyBhbiBlcnJvciB0byBoYXZlIGEgY29tbWVudCBvZiB0aGUgZm9ybSBgYCMgZG9jdGVzdDpgYCB0aGF0IGlzCipub3QqIGZvbGxvd2VkIGJ5IHdvcmRzIG9mIHRoZSBmb3JtIGBgK09QVElPTmBgIG9yIGBgLU9QVElPTmBgLCB3aGVyZQpgYE9QVElPTmBgIGlzIGFuIG9wdGlvbiB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aApgcmVnaXN0ZXJfb3B0aW9uYDoKCiAgICA+Pj4gIyBFcnJvcjogT3B0aW9uIG5vdCByZWdpc3RlcmVkCiAgICA+Pj4gcyA9ICc+Pj4gcHJpbnQgMTIgICAjZG9jdGVzdDogK0JBRE9QVElPTicKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3Qocywge30sICdzJywgJ3MucHknLCAwKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgVmFsdWVFcnJvcjogbGluZSAxIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBpbnZhbGlkIG9wdGlvbjogJytCQURPUFRJT04nCgogICAgPj4+ICMgRXJyb3I6IE5vICsgb3IgLSBwcmVmaXgKICAgID4+PiBzID0gJz4+PiBwcmludCAxMiAgICNkb2N0ZXN0OiBFTExJUFNJUycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3Qocywge30sICdzJywgJ3MucHknLCAwKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgVmFsdWVFcnJvcjogbGluZSAxIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBpbnZhbGlkIG9wdGlvbjogJ0VMTElQU0lTJwoKSXQgaXMgYW4gZXJyb3IgdG8gdXNlIGFuIG9wdGlvbiBkaXJlY3RpdmUgb24gYSBsaW5lIHRoYXQgY29udGFpbnMgbm8Kc291cmNlOgoKICAgID4+PiBzID0gJz4+PiAjIGRvY3Rlc3Q6ICtFTExJUFNJUycKICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3Qocywge30sICdzJywgJ3MucHknLCAwKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgVmFsdWVFcnJvcjogbGluZSAwIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBvcHRpb24gZGlyZWN0aXZlIG9uIGEgbGluZSB3aXRoIG5vIGV4YW1wbGU6ICcjIGRvY3Rlc3Q6ICtFTExJUFNJUycKCiAgICBOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0EQAAAG9wdGlvbl9kaXJlY3RpdmVzsgUAAHMAAAAAYwEAAAABAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHNWAgAACgpDaGVjayB0aGF0IHVuaWNvZGUgb3V0cHV0IHdvcmtzOgoKICAgID4+PiB1J1x4ZTknCiAgICB1J1x4ZTknCgpJZiB3ZSByZXR1cm4gdW5pY29kZSwgU3Bvb2ZPdXQncyBidWYgdmFyaWFibGUgYmVjb21lcyBhdXRvbWFnaWNhbGx5CmNvbnZlcnRlZCB0byB1bmljb2RlLiBUaGlzIG1lYW5zIGFsbCBzdWJzZXF1ZW50IG91dHB1dCBiZWNvbWVzIGNvbnZlcnRlZAp0byB1bmljb2RlLCBhbmQgaWYgdGhlIG91dHB1dCBjb250YWlucyBub24tYXNjaWkgY2hhcmFjdGVycyB0aGF0IGZhaWxlZC4KSXQgdXNlZCB0byBiZSB0aGF0IHRoaXMgc3RhdGUgY2hhbmdlIGNhcnJpZWQgb24gYmV0d2VlbiB0ZXN0cywgbWVhbmluZwp0ZXN0cyB3b3VsZCBmYWlsIGlmIHVuaWNvZGUgaGFzIGJlZW4gb3V0cHV0IHByZXZpb3VzbHkgaW4gdGhlIHRlc3RydW4uClRoaXMgdGVzdCB0ZXN0cyB0aGF0IHRoaXMgaXMgbm8gbG9uZ2VyIHNvOgoKICAgID4+PiBwcmludCB1J2FiYycKICAgIGFiYwoKQW5kIHRoZW4gcmV0dXJuIGEgc3RyaW5nIHdpdGggbm9uLWFzY2lpIGNoYXJhY3RlcnM6CgogICAgPj4+IHByaW50IHUnXHhlOScuZW5jb2RlKCd1dGYtOCcpCiAgICDDqQoKICAgIE4oAAAAACgBAAAAUgUAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dBMAAAB0ZXN0X3VuaWNvZGVfb3V0cHV0iwYAAHMAAAAAKAkAAABSDwAAAFIQAAAAUiEAAABSIgAAAFIjAAAAUiQAAABSJQAAAFImAAAAUicAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlSIAAAAL8CAABzEAAAAAYBCT0JQwnTCR0J/wCDCdljAAAAAAAAAAABAAAAQwAAAHMEAAAAZAEAUygCAAAAc+4DAAAKVW5pdCB0ZXN0cyBmb3IgYHRlc3Rzb3VyY2UoKWAuCgpUaGUgdGVzdHNvdXJjZSgpIGZ1bmN0aW9uIHRha2VzIGEgbW9kdWxlIGFuZCBhIG5hbWUsIGZpbmRzIHRoZSAoZmlyc3QpCnRlc3Qgd2l0aCB0aGF0IG5hbWUgaW4gdGhhdCBtb2R1bGUsIGFuZCBjb252ZXJ0cyBpdCB0byBhIHNjcmlwdC4gVGhlCmV4YW1wbGUgY29kZSBpcyBjb252ZXJ0ZWQgdG8gcmVndWxhciBQeXRob24gY29kZS4gIFRoZSBzdXJyb3VuZGluZwp3b3JkcyBhbmQgZXhwZWN0ZWQgb3V0cHV0IGFyZSBjb252ZXJ0ZWQgdG8gY29tbWVudHM6CgogICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAogICAgPj4+IG5hbWUgPSAndGVzdC50ZXN0X2RvY3Rlc3Quc2FtcGxlX2Z1bmMnCiAgICA+Pj4gcHJpbnQgZG9jdGVzdC50ZXN0c291cmNlKHRlc3QudGVzdF9kb2N0ZXN0LCBuYW1lKQogICAgIyBCbGFoIGJsYWgKICAgICMKICAgIHByaW50IHNhbXBsZV9mdW5jKDIyKQogICAgIyBFeHBlY3RlZDoKICAgICMjIDQ0CiAgICAjCiAgICAjIFllZSBoYSEKICAgIDxCTEFOS0xJTkU+CgogICAgPj4+IG5hbWUgPSAndGVzdC50ZXN0X2RvY3Rlc3QuU2FtcGxlTmV3U3R5bGVDbGFzcycKICAgID4+PiBwcmludCBkb2N0ZXN0LnRlc3Rzb3VyY2UodGVzdC50ZXN0X2RvY3Rlc3QsIG5hbWUpCiAgICBwcmludCAnMVxuMlxuMycKICAgICMgRXhwZWN0ZWQ6CiAgICAjIyAxCiAgICAjIyAyCiAgICAjIyAzCiAgICA8QkxBTktMSU5FPgoKICAgID4+PiBuYW1lID0gJ3Rlc3QudGVzdF9kb2N0ZXN0LlNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QnCiAgICA+Pj4gcHJpbnQgZG9jdGVzdC50ZXN0c291cmNlKHRlc3QudGVzdF9kb2N0ZXN0LCBuYW1lKQogICAgcHJpbnQgU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZCgxMCkKICAgICMgRXhwZWN0ZWQ6CiAgICAjIyAxMgogICAgcHJpbnQgU2FtcGxlQ2xhc3MoMCkuYV9jbGFzc21ldGhvZCgxMCkKICAgICMgRXhwZWN0ZWQ6CiAgICAjIyAxMgogICAgPEJMQU5LTElORT4KTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dA8AAAB0ZXN0X3Rlc3Rzb3VyY2WkBgAAcwAAAABjAAAAAAAAAAABAAAAQwAAAHMEAAAAZAEAUygCAAAAc1YCAAAKCkNyZWF0ZSBhIGRvY3N0cmluZyB0aGF0IHdlIHdhbnQgdG8gZGVidWc6CgogICAgPj4+IHMgPSAnJycKICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgLi4uICAgICAxMgogICAgLi4uICAgICAnJycKCkNyZWF0ZSBzb21lIGZha2Ugc3RkaW4gaW5wdXQsIHRvIGZlZWQgdG8gdGhlIGRlYnVnZ2VyOgoKICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCiAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbJ25leHQnLCAncHJpbnQgeCcsICdjb250aW51ZSddKQoKUnVuIHRoZSBkZWJ1Z2dlciBvbiB0aGUgZG9jc3RyaW5nLCBhbmQgdGhlbiByZXN0b3JlIHN5cy5zdGRpbi4KCiAgICA+Pj4gdHJ5OiBkb2N0ZXN0LmRlYnVnX3NyYyhzKQogICAgLi4uIGZpbmFsbHk6IHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KICAgID4gPHN0cmluZz4oMSk8bW9kdWxlPigpCiAgICAoUGRiKSBuZXh0CiAgICAxMgogICAgLS1SZXR1cm4tLQogICAgPiA8c3RyaW5nPigxKTxtb2R1bGU+KCktPk5vbmUKICAgIChQZGIpIHByaW50IHgKICAgIDEyCiAgICAoUGRiKSBjb250aW51ZQoKTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAoAAAB0ZXN0X2RlYnVnzAYAAHMAAAAAYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHNLEAAAVXNpbmcgcGRiLnNldF90cmFjZSBmcm9tIGEgZG9jdGVzdC4KCiAgICBZb3UgY2FuIHVzZSBwZGIuc2V0X3RyYWNlIGZyb20gYSBkb2N0ZXN0LiAgVG8gZG8gc28sIHlvdSBtdXN0CiAgICByZXRyaWV2ZSB0aGUgc2V0X3RyYWNlIGZ1bmN0aW9uIGZyb20gdGhlIHBkYiBtb2R1bGUgYXQgdGhlIHRpbWUKICAgIHlvdSB1c2UgaXQuICBUaGUgZG9jdGVzdCBtb2R1bGUgY2hhbmdlcyBzeXMuc3Rkb3V0IHNvIHRoYXQgaXQgY2FuCiAgICBjYXB0dXJlIHByb2dyYW0gb3V0cHV0LiAgSXQgYWxzbyB0ZW1wb3JhcmlseSByZXBsYWNlcyBwZGIuc2V0X3RyYWNlCiAgICB3aXRoIGEgdmVyc2lvbiB0aGF0IHJlc3RvcmVzIHN0ZG91dC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB5b3UgdG8KICAgIHNlZSBkZWJ1Z2dlciBvdXRwdXQuCgogICAgICA+Pj4gZG9jID0gJycnCiAgICAgIC4uLiA+Pj4geCA9IDQyCiAgICAgIC4uLiA+Pj4gcmFpc2UgRXhjZXB0aW9uKCdjbMOpJykKICAgICAgLi4uIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgLi4uIEV4Y2VwdGlvbjogY2zDqQogICAgICAuLi4gPj4+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAuLi4gJycnCiAgICAgID4+PiBwYXJzZXIgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKQogICAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIHt9LCAiZm9vLWLDpHJAYmF6IiwgImZvby1iw6RyQGJhei5weSIsIDApCiAgICAgID4+PiBydW5uZXIgPSBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkKCiAgICBUbyBkZW1vbnN0cmF0ZSB0aGlzLCB3ZSdsbCBjcmVhdGUgYSBmYWtlIHN0YW5kYXJkIGlucHV0IHRoYXQKICAgIGNhcHR1cmVzIG91ciBkZWJ1Z2dlciBpbnB1dDoKCiAgICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKICAgICAgPj4+IHJlYWxfc3RkaW4gPSBzeXMuc3RkaW4KICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWwogICAgICAuLi4gICAgJ3ByaW50IHgnLCAgIyBwcmludCBkYXRhIGRlZmluZWQgYnkgdGhlIGV4YW1wbGUKICAgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKICAgICAgLi4uICAgICcnXSkKCiAgICAgID4+PiB0cnk6IHJ1bm5lci5ydW4odGVzdCkKICAgICAgLi4uIGZpbmFsbHk6IHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KICAgICAgLS1SZXR1cm4tLQogICAgICA+IDxkb2N0ZXN0IGZvby1iw6RyQGJhelsyXT4oMSk8bW9kdWxlPigpLT5Ob25lCiAgICAgIC0+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAoUGRiKSBwcmludCB4CiAgICAgIDQyCiAgICAgIChQZGIpIGNvbnRpbnVlCiAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MykKCiAgICAgIFlvdSBjYW4gYWxzbyBwdXQgcGRiLnNldF90cmFjZSBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGEgdGVzdDoKCiAgICAgID4+PiBkZWYgY2FsbHNfc2V0X3RyYWNlKCk6CiAgICAgIC4uLiAgICB5PTIKICAgICAgLi4uICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQoKICAgICAgPj4+IGRvYyA9ICcnJwogICAgICAuLi4gPj4+IHg9MQogICAgICAuLi4gPj4+IGNhbGxzX3NldF90cmFjZSgpCiAgICAgIC4uLiAnJycKICAgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9iYWxzKCksICJmb28tYsOkckBiYXoiLCAiZm9vLWLDpHJAYmF6LnB5IiwgMCkKICAgICAgPj4+IHJlYWxfc3RkaW4gPSBzeXMuc3RkaW4KICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWwogICAgICAuLi4gICAgJ3ByaW50IHknLCAgIyBwcmludCBkYXRhIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uCiAgICAgIC4uLiAgICAndXAnLCAgICAgICAjIG91dCBvZiBmdW5jdGlvbgogICAgICAuLi4gICAgJ3ByaW50IHgnLCAgIyBwcmludCBkYXRhIGRlZmluZWQgYnkgdGhlIGV4YW1wbGUKICAgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKICAgICAgLi4uICAgICcnXSkKCiAgICAgID4+PiB0cnk6CiAgICAgIC4uLiAgICAgcnVubmVyLnJ1bih0ZXN0KQogICAgICAuLi4gZmluYWxseToKICAgICAgLi4uICAgICBzeXMuc3RkaW4gPSByZWFsX3N0ZGluCiAgICAgIC0tUmV0dXJuLS0KICAgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VbOF0+KDMpY2FsbHNfc2V0X3RyYWNlKCktPk5vbmUKICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgIChQZGIpIHByaW50IHkKICAgICAgMgogICAgICAoUGRiKSB1cAogICAgICA+IDxkb2N0ZXN0IGZvby1iw6RyQGJhelsxXT4oMSk8bW9kdWxlPigpCiAgICAgIC0+IGNhbGxzX3NldF90cmFjZSgpCiAgICAgIChQZGIpIHByaW50IHgKICAgICAgMQogICAgICAoUGRiKSBjb250aW51ZQogICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCgogICAgRHVyaW5nIGludGVyYWN0aXZlIGRlYnVnZ2luZywgc291cmNlIGNvZGUgaXMgc2hvd24sIGV2ZW4gZm9yCiAgICBkb2N0ZXN0IGV4YW1wbGVzOgoKICAgICAgPj4+IGRvYyA9ICcnJwogICAgICAuLi4gPj4+IGRlZiBmKHgpOgogICAgICAuLi4gLi4uICAgICBnKHgqMikKICAgICAgLi4uID4+PiBkZWYgZyh4KToKICAgICAgLi4uIC4uLiAgICAgcHJpbnQgeCszCiAgICAgIC4uLiAuLi4gICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAuLi4gPj4+IGYoMykKICAgICAgLi4uICcnJwogICAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIGdsb2JhbHMoKSwgImZvby1iw6RyQGJheiIsICJmb28tYsOkckBiYXoucHkiLCAwKQogICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgogICAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCiAgICAgIC4uLiAgICAnbGlzdCcsICAgICAjIGxpc3Qgc291cmNlIGZyb20gZXhhbXBsZSAyCiAgICAgIC4uLiAgICAnbmV4dCcsICAgICAjIHJldHVybiBmcm9tIGcoKQogICAgICAuLi4gICAgJ2xpc3QnLCAgICAgIyBsaXN0IHNvdXJjZSBmcm9tIGV4YW1wbGUgMQogICAgICAuLi4gICAgJ25leHQnLCAgICAgIyByZXR1cm4gZnJvbSBmKCkKICAgICAgLi4uICAgICdsaXN0JywgICAgICMgbGlzdCBzb3VyY2UgZnJvbSBleGFtcGxlIDMKICAgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKICAgICAgLi4uICAgICcnXSkKICAgICAgPj4+IHRyeTogcnVubmVyLnJ1bih0ZXN0KQogICAgICAuLi4gZmluYWxseTogc3lzLnN0ZGluID0gcmVhbF9zdGRpbgogICAgICAuLi4gIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICAgLS1SZXR1cm4tLQogICAgICA+IDxkb2N0ZXN0IGZvby1iw6RyQGJhelsxXT4oMylnKCktPk5vbmUKICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgIChQZGIpIGxpc3QKICAgICAgICAxICAgICBkZWYgZyh4KToKICAgICAgICAyICAgICAgICAgcHJpbnQgeCszCiAgICAgICAgMyAgLT4gICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICBbRU9GXQogICAgICAoUGRiKSBuZXh0CiAgICAgIC0tUmV0dXJuLS0KICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMF0+KDIpZigpLT5Ob25lCiAgICAgIC0+IGcoeCoyKQogICAgICAoUGRiKSBsaXN0CiAgICAgICAgMSAgICAgZGVmIGYoeCk6CiAgICAgICAgMiAgLT4gICAgIGcoeCoyKQogICAgICBbRU9GXQogICAgICAoUGRiKSBuZXh0CiAgICAgIC0tUmV0dXJuLS0KICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMl0+KDEpPG1vZHVsZT4oKS0+Tm9uZQogICAgICAtPiBmKDMpCiAgICAgIChQZGIpIGxpc3QKICAgICAgICAxICAtPiBmKDMpCiAgICAgIFtFT0ZdCiAgICAgIChQZGIpIGNvbnRpbnVlCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgRmlsZSAiZm9vLWLDpHJAYmF6LnB5IiwgbGluZSA3LCBpbiBmb28tYsOkckBiYXoKICAgICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgICBmKDMpCiAgICAgIEV4cGVjdGVkIG5vdGhpbmcKICAgICAgR290OgogICAgICAgICAgOQogICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTMpCiAgICAgIE4oAAAAACgAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weXQSAAAAdGVzdF9wZGJfc2V0X3RyYWNl6wYAAHMAAAAAYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHNpCQAAVGhpcyBpbGx1c3RyYXRlcyBtb3JlLWRlbWFuZGluZyB1c2Ugb2Ygc2V0X3RyYWNlIHdpdGggbmVzdGVkIGZ1bmN0aW9ucy4KCiAgICA+Pj4gY2xhc3MgQyhvYmplY3QpOgogICAgLi4uICAgICBkZWYgY2FsbHNfc2V0X3RyYWNlKHNlbGYpOgogICAgLi4uICAgICAgICAgeSA9IDEKICAgIC4uLiAgICAgICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgLi4uICAgICAgICAgc2VsZi5mMSgpCiAgICAuLi4gICAgICAgICB5ID0gMgogICAgLi4uICAgICBkZWYgZjEoc2VsZik6CiAgICAuLi4gICAgICAgICB4ID0gMQogICAgLi4uICAgICAgICAgc2VsZi5mMigpCiAgICAuLi4gICAgICAgICB4ID0gMgogICAgLi4uICAgICBkZWYgZjIoc2VsZik6CiAgICAuLi4gICAgICAgICB6ID0gMQogICAgLi4uICAgICAgICAgeiA9IDIKCiAgICA+Pj4gY2FsbHNfc2V0X3RyYWNlID0gQygpLmNhbGxzX3NldF90cmFjZQoKICAgID4+PiBkb2MgPSAnJycKICAgIC4uLiA+Pj4gYSA9IDEKICAgIC4uLiA+Pj4gY2FsbHNfc2V0X3RyYWNlKCkKICAgIC4uLiAnJycKICAgID4+PiBwYXJzZXIgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKQogICAgPj4+IHJ1bm5lciA9IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKQogICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9iYWxzKCksICJmb28tYsOkckBiYXoiLCAiZm9vLWLDpHJAYmF6LnB5IiwgMCkKICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCiAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCiAgICAuLi4gICAgJ3ByaW50IHknLCAgIyBwcmludCBkYXRhIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uCiAgICAuLi4gICAgJ3N0ZXAnLCAnc3RlcCcsICdzdGVwJywgJ3N0ZXAnLCAnc3RlcCcsICdzdGVwJywgJ3ByaW50IHonLAogICAgLi4uICAgICd1cCcsICdwcmludCB4JywKICAgIC4uLiAgICAndXAnLCAncHJpbnQgeScsCiAgICAuLi4gICAgJ3VwJywgJ3ByaW50IGZvbycsCiAgICAuLi4gICAgJ2NvbnRpbnVlJywgIyBzdG9wIGRlYnVnZ2luZwogICAgLi4uICAgICcnXSkKCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgICBydW5uZXIucnVuKHRlc3QpCiAgICAuLi4gZmluYWxseToKICAgIC4uLiAgICAgc3lzLnN0ZGluID0gcmVhbF9zdGRpbgogICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig1KWNhbGxzX3NldF90cmFjZSgpCiAgICAtPiBzZWxmLmYxKCkKICAgIChQZGIpIHByaW50IHkKICAgIDEKICAgIChQZGIpIHN0ZXAKICAgIC0tQ2FsbC0tCiAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDcpZjEoKQogICAgLT4gZGVmIGYxKHNlbGYpOgogICAgKFBkYikgc3RlcAogICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig4KWYxKCkKICAgIC0+IHggPSAxCiAgICAoUGRiKSBzdGVwCiAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDkpZjEoKQogICAgLT4gc2VsZi5mMigpCiAgICAoUGRiKSBzdGVwCiAgICAtLUNhbGwtLQogICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPigxMSlmMigpCiAgICAtPiBkZWYgZjIoc2VsZik6CiAgICAoUGRiKSBzdGVwCiAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDEyKWYyKCkKICAgIC0+IHogPSAxCiAgICAoUGRiKSBzdGVwCiAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDEzKWYyKCkKICAgIC0+IHogPSAyCiAgICAoUGRiKSBwcmludCB6CiAgICAxCiAgICAoUGRiKSB1cAogICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig5KWYxKCkKICAgIC0+IHNlbGYuZjIoKQogICAgKFBkYikgcHJpbnQgeAogICAgMQogICAgKFBkYikgdXAKICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlX25lc3RlZFswXT4oNSljYWxsc19zZXRfdHJhY2UoKQogICAgLT4gc2VsZi5mMSgpCiAgICAoUGRiKSBwcmludCB5CiAgICAxCiAgICAoUGRiKSB1cAogICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMV0+KDEpPG1vZHVsZT4oKQogICAgLT4gY2FsbHNfc2V0X3RyYWNlKCkKICAgIChQZGIpIHByaW50IGZvbwogICAgKioqIE5hbWVFcnJvcjogbmFtZSAnZm9vJyBpcyBub3QgZGVmaW5lZAogICAgKFBkYikgY29udGludWUKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dBkAAAB0ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkcgcAAHMAAAAAYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHNGEQAARG9jVGVzdFN1aXRlIGNyZWF0ZXMgYSB1bml0dGVzdCB0ZXN0IHN1aXRlIGZyb20gYSBkb2N0ZXN0LgoKICAgICAgIFdlIGNyZWF0ZSBhIFN1aXRlIGJ5IHByb3ZpZGluZyBhIG1vZHVsZS4gIEEgbW9kdWxlIGNhbiBiZSBwcm92aWRlZAogICAgICAgYnkgcGFzc2luZyBhIG1vZHVsZSBvYmplY3Q6CgogICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CiAgICAgICAgID4+PiBpbXBvcnQgdGVzdC5zYW1wbGVfZG9jdGVzdAogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSh0ZXN0LnNhbXBsZV9kb2N0ZXN0KQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTQ+CgogICAgICAgV2UgY2FuIGFsc28gc3VwcGx5IHRoZSBtb2R1bGUgYnkgbmFtZToKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0JykKICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz00PgoKICAgICAgIFRoZSBtb2R1bGUgbmVlZCBub3QgY29udGFpbiBhbnkgZG9jdGVzdCBleGFtcGxlczoKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzJykKICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MCBlcnJvcnM9MCBmYWlsdXJlcz0wPgoKICAgICAgIEhvd2V2ZXIsIGlmIERvY1Rlc3RTdWl0ZSBmaW5kcyBubyBkb2NzdHJpbmdzLCBpdCByYWlzZXMgYW4gZXJyb3I6CgogICAgICAgICA+Pj4gdHJ5OgogICAgICAgICAuLi4gICAgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MnKQogICAgICAgICAuLi4gZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICAgLi4uICAgICBlcnJvciA9IGUKCiAgICAgICAgID4+PiBwcmludChlcnJvci5hcmdzWzFdKQogICAgICAgICBoYXMgbm8gZG9jc3RyaW5ncwoKICAgICAgIFlvdSBjYW4gcHJldmVudCB0aGlzIGVycm9yIGJ5IHBhc3NpbmcgYSBEb2NUZXN0RmluZGVyIGluc3RhbmNlIHdpdGgKICAgICAgIHRoZSBgZXhjbHVkZV9lbXB0eWAga2V5d29yZCBhcmd1bWVudCBzZXQgdG8gRmFsc2U6CgogICAgICAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKGV4Y2x1ZGVfZW1wdHk9RmFsc2UpCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MnLAogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZpbmRlcj1maW5kZXIpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTAgZXJyb3JzPTAgZmFpbHVyZXM9MD4KCiAgICAgICBXZSBjYW4gdXNlIHRoZSBjdXJyZW50IG1vZHVsZToKCiAgICAgICAgID4+PiBzdWl0ZSA9IHRlc3Quc2FtcGxlX2RvY3Rlc3QudGVzdF9zdWl0ZSgpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9ND4KCiAgICAgICBXZSBjYW4gc3VwcGx5IGdsb2JhbCB2YXJpYWJsZXMuICBJZiB3ZSBwYXNzIGdsb2JzLCB0aGV5IHdpbGwgYmUKICAgICAgIHVzZWQgaW5zdGVhZCBvZiB0aGUgbW9kdWxlIGdsb2JhbHMuICBIZXJlIHdlJ2xsIHBhc3MgYW4gZW1wdHkKICAgICAgIGdsb2JhbHMsIHRyaWdnZXJpbmcgYW4gZXh0cmEgZXJyb3I6CgogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsIGdsb2JzPXt9KQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTU+CgogICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHByb3ZpZGUgZXh0cmEgZ2xvYmFscy4gIEhlcmUgd2UnbGwgbWFrZSBhbgogICAgICAgZXJyb3IgZ28gYXdheSBieSBwcm92aWRpbmcgYW4gZXh0cmEgZ2xvYmFsIHZhcmlhYmxlOgoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnLAogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWdsb2JzPXsneSc6IDF9KQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTM+CgogICAgICAgWW91IGNhbiBwYXNzIG9wdGlvbiBmbGFncy4gIEhlcmUgd2UnbGwgY2F1c2UgYW4gZXh0cmEgZXJyb3IKICAgICAgIGJ5IGRpc2FibGluZyB0aGUgYmxhbmstbGluZSBmZWF0dXJlOgoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnLAogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9NT4KCiAgICAgICBZb3UgY2FuIHN1cHBseSBzZXRVcCBhbmQgdGVhckRvd24gZnVuY3Rpb25zOgoKICAgICAgICAgPj4+IGRlZiBzZXRVcCh0KToKICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICAgICAgLi4uICAgICB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwID0gVHJ1ZQoKICAgICAgICAgPj4+IGRlZiB0ZWFyRG93bih0KToKICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICAgICAgLi4uICAgICBkZWwgdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAoKICAgICAgIEhlcmUsIHdlIGluc3RhbGxlZCBhIHNpbGx5IHZhcmlhYmxlIHRoYXQgdGhlIHRlc3QgZXhwZWN0czoKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0JywKICAgICAgICAgLi4uICAgICAgc2V0VXA9c2V0VXAsIHRlYXJEb3duPXRlYXJEb3duKQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTM+CgogICAgICAgQnV0IHRoZSB0ZWFyRG93biByZXN0b3JlcyBzYW5pdHk6CgogICAgICAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CiAgICAgICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCiAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgLi4uCiAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiAnbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2lsbHlTZXR1cCcKCiAgICAgICBUaGUgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bnRpb25zIGFyZSBwYXNzZWQgdGVzdCBvYmplY3RzLiBIZXJlCiAgICAgICB3ZSdsbCB1c2UgdGhlIHNldFVwIGZ1bmN0aW9uIHRvIHN1cHBseSB0aGUgbWlzc2luZyB2YXJpYWJsZSB5OgoKICAgICAgICAgPj4+IGRlZiBzZXRVcCh0ZXN0KToKICAgICAgICAgLi4uICAgICB0ZXN0Lmdsb2JzWyd5J10gPSAxCgogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsIHNldFVwPXNldFVwKQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTM+CgogICAgICAgSGVyZSwgd2UgZGlkbid0IG5lZWQgdG8gdXNlIGEgdGVhckRvd24gZnVuY3Rpb24gYmVjYXVzZSB3ZQogICAgICAgbW9kaWZpZWQgdGhlIHRlc3QgZ2xvYmFscywgd2hpY2ggYXJlIGEgY29weSBvZiB0aGUKICAgICAgIHNhbXBsZV9kb2N0ZXN0IG1vZHVsZSBkaWN0aW9uYXJ5LiAgVGhlIHRlc3QgZ2xvYmFscyBhcmUKICAgICAgIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBmb3IgdXMgYWZ0ZXIgYSB0ZXN0LgogICAgICAgTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dBEAAAB0ZXN0X0RvY1Rlc3RTdWl0ZccHAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzrBsAAFdlIGNhbiB0ZXN0IHRlc3RzIGZvdW5kIGluIHRleHQgZmlsZXMgdXNpbmcgYSBEb2NGaWxlU3VpdGUuCgogICAgICAgV2UgY3JlYXRlIGEgc3VpdGUgYnkgcHJvdmlkaW5nIHRoZSBuYW1lcyBvZiBvbmUgb3IgbW9yZSB0ZXh0CiAgICAgICBmaWxlcyB0aGF0IGluY2x1ZGUgZXhhbXBsZXM6CgogICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JykKICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MyBlcnJvcnM9MCBmYWlsdXJlcz0zPgoKICAgICAgIFRoZSB0ZXN0IGZpbGVzIGFyZSBsb29rZWQgZm9yIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKICAgICAgIGNhbGxpbmcgbW9kdWxlLiAgQSBwYWNrYWdlIGtleXdvcmQgYXJndW1lbnQgY2FuIGJlIHByb3ZpZGVkIHRvCiAgICAgICBzcGVjaWZ5IGEgZGlmZmVyZW50IHJlbGF0aXZlIGxvY2F0aW9uLgoKICAgICAgICAgPj4+IGltcG9ydCB1bml0dGVzdAogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3QyLnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9J3Rlc3QnKQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTM+CgogICAgICAgU3VwcG9ydCBmb3IgdXNpbmcgYSBwYWNrYWdlJ3MgX19sb2FkZXJfXy5nZXRfZGF0YSgpIGlzIGFsc28KICAgICAgIHByb3ZpZGVkLgoKICAgICAgICAgPj4+IGltcG9ydCB1bml0dGVzdCwgcGtndXRpbCwgdGVzdAogICAgICAgICA+Pj4gYWRkZWRfbG9hZGVyID0gRmFsc2UKICAgICAgICAgPj4+IGlmIG5vdCBoYXNhdHRyKHRlc3QsICdfX2xvYWRlcl9fJyk6CiAgICAgICAgIC4uLiAgICAgdGVzdC5fX2xvYWRlcl9fID0gcGtndXRpbC5nZXRfbG9hZGVyKHRlc3QpCiAgICAgICAgIC4uLiAgICAgYWRkZWRfbG9hZGVyID0gVHJ1ZQogICAgICAgICA+Pj4gdHJ5OgogICAgICAgICAuLi4gICAgIHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSd0ZXN0JykKICAgICAgICAgLi4uICAgICBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICAuLi4gZmluYWxseToKICAgICAgICAgLi4uICAgICBpZiBhZGRlZF9sb2FkZXI6CiAgICAgICAgIC4uLiAgICAgICAgIGRlbCB0ZXN0Ll9fbG9hZGVyX18KICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTM+CgogICAgICAgJy8nIHNob3VsZCBiZSB1c2VkIGFzIGEgcGF0aCBzZXBhcmF0b3IuICBJdCB3aWxsIGJlIGNvbnZlcnRlZAogICAgICAgdG8gYSBuYXRpdmUgc2VwYXJhdG9yIGF0IHJ1biB0aW1lOgoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJy4uL3Rlc3QvdGVzdF9kb2N0ZXN0LnR4dCcpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTEgZXJyb3JzPTAgZmFpbHVyZXM9MT4KCiAgICAgICBJZiBEb2NGaWxlU3VpdGUgaXMgdXNlZCBmcm9tIGFuIGludGVyYWN0aXZlIHNlc3Npb24sIHRoZW4gZmlsZXMKICAgICAgIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IG9mIHN5cy5hcmd2WzBdOgoKICAgICAgICAgPj4+IGltcG9ydCB0eXBlcywgb3MucGF0aCwgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICAgICAgPj4+IHNhdmVfYXJndiA9IHN5cy5hcmd2CiAgICAgICAgID4+PiBzeXMuYXJndiA9IFt0ZXN0LnRlc3RfZG9jdGVzdC5fX2ZpbGVfX10KICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPXR5cGVzLk1vZHVsZVR5cGUoJ19fbWFpbl9fJykpCiAgICAgICAgID4+PiBzeXMuYXJndiA9IHNhdmVfYXJndgoKICAgICAgIEJ5IHNldHRpbmcgYG1vZHVsZV9yZWxhdGl2ZT1GYWxzZWAsIG9zLXNwZWNpZmljIHBhdGhzIG1heSBiZQogICAgICAgdXNlZCAoaW5jbHVkaW5nIGFic29sdXRlIHBhdGhzIGFuZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5KToKCiAgICAgICAgID4+PiAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBwYWNrYWdlLgogICAgICAgICA+Pj4gdGVzdF9kb2N0ZXN0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgodGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18pCiAgICAgICAgID4+PiB0ZXN0X3BrZ19wYXRoID0gb3MucGF0aC5zcGxpdCh0ZXN0X2RvY3Rlc3RfcGF0aClbMF0KCiAgICAgICAgID4+PiAjIFVzZSBpdCB0byBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRlc3RfZG9jdGVzdC50eHQuCiAgICAgICAgID4+PiB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF9wa2dfcGF0aCwgJ3Rlc3RfZG9jdGVzdC50eHQnKQoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUodGVzdF9maWxlLCBtb2R1bGVfcmVsYXRpdmU9RmFsc2UpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTEgZXJyb3JzPTAgZmFpbHVyZXM9MT4KCiAgICAgICBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGBwYWNrYWdlYCB3aGVuIGBtb2R1bGVfcmVsYXRpdmU9RmFsc2VgOgoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUodGVzdF9maWxlLCBtb2R1bGVfcmVsYXRpdmU9RmFsc2UsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9J3Rlc3QnKQogICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgIFZhbHVlRXJyb3I6IFBhY2thZ2UgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBtb2R1bGUtcmVsYXRpdmUgcGF0aHMuCgogICAgICAgWW91IGNhbiBzcGVjaWZ5IGluaXRpYWwgZ2xvYmFsIHZhcmlhYmxlczoKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnM9eydmYXZvcml0ZV9jb2xvcic6ICdibHVlJ30pCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mj4KCiAgICAgICBJbiB0aGlzIGNhc2UsIHdlIHN1cHBsaWVkIGEgbWlzc2luZyBmYXZvcml0ZSBjb2xvci4gWW91IGNhbgogICAgICAgcHJvdmlkZSBkb2N0ZXN0IG9wdGlvbnM6CgogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3QyLnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFncz1kb2N0ZXN0LkRPTlRfQUNDRVBUX0JMQU5LTElORSwKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnM9eydmYXZvcml0ZV9jb2xvcic6ICdibHVlJ30pCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mz4KCiAgICAgICBBbmQsIHlvdSBjYW4gcHJvdmlkZSBzZXRVcCBhbmQgdGVhckRvd24gZnVuY3Rpb25zOgoKICAgICAgICAgPj4+IGRlZiBzZXRVcCh0KToKICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICAgICAgLi4uICAgICB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwID0gVHJ1ZQoKICAgICAgICAgPj4+IGRlZiB0ZWFyRG93bih0KToKICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICAgICAgLi4uICAgICBkZWwgdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAoKICAgICAgIEhlcmUsIHdlIGluc3RhbGxlZCBhIHNpbGx5IHZhcmlhYmxlIHRoYXQgdGhlIHRlc3QgZXhwZWN0czoKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXA9c2V0VXAsIHRlYXJEb3duPXRlYXJEb3duKQogICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTI+CgogICAgICAgQnV0IHRoZSB0ZWFyRG93biByZXN0b3JlcyBzYW5pdHk6CgogICAgICAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CiAgICAgICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCiAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgLi4uCiAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiAnbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2lsbHlTZXR1cCcKCiAgICAgICBUaGUgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bnRpb25zIGFyZSBwYXNzZWQgdGVzdCBvYmplY3RzLgogICAgICAgSGVyZSwgd2UnbGwgdXNlIGEgc2V0VXAgZnVuY3Rpb24gdG8gc2V0IHRoZSBmYXZvcml0ZSBjb2xvciBpbgogICAgICAgdGVzdF9kb2N0ZXN0LnR4dDoKCiAgICAgICAgID4+PiBkZWYgc2V0VXAodGVzdCk6CiAgICAgICAgIC4uLiAgICAgdGVzdC5nbG9ic1snZmF2b3JpdGVfY29sb3InXSA9ICdibHVlJwoKICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBzZXRVcD1zZXRVcCkKICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MSBlcnJvcnM9MCBmYWlsdXJlcz0wPgoKICAgICAgIEhlcmUsIHdlIGRpZG4ndCBuZWVkIHRvIHVzZSBhIHRlYXJEb3duIGZ1bmN0aW9uIGJlY2F1c2Ugd2UKICAgICAgIG1vZGlmaWVkIHRoZSB0ZXN0IGdsb2JhbHMuICBUaGUgdGVzdCBnbG9iYWxzIGFyZQogICAgICAgYXV0b21hdGljYWxseSBjbGVhcmVkIGZvciB1cyBhZnRlciBhIHRlc3QuCgogICAgICAgVGVzdHMgaW4gYSBmaWxlIHJ1biB1c2luZyBgRG9jRmlsZVN1aXRlYCBjYW4gYWxzbyBhY2Nlc3MgdGhlCiAgICAgICBgX19maWxlX19gIGdsb2JhbCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBmaWxlCiAgICAgICBjb250YWluaW5nIHRoZSB0ZXN0czoKCiAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QzLnR4dCcpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTEgZXJyb3JzPTAgZmFpbHVyZXM9MD4KCiAgICAgICBJZiB0aGUgdGVzdHMgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgd2UgaGF2ZSB0byBzcGVjaWZ5IHdoaWNoCiAgICAgICBlbmNvZGluZyB0aGUgZmlsZSBpcyBlbmNvZGVkIHdpdGguIFdlIGRvIHNvIGJ5IHVzaW5nIHRoZSBgZW5jb2RpbmdgCiAgICAgICBwYXJhbWV0ZXI6CgogICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3QyLnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mj4KCiAgICAgICBOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0EQAAAHRlc3RfRG9jRmlsZVN1aXRlOQgAAHMAAAAAYwAAAAAAAAAAAQAAAEMAAABzBAAAAGQBAFMoAgAAAHN6AAAACiAgICBUcmFpbGluZyBzcGFjZXMgaW4gZXhwZWN0ZWQgb3V0cHV0IGFyZSBzaWduaWZpY2FudDoKCiAgICAgID4+PiB4LCB5ID0gJ2ZvbycsICcnCiAgICAgID4+PiBwcmludCB4LCB5CiAgICAgIGZvbyAKCiAgICBOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0GwAAAHRlc3RfdHJhaWxpbmdfc3BhY2VfaW5fdGVzdN8IAABzAAAAAGMAAAAAAAAAAAEAAABDAAAAcwQAAABkAQBTKAIAAABzLAgAAERlZmF1bHQgdW5pdHRlc3QgcmVwb3J0aW5nIGZsYWdzIGNhbiBiZSBzZXQgdG8gY29udHJvbCByZXBvcnRpbmcKCiAgICBIZXJlLCB3ZSdsbCBzZXQgdGhlIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUgb3B0aW9uIHNvIHdlIHNlZQogICAgb25seSB0aGUgZmlyc3QgZmFpbHVyZSBvZiBlYWNoIHRlc3QuICBGaXJzdCwgd2UnbGwgbG9vayBhdCB0aGUKICAgIG91dHB1dCB3aXRob3V0IHRoZSBmbGFnLiAgVGhlIGZpbGUgdGVzdF9kb2N0ZXN0LnR4dCBmaWxlIGhhcyB0d28KICAgIHRlc3RzLiBUaGV5IGJvdGggZmFpbCBpZiBibGFuayBsaW5lcyBhcmUgZGlzYWJsZWQ6CgogICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUpCiAgICAgID4+PiBpbXBvcnQgdW5pdHRlc3QKICAgICAgPj4+IHJlc3VsdCA9IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCiAgICAgID4+PiBwcmludCByZXN1bHQuZmFpbHVyZXNbMF1bMV0gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICAgVHJhY2ViYWNrIC4uLgogICAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICAgIGZhdm9yaXRlX2NvbG9yCiAgICAgIC4uLgogICAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICAgIGlmIDE6CiAgICAgIC4uLgoKICAgIE5vdGUgdGhhdCB3ZSBzZWUgYm90aCBmYWlsdXJlcyBkaXNwbGF5ZWQuCgogICAgICA+Pj4gb2xkID0gZG9jdGVzdC5zZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MoCiAgICAgIC4uLiAgICBkb2N0ZXN0LlJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUpCgogICAgTm93LCB3aGVuIHdlIHJ1biB0aGUgdGVzdDoKCiAgICAgID4+PiByZXN1bHQgPSBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQogICAgICA+Pj4gcHJpbnQgcmVzdWx0LmZhaWx1cmVzWzBdWzFdICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICAgIFRyYWNlYmFjayAuLi4KICAgICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgICBmYXZvcml0ZV9jb2xvcgogICAgICBFeGNlcHRpb24gcmFpc2VkOgogICAgICAgICAgLi4uCiAgICAgICAgICBOYW1lRXJyb3I6IG5hbWUgJ2Zhdm9yaXRlX2NvbG9yJyBpcyBub3QgZGVmaW5lZAogICAgICA8QkxBTktMSU5FPgogICAgICA8QkxBTktMSU5FPgoKICAgIFdlIGdldCBvbmx5IHRoZSBmaXJzdCBmYWlsdXJlLgoKICAgIElmIHdlIGdpdmUgYW55IHJlcG9ydGluZyBvcHRpb25zIHdoZW4gd2Ugc2V0IHVwIHRoZSB0ZXN0cywKICAgIGhvd2V2ZXI6CgogICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCiAgICAgIC4uLiAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUgfCBkb2N0ZXN0LlJFUE9SVF9ORElGRikKCiAgICBUaGVuIHRoZSBkZWZhdWx0IGVwb3J0aW5nIG9wdGlvbnMgYXJlIGlnbm9yZWQ6CgogICAgICA+Pj4gcmVzdWx0ID0gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgPj4+IHByaW50IHJlc3VsdC5mYWlsdXJlc1swXVsxXSAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgICBUcmFjZWJhY2sgLi4uCiAgICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgICAgZmF2b3JpdGVfY29sb3IKICAgICAgLi4uCiAgICAgIEZhaWxlZCBleGFtcGxlOgogICAgICAgICAgaWYgMToKICAgICAgICAgICAgIHByaW50ICdhJwogICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgIHByaW50ICdiJwogICAgICBEaWZmZXJlbmNlcyAobmRpZmYgd2l0aCAtZXhwZWN0ZWQgK2FjdHVhbCk6CiAgICAgICAgICAgIGEKICAgICAgICAgIC0gPEJMQU5LTElORT4KICAgICAgICAgICsKICAgICAgICAgICAgYgogICAgICA8QkxBTktMSU5FPgogICAgICA8QkxBTktMSU5FPgoKCiAgICBUZXN0IHJ1bm5lcnMgY2FuIHJlc3RvcmUgdGhlIGZvcm1hdHRpbmcgZmxhZ3MgYWZ0ZXIgdGhleSBydW46CgogICAgICA+Pj4gaWdub3JlZCA9IGRvY3Rlc3Quc2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKG9sZCkKCiAgICBOKAAAAAAoAAAAACgAAAAAKAAAAABzfAAAAC9ob21lL3ZhZ3JhbnQvcnBtYnVpbGQvQlVJTEQvYnVpbGQtdG9vbGNoYWluL29wdC90b29sY2hhaW5zL3N0YmdjYy00LjgtMS4wL3B5dGhvbi1ydW50aW1lL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHl0GQAAAHRlc3RfdW5pdHRlc3RfcmVwb3J0ZmxhZ3PpCAAAcwAAAABjAAAAAAAAAAABAAAAQwAAAHMEAAAAZAEAUygCAAAAc3IXAAAKVGVzdHMgZm9yIHRoZSBgdGVzdGZpbGUoKWAgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIHJ1bnMgYWxsIHRoZQpkb2N0ZXN0IGV4YW1wbGVzIGluIGEgZ2l2ZW4gZmlsZS4gIEluIGl0cyBzaW1wbGUgaW52b2thdGlvbiwgaXQgaXMKY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgYSBmaWxlLCB3aGljaCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUKY2FsbGluZyBtb2R1bGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzICgjZmFpbHVyZXMsICN0ZXN0cykuCgpXZSBkb24ndCB3YW50IGAtdmAgaW4gc3lzLmFyZ3YgZm9yIHRoZXNlIHRlc3RzLgoKICAgID4+PiBzYXZlX2FyZ3YgPSBzeXMuYXJndgogICAgPj4+IGlmICctdicgaW4gc3lzLmFyZ3Y6CiAgICAuLi4gICAgIHN5cy5hcmd2ID0gW2FyZyBmb3IgYXJnIGluIHNhdmVfYXJndiBpZiBhcmcgIT0gJy12J10KCgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAiLi4uIiwgbGluZSA2LCBpbiB0ZXN0X2RvY3Rlc3QudHh0CiAgICBGYWlsZWQgZXhhbXBsZToKICAgICAgICBmYXZvcml0ZV9jb2xvcgogICAgRXhjZXB0aW9uIHJhaXNlZDoKICAgICAgICAuLi4KICAgICAgICBOYW1lRXJyb3I6IG5hbWUgJ2Zhdm9yaXRlX2NvbG9yJyBpcyBub3QgZGVmaW5lZAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgMSBpdGVtcyBoYWQgZmFpbHVyZXM6CiAgICAgICAxIG9mICAgMiBpbiB0ZXN0X2RvY3Rlc3QudHh0CiAgICAqKipUZXN0IEZhaWxlZCoqKiAxIGZhaWx1cmVzLgogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQogICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCgooTm90ZTogd2UnbGwgYmUgY2xlYXJpbmcgZG9jdGVzdC5tYXN0ZXIgYWZ0ZXIgZWFjaCBjYWxsIHRvCmBkb2N0ZXN0LnRlc3RmaWxlYCwgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgbXVsdGlwbGUgdGVzdHMgd2l0aCB0aGUKc2FtZSBuYW1lLikKCkdsb2JhbHMgbWF5IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBgZ2xvYnNgIGFuZCBgZXh0cmFnbG9ic2AgcGFyYW1ldGVyczoKCiAgICA+Pj4gZ2xvYnMgPSB7J2Zhdm9yaXRlX2NvbG9yJzogJ2JsdWUnfQogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icykKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgoKICAgID4+PiBleHRyYWdsb2JzID0geydmYXZvcml0ZV9jb2xvcic6ICdyZWQnfQogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icywKICAgIC4uLiAgICAgICAgICAgICAgICAgIGV4dHJhZ2xvYnM9ZXh0cmFnbG9icykgIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgIi4uLiIsIGxpbmUgNiwgaW4gdGVzdF9kb2N0ZXN0LnR4dAogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgZmF2b3JpdGVfY29sb3IKICAgIEV4cGVjdGVkOgogICAgICAgICdibHVlJwogICAgR290OgogICAgICAgICdyZWQnCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAxIGl0ZW1zIGhhZCBmYWlsdXJlczoKICAgICAgIDEgb2YgICAyIGluIHRlc3RfZG9jdGVzdC50eHQKICAgICoqKlRlc3QgRmFpbGVkKioqIDEgZmFpbHVyZXMuCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCiAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KClRoZSBmaWxlIG1heSBiZSBtYWRlIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gbW9kdWxlIG9yIHBhY2thZ2UsIHVzaW5nIHRoZQpvcHRpb25hbCBgbW9kdWxlX3JlbGF0aXZlYCBwYXJhbWV0ZXI6CgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icywKICAgIC4uLiAgICAgICAgICAgICAgICAgIG1vZHVsZV9yZWxhdGl2ZT0ndGVzdCcpCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCiAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KClZlcmJvc2l0eSBjYW4gYmUgaW5jcmVhc2VkIHdpdGggdGhlIG9wdGlvbmFsIGB2ZXJib3NlYCBwYXJhbWV0ZXI6CgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icywgdmVyYm9zZT1UcnVlKQogICAgVHJ5aW5nOgogICAgICAgIGZhdm9yaXRlX2NvbG9yCiAgICBFeHBlY3Rpbmc6CiAgICAgICAgJ2JsdWUnCiAgICBvawogICAgVHJ5aW5nOgogICAgICAgIGlmIDE6CiAgICAgICAgICAgcHJpbnQgJ2EnCiAgICAgICAgICAgcHJpbnQKICAgICAgICAgICBwcmludCAnYicKICAgIEV4cGVjdGluZzoKICAgICAgICBhCiAgICAgICAgPEJMQU5LTElORT4KICAgICAgICBiCiAgICBvawogICAgMSBpdGVtcyBwYXNzZWQgYWxsIHRlc3RzOgogICAgICAgMiB0ZXN0cyBpbiB0ZXN0X2RvY3Rlc3QudHh0CiAgICAyIHRlc3RzIGluIDEgaXRlbXMuCiAgICAyIHBhc3NlZCBhbmQgMCBmYWlsZWQuCiAgICBUZXN0IHBhc3NlZC4KICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgoKVGhlIG5hbWUgb2YgdGhlIHRlc3QgbWF5IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBvcHRpb25hbCBgbmFtZWAKcGFyYW1ldGVyOgoKICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgbmFtZT0nbmV3bmFtZScpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgIi4uLiIsIGxpbmUgNiwgaW4gbmV3bmFtZQogICAgLi4uCiAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCiAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KClRoZSBzdW1tYXJ5IHJlcG9ydCBtYXkgYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSBvcHRpb25hbCBgcmVwb3J0YApwYXJhbWV0ZXI6CgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCByZXBvcnQ9RmFsc2UpCiAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZpbGUgIi4uLiIsIGxpbmUgNiwgaW4gdGVzdF9kb2N0ZXN0LnR4dAogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgZmF2b3JpdGVfY29sb3IKICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgLi4uCiAgICAgICAgTmFtZUVycm9yOiBuYW1lICdmYXZvcml0ZV9jb2xvcicgaXMgbm90IGRlZmluZWQKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgoKVGhlIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgYHJhaXNlX29uX2Vycm9yYCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbgpleGNlcHRpb24gb24gdGhlIGZpcnN0IGVycm9yICh3aGljaCBtYXkgYmUgdXNlZnVsIGZvciBwb3N0bW9ydGVtCmRlYnVnZ2luZyk6CgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCByYWlzZV9vbl9lcnJvcj1UcnVlKQogICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICBVbmV4cGVjdGVkRXhjZXB0aW9uOiAuLi4KICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgoKSWYgdGhlIHRlc3RzIGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIHRoZSB0ZXN0cyBtaWdodCBmYWlsLCBzaW5jZQppdCdzIHVua25vd24gd2hpY2ggZW5jb2RpbmcgaXMgdXNlZC4gVGhlIGVuY29kaW5nIGNhbiBiZSBzcGVjaWZpZWQKdXNpbmcgdGhlIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgYGVuY29kaW5nYDoKCiAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0NC50eHQnKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRmlsZSAiLi4uIiwgbGluZSA3LCBpbiB0ZXN0X2RvY3Rlc3Q0LnR4dAogICAgRmFpbGVkIGV4YW1wbGU6CiAgICAgICAgdScuLi4nCiAgICBFeHBlY3RlZDoKICAgICAgICB1J2ZceGY2XHhmNicKICAgIEdvdDoKICAgICAgICB1J2ZceGMzXHhiNlx4YzNceGI2JwogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLi4uCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAxIGl0ZW1zIGhhZCBmYWlsdXJlczoKICAgICAgIDIgb2YgICA0IGluIHRlc3RfZG9jdGVzdDQudHh0CiAgICAqKipUZXN0IEZhaWxlZCoqKiAyIGZhaWx1cmVzLgogICAgVGVzdFJlc3VsdHMoZmFpbGVkPTIsIGF0dGVtcHRlZD00KQogICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCgogICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdDQudHh0JywgZW5jb2Rpbmc9J3V0Zi04JykKICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgoKU3dpdGNoIHRoZSBtb2R1bGUgZW5jb2RpbmcgdG8gJ3V0Zi04JyB0byB0ZXN0IHRoZSB2ZXJib3NlIG91dHB1dCB3aXRob3V0CmJvdGhlcmluZyB3aXRoIHRoZSBjdXJyZW50IHN5cy5zdGRvdXQgZW5jb2RpbmcuCgogICAgPj4+IGRvY3Rlc3QuX2VuY29kaW5nLCBzYXZlZF9lbmNvZGluZyA9ICd1dGYtOCcsIGRvY3Rlc3QuX2VuY29kaW5nCiAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0NC50eHQnLCBlbmNvZGluZz0ndXRmLTgnLCB2ZXJib3NlPVRydWUpCiAgICBUcnlpbmc6CiAgICAgICAgdSdmw7bDticKICAgIEV4cGVjdGluZzoKICAgICAgICB1J2ZceGY2XHhmNicKICAgIG9rCiAgICBUcnlpbmc6CiAgICAgICAgdSdixIVyJwogICAgRXhwZWN0aW5nOgogICAgICAgIHUnYlx1MDEwNXInCiAgICBvawogICAgVHJ5aW5nOgogICAgICAgICdmw7bDticKICAgIEV4cGVjdGluZzoKICAgICAgICAnZlx4YzNceGI2XHhjM1x4YjYnCiAgICBvawogICAgVHJ5aW5nOgogICAgICAgICdixIVyJwogICAgRXhwZWN0aW5nOgogICAgICAgICdiXHhjNFx4ODVy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dHMgdGhhdCBvYmplY3RzIG91dHNpZGUgbTEgYXJlIGV4Y2x1ZGVkOgoKICAgICAgICA+Pj4gZnJvbSBkb2N0ZXN0IGltcG9ydCBUZXN0ZXIKICAgICAgICA+Pj4gdCA9IFRlc3RlcihnbG9icz17fSwgdmVyYm9zZT0wKQogICAgICAgID4+PiB0LnJ1bmRpY3QobTEuX19kaWN0X18sICJydW5kaWN0X3Rlc3QiLCBtMSkgICMgZjIgYW5kIGcyIGFuZCBoMiBza2lwcGVkCiAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD00KQoKICAgICAgICBPbmNlIG1vcmUsIG5vdCBleGNsdWRpbmcgc3R1ZmYgb3V0c2lkZSBtMToKCiAgICAgICAgPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9e30sIHZlcmJvc2U9MCkKICAgICAgICA+Pj4gdC5ydW5kaWN0KG0xLl9fZGljdF9fLCAicnVuZGljdF90ZXN0X3B2dCIpICAjIE5vbmUgYXJlIHNraXBwZWQuCiAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD04KQoKICAgICAgICBUaGUgZXhjbHVzaW9uIG9mIG9iamVjdHMgZnJvbSBvdXRzaWRlIHRoZSBkZXNpZ25hdGVkIG1vZHVsZSBpcwogICAgICAgIG1lYW50IHRvIGJlIGludm9rZWQgYXV0b21hZ2ljYWxseSBieSB0ZXN0bW9kLgoKICAgICAgICA+Pj4gZG9jdGVzdC50ZXN0bW9kKG0xLCB2ZXJib3NlPUZhbHNlKQogICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKTigAAAAAKAAAAAAoAAAAACgAAAAAc3wAAAAvaG9tZS92YWdyYW50L3JwbWJ1aWxkL0JVSUxEL2J1aWxkLXRvb2xjaGFpbi9vcHQvdG9vbGNoYWlucy9zdGJnY2MtNC44LTEuMC9weXRob24tcnVudGltZS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5dAkAAABvbGRfdGVzdDQ/CgAAcwAAAABjAAAAAAIAAAAIAAAAQwAAAHORAAAAdAAAagEAdAIAZAEAdAMAgwEBAWQC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