LyoKICBTb3J0VGFibGUKICB2ZXJzaW9uIDIKICA3dGggQXByaWwgMjAwNwogIFN0dWFydCBMYW5ncmlkZ2UsIGh0dHA6Ly93d3cua3J5b2dlbml4Lm9yZy9jb2RlL2Jyb3dzZXIvc29ydHRhYmxlLwoKICBJbnN0cnVjdGlvbnM6CiAgRG93bmxvYWQgdGhpcyBmaWxlCiAgQWRkIDxzY3JpcHQgc3JjPSJzb3J0dGFibGUuanMiPjwvc2NyaXB0PiB0byB5b3VyIEhUTUwKICBBZGQgY2xhc3M9InNvcnRhYmxlIiB0byBhbnkgdGFibGUgeW91J2QgbGlrZSB0byBtYWtlIHNvcnRhYmxlCiAgQ2xpY2sgb24gdGhlIGhlYWRlcnMgdG8gc29ydAoKICBUaGFua3MgdG8gbWFueSwgbWFueSBwZW9wbGUgZm9yIGNvbnRyaWJ1dGlvbnMgYW5kIHN1Z2dlc3Rpb25zLgogIExpY2VuY2VkIGFzIFgxMTogaHR0cDovL3d3dy5rcnlvZ2VuaXgub3JnL2NvZGUvYnJvd3Nlci9saWNlbmNlLmh0bWwKICBUaGlzIGJhc2ljYWxseSBtZWFuczogZG8gd2hhdCB5b3Ugd2FudCB3aXRoIGl0LgoqLwoKCnZhciBzdElzSUUgPSAvKkBjY19vbiFAKi9mYWxzZTsKCnNvcnR0YWJsZSA9IHsKICBpbml0OiBmdW5jdGlvbigpIHsKICAgIC8vIHF1aXQgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAogICAgaWYgKGFyZ3VtZW50cy5jYWxsZWUuZG9uZSkgcmV0dXJuOwogICAgLy8gZmxhZyB0aGlzIGZ1bmN0aW9uIHNvIHdlIGRvbid0IGRvIHRoZSBzYW1lIHRoaW5nIHR3aWNlCiAgICBhcmd1bWVudHMuY2FsbGVlLmRvbmUgPSB0cnVlOwogICAgLy8ga2lsbCB0aGUgdGltZXIKICAgIGlmIChfdGltZXIpIGNsZWFySW50ZXJ2YWwoX3RpbWVyKTsKCiAgICBpZiAoIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSByZXR1cm47CgogICAgc29ydHRhYmxlLkRBVEVfUkUgPSAvXihcZFxkPylbXC9cLi1dKFxkXGQ/KVtcL1wuLV0oKFxkXGQpP1xkXGQpJC87CgogICAgZm9yRWFjaChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGFibGUnKSwgZnVuY3Rpb24odGFibGUpIHsKICAgICAgaWYgKHRhYmxlLmNsYXNzTmFtZS5zZWFyY2goL1xic29ydGFibGVcYi8pICE9IC0xKSB7CiAgICAgICAgc29ydHRhYmxlLm1ha2VTb3J0YWJsZSh0YWJsZSk7CiAgICAgIH0KICAgIH0pOwoKICB9LAoKICBtYWtlU29ydGFibGU6IGZ1bmN0aW9uKHRhYmxlKSB7CiAgICBpZiAodGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RoZWFkJykubGVuZ3RoID09IDApIHsKICAgICAgLy8gdGFibGUgZG9lc24ndCBoYXZlIGEgdEhlYWQuIFNpbmNlIGl0IHNob3VsZCBoYXZlLCBjcmVhdGUgb25lIGFuZAogICAgICAvLyBwdXQgdGhlIGZpcnN0IHRhYmxlIHJvdyBpbiBpdC4KICAgICAgdGhlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGhlYWQnKTsKICAgICAgdGhlLmFwcGVuZENoaWxkKHRhYmxlLnJvd3NbMF0pOwogICAgICB0YWJsZS5pbnNlcnRCZWZvcmUodGhlLHRhYmxlLmZpcnN0Q2hpbGQpOwogICAgfQogICAgLy8gU2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0YWJsZS50SGVhZCwgc2lnaAogICAgaWYgKHRhYmxlLnRIZWFkID09IG51bGwpIHRhYmxlLnRIZWFkID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RoZWFkJylbMF07CgogICAgaWYgKHRhYmxlLnRIZWFkLnJvd3MubGVuZ3RoICE9IDEpIHJldHVybjsgLy8gY2FuJ3QgY29wZSB3aXRoIHR3byBoZWFkZXIgcm93cwoKICAgIC8vIFNvcnR0YWJsZSB2MSBwdXQgcm93cyB3aXRoIGEgY2xhc3Mgb2YgInNvcnRib3R0b20iIGF0IHRoZSBib3R0b20gKGFzCiAgICAvLyAidG90YWwiIHJvd3MsIGZvciBleGFtcGxlKS4gVGhpcyBpcyBCJlIsIHNpbmNlIHdoYXQgeW91J3JlIHN1cHBvc2VkCiAgICAvLyB0byBkbyBpcyBwdXQgdGhlbSBpbiBhIHRmb290LiBTbywgaWYgdGhlcmUgYXJlIHNvcnRib3R0b20gcm93cywKICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBtb3ZlIHRoZW0gdG8gdGZvb3QgKGNyZWF0aW5nIGl0IGlmIG5lZWRlZCkuCiAgICBzb3J0Ym90dG9tcm93cyA9IFtdOwogICAgZm9yICh2YXIgaT0wOyBpPHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRhYmxlLnJvd3NbaV0uY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0Ym90dG9tXGIvKSAhPSAtMSkgewogICAgICAgIHNvcnRib3R0b21yb3dzW3NvcnRib3R0b21yb3dzLmxlbmd0aF0gPSB0YWJsZS5yb3dzW2ldOwogICAgICB9CiAgICB9CiAgICBpZiAoc29ydGJvdHRvbXJvd3MpIHsKICAgICAgaWYgKHRhYmxlLnRGb290ID09IG51bGwpIHsKICAgICAgICAvLyB0YWJsZSBkb2Vzbid0IGhhdmUgYSB0Zm9vdC4gQ3JlYXRlIG9uZS4KICAgICAgICB0Zm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zm9vdCcpOwogICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRmbyk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaT0wOyBpPHNvcnRib3R0b21yb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGZvLmFwcGVuZENoaWxkKHNvcnRib3R0b21yb3dzW2ldKTsKICAgICAgfQogICAgICBkZWxldGUgc29ydGJvdHRvbXJvd3M7CiAgICB9CgogICAgLy8gd29yayB0aHJvdWdoIGVhY2ggY29sdW1uIGFuZCBjYWxjdWxhdGUgaXRzIHR5cGUKICAgIGhlYWRyb3cgPSB0YWJsZS50SGVhZC5yb3dzWzBdLmNlbGxzOwogICAgZm9yICh2YXIgaT0wOyBpPGhlYWRyb3cubGVuZ3RoOyBpKyspIHsKICAgICAgLy8gbWFudWFsbHkgb3ZlcnJpZGUgdGhlIHR5cGUgd2l0aCBhIHNvcnR0YWJsZV90eXBlIGF0dHJpYnV0ZQogICAgICBpZiAoIWhlYWRyb3dbaV0uY2xhc3NOYW1lLm1hdGNoKC9cYnNvcnR0YWJsZV9ub3NvcnRcYi8pKSB7IC8vIHNraXAgdGhpcyBjb2wKICAgICAgICBtdGNoID0gaGVhZHJvd1tpXS5jbGFzc05hbWUubWF0Y2goL1xic29ydHRhYmxlXyhbYS16MC05XSspXGIvKTsKICAgICAgICBpZiAobXRjaCkgeyBvdmVycmlkZSA9IG10Y2hbMV07IH0KCSAgICAgIGlmIChtdGNoICYmIHR5cGVvZiBzb3J0dGFibGVbInNvcnRfIitvdmVycmlkZV0gPT0gJ2Z1bmN0aW9uJykgewoJICAgICAgICBoZWFkcm93W2ldLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24gPSBzb3J0dGFibGVbInNvcnRfIitvdmVycmlkZV07CgkgICAgICB9IGVsc2UgewoJICAgICAgICBoZWFkcm93W2ldLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24gPSBzb3J0dGFibGUuZ3Vlc3NUeXBlKHRhYmxlLGkpOwoJICAgICAgfQoJICAgICAgLy8gbWFrZSBpdCBjbGlja2FibGUgdG8gc29ydAoJICAgICAgaGVhZHJvd1tpXS5zb3J0dGFibGVfY29sdW1uaW5kZXggPSBpOwoJICAgICAgaGVhZHJvd1tpXS5zb3J0dGFibGVfdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdOwoJICAgICAgZGVhbl9hZGRFdmVudChoZWFkcm93W2ldLCJjbGljayIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnR0YWJsZV9zb3J0ZWRcYi8pICE9IC0xKSB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgc29ydGVkIGJ5IHRoaXMgY29sdW1uLCBqdXN0CiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIHRhYmxlLCB3aGljaCBpcyBxdWlja2VyCiAgICAgICAgICAgIHNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuc29ydHRhYmxlX3Rib2R5KTsKICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNlKCdzb3J0dGFibGVfc29ydGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3J0dGFibGVfc29ydGVkX3JldmVyc2UnKTsKICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc29ydHRhYmxlX3NvcnRmd2RpbmQnKSk7CiAgICAgICAgICAgIHNvcnRyZXZpbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgIHNvcnRyZXZpbmQuaWQgPSAic29ydHRhYmxlX3NvcnRyZXZpbmQiOwogICAgICAgICAgICBzb3J0cmV2aW5kLmlubmVySFRNTCA9IHN0SXNJRSA/ICcmbmJzcDxmb250IGZhY2U9IndlYmRpbmdzIj41PC9mb250PicgOiAnJm5ic3A7JiN4MjVCNDsnOwogICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHNvcnRyZXZpbmQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnR0YWJsZV9zb3J0ZWRfcmV2ZXJzZVxiLykgIT0gLTEpIHsKICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBzb3J0ZWQgYnkgdGhpcyBjb2x1bW4gaW4gcmV2ZXJzZSwganVzdAogICAgICAgICAgICAvLyByZS1yZXZlcnNlIHRoZSB0YWJsZSwgd2hpY2ggaXMgcXVpY2tlcgogICAgICAgICAgICBzb3J0dGFibGUucmV2ZXJzZSh0aGlzLnNvcnR0YWJsZV90Ym9keSk7CiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUucmVwbGFjZSgnc29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3J0dGFibGVfc29ydGVkJyk7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NvcnR0YWJsZV9zb3J0cmV2aW5kJykpOwogICAgICAgICAgICBzb3J0ZndkaW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBzb3J0ZndkaW5kLmlkID0gInNvcnR0YWJsZV9zb3J0ZndkaW5kIjsKICAgICAgICAgICAgc29ydGZ3ZGluZC5pbm5lckhUTUwgPSBzdElzSUUgPyAnJm5ic3A8Zm9udCBmYWNlPSJ3ZWJkaW5ncyI+NjwvZm9udD4nIDogJyZuYnNwOyYjeDI1QkU7JzsKICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChzb3J0ZndkaW5kKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHJlbW92ZSBzb3J0dGFibGVfc29ydGVkIGNsYXNzZXMKICAgICAgICAgIHRoZWFkcm93ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAgICAgZm9yRWFjaCh0aGVhZHJvdy5jaGlsZE5vZGVzLCBmdW5jdGlvbihjZWxsKSB7CiAgICAgICAgICAgIGlmIChjZWxsLm5vZGVUeXBlID09IDEpIHsgLy8gYW4gZWxlbWVudAogICAgICAgICAgICAgIGNlbGwuY2xhc3NOYW1lID0gY2VsbC5jbGFzc05hbWUucmVwbGFjZSgnc29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlJywnJyk7CiAgICAgICAgICAgICAgY2VsbC5jbGFzc05hbWUgPSBjZWxsLmNsYXNzTmFtZS5yZXBsYWNlKCdzb3J0dGFibGVfc29ydGVkJywnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgc29ydGZ3ZGluZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0dGFibGVfc29ydGZ3ZGluZCcpOwogICAgICAgICAgaWYgKHNvcnRmd2RpbmQpIHsgc29ydGZ3ZGluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRmd2RpbmQpOyB9CiAgICAgICAgICBzb3J0cmV2aW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NvcnR0YWJsZV9zb3J0cmV2aW5kJyk7CiAgICAgICAgICBpZiAoc29ydHJldmluZCkgeyBzb3J0cmV2aW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc29ydHJldmluZCk7IH0KCiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHNvcnR0YWJsZV9zb3J0ZWQnOwogICAgICAgICAgc29ydGZ3ZGluZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgIHNvcnRmd2RpbmQuaWQgPSAic29ydHRhYmxlX3NvcnRmd2RpbmQiOwogICAgICAgICAgc29ydGZ3ZGluZC5pbm5lckhUTUwgPSBzdElzSUUgPyAnJm5ic3A8Zm9udCBmYWNlPSJ3ZWJkaW5ncyI+NjwvZm9udD4nIDogJyZuYnNwOyYjeDI1QkU7JzsKICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoc29ydGZ3ZGluZCk7CgoJICAgICAgICAvLyBidWlsZCBhbiBhcnJheSB0byBzb3J0LiBUaGlzIGlzIGEgU2Nod2FydHppYW4gdHJhbnNmb3JtIHRoaW5nLAoJICAgICAgICAvLyBpLmUuLCB3ZSAiZGVjb3JhdGUiIGVhY2ggcm93IHdpdGggdGhlIGFjdHVhbCBzb3J0IGtleSwKCSAgICAgICAgLy8gc29ydCBiYXNlZCBvbiB0aGUgc29ydCBrZXlzLCBhbmQgdGhlbiBwdXQgdGhlIHJvd3MgYmFjayBpbiBvcmRlcgoJICAgICAgICAvLyB3aGljaCBpcyBhIGxvdCBmYXN0ZXIgYmVjYXVzZSB5b3Ugb25seSBkbyBnZXRJbm5lclRleHQgb25jZSBwZXIgcm93CgkgICAgICAgIHJvd19hcnJheSA9IFtdOwoJICAgICAgICBjb2wgPSB0aGlzLnNvcnR0YWJsZV9jb2x1bW5pbmRleDsKCSAgICAgICAgcm93cyA9IHRoaXMuc29ydHRhYmxlX3Rib2R5LnJvd3M7CgkgICAgICAgIGZvciAodmFyIGo9MDsgajxyb3dzLmxlbmd0aDsgaisrKSB7CgkgICAgICAgICAgcm93X2FycmF5W3Jvd19hcnJheS5sZW5ndGhdID0gW3NvcnR0YWJsZS5nZXRJbm5lclRleHQocm93c1tqXS5jZWxsc1tjb2xdKSwgcm93c1tqXV07CgkgICAgICAgIH0KCSAgICAgICAgLyogSWYgeW91IHdhbnQgYSBzdGFibGUgc29ydCwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSAqLwoJICAgICAgICBzb3J0dGFibGUuc2hha2VyX3NvcnQocm93X2FycmF5LCB0aGlzLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24pOwoJICAgICAgICAvKiBhbmQgY29tbWVudCBvdXQgdGhpcyBvbmUgKi8KCSAgICAgICAgLy9yb3dfYXJyYXkuc29ydCh0aGlzLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24pOwoKCSAgICAgICAgdGIgPSB0aGlzLnNvcnR0YWJsZV90Ym9keTsKCSAgICAgICAgZm9yICh2YXIgaj0wOyBqPHJvd19hcnJheS5sZW5ndGg7IGorKykgewoJICAgICAgICAgIHRiLmFwcGVuZENoaWxkKHJvd19hcnJheVtqXVsxXSk7CgkgICAgICAgIH0KCgkgICAgICAgIGRlbGV0ZSByb3dfYXJyYXk7CgkgICAgICB9KTsKCSAgICB9CiAgICB9CiAgfSwKCiAgZ3Vlc3NUeXBlOiBmdW5jdGlvbih0YWJsZSwgY29sdW1uKSB7CiAgICAvLyBndWVzcyB0aGUgdHlwZSBvZiBhIGNvbHVtbiBiYXNlZCBvbiBpdHMgZmlyc3Qgbm9uLWJsYW5rIHJvdwogICAgc29ydGZuID0gc29ydHRhYmxlLnNvcnRfYWxwaGE7CiAgICBmb3IgKHZhciBpPTA7IGk8dGFibGUudEJvZGllc1swXS5yb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRleHQgPSBzb3J0dGFibGUuZ2V0SW5uZXJUZXh0KHRhYmxlLnRCb2RpZXNbMF0ucm93c1tpXS5jZWxsc1tjb2x1bW5dKTsKICAgICAgaWYgKHRleHQgIT0gJycpIHsKICAgICAgICBpZiAodGV4dC5tYXRjaCgvXi0/W6MkpF0/W1xkLC5dKyU/JC8pKSB7CiAgICAgICAgICByZXR1cm4gc29ydHRhYmxlLnNvcnRfbnVtZXJpYzsKICAgICAgICB9CiAgICAgICAgLy8gY2hlY2sgZm9yIGEgZGF0ZTogZGQvbW0veXl5eSBvciBkZC9tbS95eQogICAgICAgIC8vIGNhbiBoYXZlIC8gb3IgLiBvciAtIGFzIHNlcGFyYXRvcgogICAgICAgIC8vIGNhbiBiZSBtbS9kZCBhcyB3ZWxsCiAgICAgICAgcG9zc2RhdGUgPSB0ZXh0Lm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKQogICAgICAgIGlmIChwb3NzZGF0ZSkgewogICAgICAgICAgLy8gbG9va3MgbGlrZSBhIGRhdGUKICAgICAgICAgIGZpcnN0ID0gcGFyc2VJbnQocG9zc2RhdGVbMV0pOwogICAgICAgICAgc2Vjb25kID0gcGFyc2VJbnQocG9zc2RhdGVbMl0pOwogICAgICAgICAgaWYgKGZpcnN0ID4gMTIpIHsKICAgICAgICAgICAgLy8gZGVmaW5pdGVseSBkZC9tbQogICAgICAgICAgICByZXR1cm4gc29ydHRhYmxlLnNvcnRfZGRtbTsKICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kID4gMTIpIHsKICAgICAgICAgICAgcmV0dXJuIHNvcnR0YWJsZS5zb3J0X21tZGQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBsb29rcyBsaWtlIGEgZGF0ZSwgYnV0IHdlIGNhbid0IHRlbGwgd2hpY2gsIHNvIGFzc3VtZQogICAgICAgICAgICAvLyB0aGF0IGl0J3MgZGQvbW0gKEVuZ2xpc2ggaW1wZXJpYWxpc20hKSBhbmQga2VlcCBsb29raW5nCiAgICAgICAgICAgIHNvcnRmbiA9IHNvcnR0YWJsZS5zb3J0X2RkbW07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc29ydGZuOwogIH0sCgogIGdldElubmVyVGV4dDogZnVuY3Rpb24obm9kZSkgewogICAgLy8gZ2V0cyB0aGUgdGV4dCB3ZSB3YW50IHRvIHVzZSBmb3Igc29ydGluZyBmb3IgYSBjZWxsLgogICAgLy8gc3RyaXBzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAvLyB0aGlzIGlzICpub3QqIGEgZ2VuZXJpYyBnZXRJbm5lclRleHQgZnVuY3Rpb247IGl0J3Mgc3BlY2lhbCB0byBzb3J0dGFibGUuCiAgICAvLyBmb3IgZXhhbXBsZSwgeW91IGNhbiBvdmVycmlkZSB0aGUgY2VsbCB0ZXh0IHdpdGggYSBjdXN0b21rZXkgYXR0cmlidXRlLgogICAgLy8gaXQgYWxzbyBnZXRzIC52YWx1ZSBmb3IgPGlucHV0PiBmaWVsZHMuCgogICAgaGFzSW5wdXRzID0gKHR5cGVvZiBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lID09ICdmdW5jdGlvbicpICYmCiAgICAgICAgICAgICAgICAgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKS5sZW5ndGg7CgogICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJzb3J0dGFibGVfY3VzdG9ta2V5IikgIT0gbnVsbCkgewogICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoInNvcnR0YWJsZV9jdXN0b21rZXkiKTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBub2RlLnRleHRDb250ZW50ICE9ICd1bmRlZmluZWQnICYmICFoYXNJbnB1dHMpIHsKICAgICAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBub2RlLmlubmVyVGV4dCAhPSAndW5kZWZpbmVkJyAmJiAhaGFzSW5wdXRzKSB7CiAgICAgIHJldHVybiBub2RlLmlubmVyVGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIG5vZGUudGV4dCAhPSAndW5kZWZpbmVkJyAmJiAhaGFzSW5wdXRzKSB7CiAgICAgIHJldHVybiBub2RlLnRleHQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgIH0KICAgIGVsc2UgewogICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdpbnB1dCcpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgIH0KICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gbm9kZS5ub2RlVmFsdWUucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICBjYXNlIDExOgogICAgICAgICAgdmFyIGlubmVyVGV4dCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaW5uZXJUZXh0ICs9IHNvcnR0YWJsZS5nZXRJbm5lclRleHQobm9kZS5jaGlsZE5vZGVzW2ldKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpbm5lclRleHQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0KICAgIH0KICB9LAoKICByZXZlcnNlOiBmdW5jdGlvbih0Ym9keSkgewogICAgLy8gcmV2ZXJzZSB0aGUgcm93cyBpbiBhIHRib2R5CiAgICBuZXdyb3dzID0gW107CiAgICBmb3IgKHZhciBpPTA7IGk8dGJvZHkucm93cy5sZW5ndGg7IGkrKykgewogICAgICBuZXdyb3dzW25ld3Jvd3MubGVuZ3RoXSA9IHRib2R5LnJvd3NbaV07CiAgICB9CiAgICBmb3IgKHZhciBpPW5ld3Jvd3MubGVuZ3RoLTE7IGk+PTA7IGktLSkgewogICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQobmV3cm93c1tpXSk7CiAgICB9CiAgICBkZWxldGUgbmV3cm93czsKICB9LAoKICAvKiBzb3J0IGZ1bmN0aW9ucwogICAgIGVhY2ggc29ydCBmdW5jdGlvbiB0YWtlcyB0d28gcGFyYW1ldGVycywgYSBhbmQgYgogICAgIHlvdSBhcmUgY29tcGFyaW5nIGFbMF0gYW5kIGJbMF0gKi8KICBzb3J0X251bWVyaWM6IGZ1bmN0aW9uKGEsYikgewogICAgYWEgPSBwYXJzZUZsb2F0KGFbMF0ucmVwbGFjZSgvW14wLTkuLV0vZywnJykpOwogICAgaWYgKGlzTmFOKGFhKSkgYWEgPSAwOwogICAgYmIgPSBwYXJzZUZsb2F0KGJbMF0ucmVwbGFjZSgvW14wLTkuLV0vZywnJykpOwogICAgaWYgKGlzTmFOKGJiKSkgYmIgPSAwOwogICAgcmV0dXJuIGFhLWJiOwogIH0sCiAgc29ydF9hbHBoYTogZnVuY3Rpb24oYSxiKSB7CiAgICBpZiAoYVswXT09YlswXSkgcmV0dXJuIDA7CiAgICBpZiAoYVswXTxiWzBdKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMTsKICB9LAogIHNvcnRfZGRtbTogZnVuY3Rpb24oYSxiKSB7CiAgICBtdGNoID0gYVswXS5tYXRjaChzb3J0dGFibGUuREFURV9SRSk7CiAgICB5ID0gbXRjaFszXTsgbSA9IG10Y2hbMl07IGQgPSBtdGNoWzFdOwogICAgaWYgKG0ubGVuZ3RoID09IDEpIG0gPSAnMCcrbTsKICAgIGlmIChkLmxlbmd0aCA9PSAxKSBkID0gJzAnK2Q7CiAgICBkdDEgPSB5K20rZDsKICAgIG10Y2ggPSBiWzBdLm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKTsKICAgIHkgPSBtdGNoWzNdOyBtID0gbXRjaFsyXTsgZCA9IG10Y2hbMV07CiAgICBpZiAobS5sZW5ndGggPT0gMSkgbSA9ICcwJyttOwogICAgaWYgKGQubGVuZ3RoID09IDEpIGQgPSAnMCcrZDsKICAgIGR0MiA9IHkrbStkOwogICAgaWYgKGR0MT09ZHQyKSByZXR1cm4gMDsKICAgIGlmIChkdDE8ZHQyKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMTsKICB9LAogIHNvcnRfbW1kZDogZnVuY3Rpb24oYSxiKSB7CiAgICBtdGNoID0gYVswXS5tYXRjaChzb3J0dGFibGUuREFURV9SRSk7CiAgICB5ID0gbXRjaFszXTsgZCA9IG10Y2hbMl07IG0gPSBtdGNoWzFdOwogICAgaWYgKG0ubGVuZ3RoID09IDEpIG0gPSAnMCcrbTsKICAgIGlmIChkLmxlbmd0aCA9PSAxKSBkID0gJzAnK2Q7CiAgICBkdDEgPSB5K20rZDsKICAgIG10Y2ggPSBiWzBdLm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKTsKICAgIHkgPSBtdGNoWzNdOyBkID0gbXRjaFsyXTsgbSA9IG10Y2hbMV07CiAgICBpZiAobS5sZW5ndGggPT0gMSkgbSA9ICcwJyttOwogICAgaWYgKGQubGVuZ3RoID09IDEpIGQgPSAnMCcrZDsKICAgIGR0MiA9IHkrbStkOwogICAgaWYgKGR0MT09ZHQyKSByZXR1cm4gMDsKICAgIGlmIChkdDE8ZHQyKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMTsKICB9LAoKICBzaGFrZXJfc29ydDogZnVuY3Rpb24obGlzdCwgY29tcF9mdW5jKSB7CiAgICAvLyBBIHN0YWJsZSBzb3J0IGZ1bmN0aW9uIHRvIGFsbG93IG11bHRpLWxldmVsIHNvcnRpbmcgb2YgZGF0YQogICAgLy8gc2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvY2t0YWlsX3NvcnQKICAgIC8vIHRoYW5rcyB0byBKb3NlcGggTmFobWlhcwogICAgdmFyIGIgPSAwOwogICAgdmFyIHQgPSBsaXN0Lmxlbmd0aCAtIDE7CiAgICB2YXIgc3dhcCA9IHRydWU7CgogICAgd2hpbGUoc3dhcCkgewogICAgICAgIHN3YXAgPSBmYWxzZTsKICAgICAgICBmb3IodmFyIGkgPSBiOyBpIDwgdDsgKytpKSB7CiAgICAgICAgICAgIGlmICggY29tcF9mdW5jKGxpc3RbaV0sIGxpc3RbaSsxXSkgPiAwICkgewogICAgICAgICAgICAgICAgdmFyIHEgPSBsaXN0W2ldOyBsaXN0W2ldID0gbGlzdFtpKzFdOyBsaXN0W2krMV0gPSBxOwogICAgICAgICAgICAgICAgc3dhcCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IC8vIGZvcgogICAgICAgIHQtLTsKCiAgICAgICAgaWYgKCFzd2FwKSBicmVhazsKCiAgICAgICAgZm9yKHZhciBpID0gdDsgaSA+IGI7IC0taSkgewogICAgICAgICAgICBpZiAoIGNvbXBfZnVuYyhsaXN0W2ldLCBsaXN0W2ktMV0pIDwgMCApIHsKICAgICAgICAgICAgICAgIHZhciBxID0gbGlzdFtpXTsgbGlzdFtpXSA9IGxpc3RbaS0xXTsgbGlzdFtpLTFdID0gcTsKICAgICAgICAgICAgICAgIHN3YXAgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSAvLyBmb3IKICAgICAgICBiKys7CgogICAgfSAvLyB3aGlsZShzd2FwKQogIH0KfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIFN1cHBvcnRpbmcgZnVuY3Rpb25zOiBidW5kbGVkIGhlcmUgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIGEgbGlicmFyeQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KCi8vIERlYW4gRWR3YXJkcy9NYXR0aGlhcyBNaWxsZXIvSm9obiBSZXNpZwoKLyogZm9yIE1vemlsbGEvT3BlcmE5ICovCmlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgc29ydHRhYmxlLmluaXQsIGZhbHNlKTsKfQoKLyogZm9yIEludGVybmV0IEV4cGxvcmVyICovCi8qQGNjX29uIEAqLwovKkBpZiAoQF93aW4zMikKICAgIGRvY3VtZW50LndyaXRlKCI8c2NyaXB0IGlkPV9faWVfb25sb2FkIGRlZmVyIHNyYz1qYXZhc2NyaXB0OnZvaWQoMCk+PFwvc2NyaXB0PiIpOwogICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJfX2llX29ubG9hZCIpOwogICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgewogICAgICAgICAgICBzb3J0dGFibGUuaW5pdCgpOyAvLyBjYWxsIHRoZSBvbmxvYWQgaGFuZGxlcgogICAgICAgIH0KICAgIH07Ci8qQGVuZCBAKi8KCi8qIGZvciBTYWZhcmkgKi8KaWYgKC9XZWJLaXQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7IC8vIHNuaWZmCiAgICB2YXIgX3RpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpIHsKICAgICAgICAgICAgc29ydHRhYmxlLmluaXQoKTsgLy8gY2FsbCB0aGUgb25sb2FkIGhhbmRsZXIKICAgICAgICB9CiAgICB9LCAxMCk7Cn0KCi8qIGZvciBvdGhlciBicm93c2VycyAqLwp3aW5kb3cub25sb2FkID0gc29ydHRhYmxlLmluaXQ7CgovLyB3cml0dGVuIGJ5IERlYW4gRWR3YXJkcywgMjAwNQovLyB3aXRoIGlucHV0IGZyb20gVGlubyBaaWpkZWwsIE1hdHRoaWFzIE1pbGxlciwgRGllZ28gUGVyaW5pCgovLyBodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIwMDUvMTAvYWRkLWV2ZW50LwoKZnVuY3Rpb24gZGVhbl9hZGRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyKSB7CglpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7CgkJZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTsKCX0gZWxzZSB7CgkJLy8gYXNzaWduIGVhY2ggZXZlbnQgaGFuZGxlciBhIHVuaXF1ZSBJRAoJCWlmICghaGFuZGxlci4kJGd1aWQpIGhhbmRsZXIuJCRndWlkID0gZGVhbl9hZGRFdmVudC5ndWlkKys7CgkJLy8gY3JlYXRlIGEgaGFzaCB0YWJsZSBvZiBldmVudCB0eXBlcyBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoIWVsZW1lbnQuZXZlbnRzKSBlbGVtZW50LmV2ZW50cyA9IHt9OwoJCS8vIGNyZWF0ZSBhIGhhc2ggdGFibGUgb2YgZXZlbnQgaGFuZGxlcnMgZm9yIGVhY2ggZWxlbWVudC9ldmVudCBwYWlyCgkJdmFyIGhhbmRsZXJzID0gZWxlbWVudC5ldmVudHNbdHlwZV07CgkJaWYgKCFoYW5kbGVycykgewoJCQloYW5kbGVycyA9IGVsZW1lbnQuZXZlbnRzW3R5cGVdID0ge307CgkJCS8vIHN0b3JlIHRoZSBleGlzdGluZyBldmVudCBoYW5kbGVyIChpZiB0aGVyZSBpcyBvbmUpCgkJCWlmIChlbGVtZW50WyJvbiIgKyB0eXBlXSkgewoJCQkJaGFuZGxlcnNbMF0gPSBlbGVtZW50WyJvbiIgKyB0eXBlXTsKCQkJfQoJCX0KCQkvLyBzdG9yZSB0aGUgZXZlbnQgaGFuZGxlciBpbiB0aGUgaGFzaCB0YWJsZQoJCWhhbmRsZXJzW2hhbmRsZXIuJCRndWlkXSA9IGhhbmRsZXI7CgkJLy8gYXNzaWduIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gZG8gYWxsIHRoZSB3b3JrCgkJZWxlbWVudFsib24iICsgdHlwZV0gPSBoYW5kbGVFdmVudDsKCX0KfTsKLy8gYSBjb3VudGVyIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSBJRHMKZGVhbl9hZGRFdmVudC5ndWlkID0gMTsKCmZ1bmN0aW9uIHJlbW92ZUV2ZW50KGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpIHsKCWlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHsKCQllbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpOwoJfSBlbHNlIHsKCQkvLyBkZWxldGUgdGhlIGV2ZW50IGhhbmRsZXIgZnJvbSB0aGUgaGFzaCB0YWJsZQoJCWlmIChlbGVtZW50LmV2ZW50cyAmJiBlbGVtZW50LmV2ZW50c1t0eXBlXSkgewoJCQlkZWxldGUgZWxlbWVudC5ldmVudHNbdHlwZV1baGFuZGxlci4kJGd1aWRdOwoJCX0KCX0KfTsKCmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7Cgl2YXIgcmV0dXJuVmFsdWUgPSB0cnVlOwoJLy8gZ3JhYiB0aGUgZXZlbnQgb2JqZWN0IChJRSB1c2VzIGEgZ2xvYmFsIGV2ZW50IG9iamVjdCkKCWV2ZW50ID0gZXZlbnQgfHwgZml4RXZlbnQoKCh0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzKS5wYXJlbnRXaW5kb3cgfHwgd2luZG93KS5ldmVudCk7CgkvLyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGhhc2ggdGFibGUgb2YgZXZlbnQgaGFuZGxlcnMKCXZhciBoYW5kbGVycyA9IHRoaXMuZXZlbnRzW2V2ZW50LnR5cGVdOwoJLy8gZXhlY3V0ZSBlYWNoIGV2ZW50IGhhbmRsZXIKCWZvciAodmFyIGkgaW4gaGFuZGxlcnMpIHsKCQl0aGlzLiQkaGFuZGxlRXZlbnQgPSBoYW5kbGVyc1tpXTsKCQlpZiAodGhpcy4kJGhhbmRsZUV2ZW50KGV2ZW50KSA9PT0gZmFsc2UpIHsKCQkJcmV0dXJuVmFsdWUgPSBmYWxzZTsKCQl9Cgl9CglyZXR1cm4gcmV0dXJuVmFsdWU7Cn07CgpmdW5jdGlvbiBmaXhFdmVudChldmVudCkgewoJLy8gYWRkIFczQyBzdGFuZGFyZCBldmVudCBtZXRob2RzCglldmVudC5wcmV2ZW50RGVmYXVsdCA9IGZpeEV2ZW50LnByZXZlbnREZWZhdWx0OwoJZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gZml4RXZlbnQuc3RvcFByb3BhZ2F0aW9uOwoJcmV0dXJuIGV2ZW50Owp9OwpmaXhFdmVudC5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgewoJdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlOwp9OwpmaXhFdmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsKICB0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cn0KCi8vIERlYW4ncyBmb3JFYWNoOiBodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvYmFzZS9mb3JFYWNoLmpzCi8qCglmb3JFYWNoLCB2ZXJzaW9uIDEuMAoJQ29weXJpZ2h0IDIwMDYsIERlYW4gRWR3YXJkcwoJTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KCi8vIGFycmF5LWxpa2UgZW51bWVyYXRpb24KaWYgKCFBcnJheS5mb3JFYWNoKSB7IC8vIG1vemlsbGEgYWxyZWFkeSBzdXBwb3J0cyB0aGlzCglBcnJheS5mb3JFYWNoID0gZnVuY3Rpb24oYXJyYXksIGJsb2NrLCBjb250ZXh0KSB7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewoJCQlibG9jay5jYWxsKGNvbnRleHQsIGFycmF5W2ldLCBpLCBhcnJheSk7CgkJfQoJfTsKfQoKLy8gZ2VuZXJpYyBlbnVtZXJhdGlvbgpGdW5jdGlvbi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG9iamVjdCwgYmxvY2ssIGNvbnRleHQpIHsKCWZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKCQlpZiAodHlwZW9mIHRoaXMucHJvdG90eXBlW2tleV0gPT0gInVuZGVmaW5lZCIpIHsKCQkJYmxvY2suY2FsbChjb250ZXh0LCBvYmplY3Rba2V5XSwga2V5LCBvYmplY3QpOwoJCX0KCX0KfTsKCi8vIGNoYXJhY3RlciBlbnVtZXJhdGlvbgpTdHJpbmcuZm9yRWFjaCA9IGZ1bmN0aW9uKHN0cmluZywgYmxvY2ssIGNvbnRleHQpIHsKCUFycmF5LmZvckVhY2goc3RyaW5nLnNwbGl0KCIiKSwgZnVuY3Rpb24oY2hyLCBpbmRleCkgewoJCWJsb2NrLmNhbGwoY29udGV4dCwgY2hyLCBpbmRleCwgc3RyaW5nKTsKCX0pOwp9OwoKLy8gZ2xvYmFsbHkgcmVzb2x2ZSBmb3JFYWNoIGVudW1lcmF0aW9uCnZhciBmb3JFYWNoID0gZnVuY3Rpb24ob2JqZWN0LCBibG9jaywgY29udGV4dCkgewoJaWYgKG9iamVjdCkgewoJCXZhciByZXNvbHZlID0gT2JqZWN0OyAvLyBkZWZhdWx0CgkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkJCS8vIGZ1bmN0aW9ucyBoYXZlIGEgImxlbmd0aCIgcHJvcGVydHkKCQkJcmVzb2x2ZSA9IEZ1bmN0aW9uOwoJCX0gZWxzZSBpZiAob2JqZWN0LmZvckVhY2ggaW5zdGFuY2VvZiBGdW5jdGlvbikgewoJCQkvLyB0aGUgb2JqZWN0IGltcGxlbWVudHMgYSBjdXN0b20gZm9yRWFjaCBtZXRob2Qgc28gdXNlIHRoYXQKCQkJb2JqZWN0LmZvckVhY2goYmxvY2ssIGNvbnRleHQpOwoJCQlyZXR1cm47CgkJfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJzdHJpbmciKSB7CgkJCS8vIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcKCQkJcmVzb2x2ZSA9IFN0cmluZzsKCQl9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QubGVuZ3RoID09ICJudW1iZXIiKSB7CgkJCS8vIHRoZSBvYmplY3QgaXMgYXJyYXktbGlrZQoJCQlyZXNvbHZlID0gQXJyYXk7CgkJfQoJCXJlc29sdmUuZm9yRWFjaChvYmplY3QsIGJsb2NrLCBjb250ZXh0KTsKCX0KfTsK