LyoKKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRzY2FwZSBQdWJsaWMKKiBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQoqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgoqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTlBMLwoqCiogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzc2VkCiogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCiogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKgoqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCioKKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgTmV0c2NhcGUKKiBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgTmV0c2NhcGUgYXJlCiogQ29weXJpZ2h0IChDKSAxOTk4IE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgoqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioKKiBDb250cmlidXRvcihzKTogcHNjaHdhcnRhdUBuZXRzY2FwZS5jb20KKiBEYXRlOiAyMDAxLTA3LTEzCioKKiBTVU1NQVJZOiBBcHBseWluZyBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCB0byB0aGUgRnVuY3Rpb24gb2JqZWN0IGl0c2VsZgoqCioKKiBFQ01BLTI2MiAxNS4zLjQuNCBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCAodGhpc0FyZyBbLGFyZzEgWyxhcmcyLIVdIF0gKQoqCiogV2hlbiBhcHBsaWVkIHRvIHRoZSBGdW5jdGlvbiBvYmplY3QgaXRzZWxmLCB0aGlzQXJnIHNob3VsZCBiZSBpZ25vcmVkLgoqIEFzIGV4cGxhaW5lZCBieSBXYWxkZW1hciAod2FsZGVtYXJAbmV0c2NhcGUuY29tKToKKgoqIEZ1bmN0aW9uLmNhbGwob2JqLCAicHJpbnQodGhpcykiKSBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nCiogRnVuY3Rpb24oInByaW50KHRoaXMpIikgd2l0aCB0aGlzIHNldCB0byBvYmouIE5vdywgRnVuY3Rpb24oInByaW50KHRoaXMpIikKKiBpcyBlcXVpdmFsZW50IHRvIG5ldyBGdW5jdGlvbigicHJpbnQodGhpcykiKSAoc2VlIDE1LjMuMS4xKSwgYW5kIHRoZSBsYXR0ZXIKKiBpZ25vcmVzIHRoZSB0aGlzIHZhbHVlIHRoYXQgeW91IHBhc3NlZCBpdCBhbmQgY29uc3RydWN0cyBhIGZ1bmN0aW9uCiogKHdoaWNoIHdlJ2xsIGNhbGwgRikgd2hpY2ggd2lsbCBwcmludCB0aGUgdmFsdWUgb2YgdGhlIHRoaXMgdGhhdCB3aWxsIGJlCiogcGFzc2VkIGluIHdoZW4gRiB3aWxsIGJlIGludm9rZWQuCioKKiBXaXRoIHRoZSBsYXN0IHNldCBvZiAoKSB5b3UncmUgaW52b2tpbmcgRigpLCB3aGljaCBtZWFucyB5b3UncmUgY2FsbGluZyBpdAoqIHdpdGggbm8gdGhpcyB2YWx1ZS4gV2hlbiB5b3UgZG9uJ3QgcHJvdmlkZSBhIHRoaXMgdmFsdWUsIGl0IGRlZmF1bHRzIHRvIHRoZQoqIGdsb2JhbCBvYmplY3QuCioKKi8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2YXIgVUJvdW5kID0gMDsKdmFyIGJ1ZyA9ICcobm9uZSknOwp2YXIgc3VtbWFyeSA9ICdBcHBseWluZyBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCB0byB0aGUgRnVuY3Rpb24gb2JqZWN0IGl0c2VsZic7CnZhciBzdGF0dXMgPSAnJzsKdmFyIHN0YXR1c2l0ZW1zID0gW107CnZhciBhY3R1YWwgPSAnJzsKdmFyIGFjdHVhbHZhbHVlcyA9IFtdOwp2YXIgZXhwZWN0PSAnJzsKdmFyIGV4cGVjdGVkdmFsdWVzID0gW107CnZhciBzZWxmID0gdGhpczsgLy8gY2FwdHVyZSBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdAp2YXIgY25PQkpFQ1RfR0xPQkFMID0gc2VsZi50b1N0cmluZygpOwp2YXIgY25PQkpFQ1RfT0JKRUNUID0gKG5ldyBPYmplY3QpLnRvU3RyaW5nKCk7CnZhciBjbkhlbGxvID0gJ0hlbGxvJzsKdmFyIGNuUmVkID0gJ3JlZCc7CnZhciBvYmpURVNUID0ge2NvbG9yOmNuUmVkfTsKdmFyIGYgPSBuZXcgRnVuY3Rpb24oKTsKdmFyIGcgPSBuZXcgRnVuY3Rpb24oKTsKCgpmID0gRnVuY3Rpb24uY2FsbChzZWxmLCAncmV0dXJuIGNuSGVsbG8nKTsKZyA9IEZ1bmN0aW9uLmNhbGwob2JqVEVTVCwgJ3JldHVybiBjbkhlbGxvJyk7CgpzdGF0dXMgPSAnU2VjdGlvbiBBIG9mIHRlc3QnOwphY3R1YWwgPSBmKCk7CmV4cGVjdCA9IGNuSGVsbG87CmNhcHR1cmVUaGlzKCk7CgpzdGF0dXMgPSAnU2VjdGlvbiBCIG9mIHRlc3QnOwphY3R1YWwgPSBnKCk7CmV4cGVjdCA9IGNuSGVsbG87CmNhcHR1cmVUaGlzKCk7CgoKZiA9IEZ1bmN0aW9uLmNhbGwoc2VsZiwgJ3JldHVybiB0aGlzLnRvU3RyaW5nKCknKTsKZyA9IEZ1bmN0aW9uLmNhbGwob2JqVEVTVCwgJ3JldHVybiB0aGlzLnRvU3RyaW5nKCknKTsKCnN0YXR1cyA9ICdTZWN0aW9uIEMgb2YgdGVzdCc7CmFjdHVhbCA9IGYoKTsKZXhwZWN0ID0gY25PQkpFQ1RfR0xPQkFMOwpjYXB0dXJlVGhpcygpOwoKc3RhdHVzID0gJ1NlY3Rpb24gRCBvZiB0ZXN0JzsKYWN0dWFsID0gZygpOwpleHBlY3QgPSBjbk9CSkVDVF9HTE9CQUw7CmNhcHR1cmVUaGlzKCk7CgoKZiA9IEZ1bmN0aW9uLmNhbGwoc2VsZiwgJ3JldHVybiB0aGlzLmNvbG9yJyk7CmcgPSBGdW5jdGlvbi5jYWxsKG9ialRFU1QsICdyZXR1cm4gdGhpcy5jb2xvcicpOwoKc3RhdHVzID0gJ1NlY3Rpb24gRSBvZiB0ZXN0JzsKYWN0dWFsID0gZigpOwpleHBlY3QgPSB1bmRlZmluZWQ7CmNhcHR1cmVUaGlzKCk7CgpzdGF0dXMgPSAnU2VjdGlvbiBGIG9mIHRlc3QnOwphY3R1YWwgPSBnKCk7CmV4cGVjdCA9IHVuZGVmaW5lZDsKY2FwdHVyZVRoaXMoKTsKCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0ZXN0KCk7Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpmdW5jdGlvbiBjYXB0dXJlVGhpcygpCnsKICBzdGF0dXNpdGVtc1tVQm91bmRdID0gc3RhdHVzOwogIGFjdHVhbHZhbHVlc1tVQm91bmRdID0gYWN0dWFsOwogIGV4cGVjdGVkdmFsdWVzW1VCb3VuZF0gPSBleHBlY3Q7CiAgVUJvdW5kKys7Cn0KCgpmdW5jdGlvbiB0ZXN0KCkKewogIGVudGVyRnVuYyAoJ3Rlc3QnKTsKICBwcmludEJ1Z051bWJlciAoYnVnKTsKICBwcmludFN0YXR1cyAoc3VtbWFyeSk7CgogIGZvciAodmFyIGkgPSAwOyBpIDwgVUJvdW5kOyBpKyspCiAgewogICAgcmVwb3J0Q29tcGFyZShleHBlY3RlZHZhbHVlc1tpXSwgYWN0dWFsdmFsdWVzW2ldLCBzdGF0dXNpdGVtc1tpXSk7CiAgfQoKICBleGl0RnVuYyAoJ3Rlc3QnKTsKfQo=