DIR : /home/kozerus/public_html/cropex/js/wz/b64_wz_dragdrop_js.txt /home/kozerus/public_html/cropex/js/wz LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLCBhbmQgbXVzdCBub3QgYmUgcmVtb3ZlZC4KCnd6X2RyYWdkcm9wLmpzCXYuIDQuOTEKVGhlIGxhdGVzdCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQpvciBodHRwOi8vd3d3LndhbHRlcnpvcm4uZGUKCkNvcHlyaWdodCAoYykgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMjYuIDguIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDEwLjEwLjIwMDgKClRoaXMgREhUTUwgJiBEcmFnJkRyb3AgTGlicmFyeSBhZGRzIERyYWcmRHJvcCBmdW5jdGlvbmFsaXR5IHRvOgotIGltYWdlcywgZXZlbiB0aG9zZSBub3QgcG9zaXRpb25lZCB2aWEgbGF5ZXJzLAogIG5vciB2aWEgc3R5bGVzaGVldHMgb3IgYW55IG90aGVyIGtpbmQgb2YgImhhcmQtY29kaW5nIjsKLSByZWxhdGl2ZWx5IGFuZCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbGF5ZXJzIChESVYgZWxlbWVudHMpLgpNb3Jlb3ZlciwgaXQgcHJvdmlkZXMgZXh0ZW5kZWQgREhUTUwgY2FwYWJpbGl0aWVzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKLy8gUEFUSCBUTyBUSEUgVFJBTlNQQVJFTlQgMSoxIFBYIElNQUdFIChyZXF1aXJlZCBieSBOUyA0IGFzIHNwYWNlcikKdmFyIHNwYWNlciA9ICd0cmFuc3BhcmVudHBpeGVsLmdpZic7CgoKCgovL3dpbmRvdy5vbmVycm9yID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdHJ1ZTsnKTsKCgovLyBPcHRpb25hbCBjb21tYW5kcyBwYXNzZWQgdG8gU0VUX0RIVE1MKCkgb24gdGhlIGh0bWwtcGFnZSAoZzogbWF5IGJlIGFwcGxpZWQgZ2xvYmFsbHksIGk6IGluZGl2aWR1YWxseSkKdmFyIENMT05FCQkJPSAnQzEwbkUnOyAgIC8vIGkgIGltZwkgIGNsb25lIGltYWdlCnZhciBDT1BZCQkJPSAnQzBwWSc7CS8vIGkgIGltZwkgIGNyZWF0ZSBjb3BpZXMKdmFyIERFVEFDSF9DSElMRFJFTiA9ICdkMzdhQ0gnOyAgLy8gaSAgbHlyCSAgZGV0YWNoIGltYWdlcwp2YXIgSE9SSVpPTlRBTAkJPSAnSDByMVonOyAgIC8vIGkgIGltZyxseXIgIGhvcml6b250YWxseSBkcmFnZ2FibGUgb25seQp2YXIgTUFYSEVJR0hUCQk9ICdtN3g4SSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSBoZWlnaHQgbGltaXQsICIKdmFyIE1BWE9GRkJPVFRPTQk9ICdtN3hkMHdOJzsgLy8gaSAgaW1nLGx5ciAgZG93bndhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZMRUZUCQk9ICdtN3gyM0Z0JzsgLy8gaSAgaW1nLGx5ciAgbGVmdHdhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZSSUdIVAkJPSAnbTd4MEZmOCc7IC8vIGkgIGltZyxseXIgIHJpZ2h0d2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWE9GRlRPUAkJPSAnbTd4dTknOyAgIC8vIGkgIGltZyxseXIgIHVwd2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWFdJRFRICQk9ICdtN3hXMSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSB3aWR0aCBsaW1pdCwgdXNlIHdpdGggcmVzaXphYmxlIG9yIHNjYWxhYmxlCnZhciBNSU5XSURUSAkJPSAnbTFudzEnOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gd2lkdGggbGltaXQsICIKdmFyIE1JTkhFSUdIVAkJPSAnbTFuOEknOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gaGVpZ2h0IGxpbWl0LCAiCnZhciBOT19BTFQJCQk9ICdubzgxVCc7ICAgLy8gZ2kgaW1nCSAgZGlzYWJsZSBhbHQgYW5kIHRpdGxlIGF0dHJpYnV0ZXMKdmFyIE5PX0RSQUcJCQk9ICdOMGQ0QWcnOyAgLy8gaSAgaW1nLGx5ciAgZGlzYWJsZSBkcmFnZ2FiaWxpdHkKdmFyIFJFU0VUX1oJCQk9ICdyMzVFN3onOyAgLy8gZ2kgaW1nLGx5ciAgcmVzZXQgei1pbmRleCB3aGVuIGRyb3BwZWQKdmFyIFJFU0laQUJMRQkJPSAncjVJWmJsJzsgIC8vIGdpIGltZyxseXIgIHJlc2l6YWJsZSBpZiA8Y3RybD4gb3IgPHNoaWZ0PiBwcmVzc2VkCnZhciBTQ0FMQUJMRQkJPSAnU0NMYmwnOyAgIC8vIGdpIGltZyxseXIgIHNjYWxhYmxlCQkgICAiCnZhciBTQ1JPTEwJCQk9ICdzQzhsTCc7ICAgLy8gZ2kgaW1nLGx5ciAgZW5hYmxlIGF1dG8gc2Nyb2xsIGZ1bmN0aW9uYWxpdHkKdmFyIFRSQU5TUEFSRU5UCQk9ICdkSUFwSEFuJzsgLy8gZ2kgaW1nLGx5ciAgdHJhbnNsdWNlbnQgd2hpbGUgZHJhZ2dlZAp2YXIgVkVSVElDQUwJCT0gJ1YzUnQxQyc7ICAvLyBpICBpbWcsbHlyICB2ZXJ0aWNhbGx5IGRyYWdnYWJsZSBvbmx5CnZhciBkZF9jdXJzb3JzID0gbmV3IEFycmF5KAoJJ2M6ZGVmYXVsdCcsCgknYzpjcm9zc2hhaXInLAoJJ2M6ZS1yZXNpemUnLAoJJ2M6aGFuZCcsCgknYzpoZWxwJywKCSdjOm1vdmUnLAoJJ2M6bi1yZXNpemUnLAoJJ2M6bmUtcmVzaXplJywKCSdjOm53LXJlc2l6ZScsCgknYzpzLXJlc2l6ZScsCgknYzpzZS1yZXNpemUnLAoJJ2M6c3ctcmVzaXplJywKCSdjOnRleHQnLAoJJ2M6dy1yZXNpemUnLAoJJ2M6d2FpdCcKKTsKZm9yKHZhciBkZF9pID0gZGRfY3Vyc29ycy5sZW5ndGg7IGRkX2k7KQp7LS1kZF9pOwoJZXZhbCgndmFyIENVUlNPUl8nICsgKGRkX2N1cnNvcnNbZGRfaV0uc3Vic3RyaW5nKDIpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgnLScsICdfJykpICsgJyA9ICInICsgZGRfY3Vyc29yc1tkZF9pXSArICciOycpOwp9CnZhciBkZF91ID0gInVuZGVmaW5lZCI7CmZ1bmN0aW9uIFdaREQoKQp7Cgl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5KDApOwoJdGhpcy5vYmogPSBudWxsOwoJdGhpcy5uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoJdGhpcy5kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUudG9Mb3dlckNhc2UoKSAhPSAiYmFja2NvbXBhdCIpPwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudAoJCTogKGRvY3VtZW50LmJvZHkgfHwgbnVsbCk7Cgl0aGlzLm9wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCWlmKHRoaXMub3ApIGRvY3VtZW50Lm9ubW91c2Vkb3duID0gbmV3IEZ1bmN0aW9uKCdlJywKCQknaWYoKChlID0gZSB8fCB3aW5kb3cuZXZlbnQpLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnRhZ05hbWUgPT0gIklNQUdFIikgcmV0dXJuIGZhbHNlOycpOwoJdGhpcy5pZSA9ICEhKHRoaXMubi5pbmRleE9mKCJtc2llIikgPj0gMCAmJiBkb2N1bWVudC5hbGwgJiYgdGhpcy5kYiAmJiAhdGhpcy5vcCk7Cgl0aGlzLmllbWFjID0gISEodGhpcy5pZSAmJiB0aGlzLm4uaW5kZXhPZigibWFjIikgPj0gMCk7Cgl0aGlzLmllNCA9ICEhKHRoaXMuaWUgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCXRoaXMubjQgPSAhIShkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gZGRfdSk7Cgl0aGlzLm42ID0gISEodHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICE9IGRkX3UgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZVJhbmdlICE9IGRkX3UpOwoJdGhpcy53M2MgPSAhISghdGhpcy5vcCAmJiAhdGhpcy5pZSAmJiAhdGhpcy5uNiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCk7Cgl0aGlzLmNlID0gISEoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiBkb2N1bWVudC5yZWxlYXNlRXZlbnRzICYmICF0aGlzLm42KTsKCXRoaXMucHggPSB0aGlzLm40PyAnJyA6ICdweCc7Cgl0aGlzLnRXYWl0ID0gdGhpcy53M2M/IDQwIDogMTA7Cgl0aGlzLm5vUmVjYWxjID0gZmFsc2U7Cn0KdmFyIGRkID0gbmV3IFdaREQoKTsKCmRkLkludCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4gaXNOYU4oZF95ID0gcGFyc2VJbnQoZF94KSk/IDAgOiBkX3k7Cn07CmRkLmdldFduZFcgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQoCgkJKGRkLmRiICYmICFkZC5vcCAmJiAhZGQudzNjICYmIGRkLmRiLmNsaWVudFdpZHRoKT8gZGQuZGIuY2xpZW50V2lkdGgKCQk6ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKQoJKTsKfTsKZGQuZ2V0V25kSCA9IGZ1bmN0aW9uKCkKewoJcmV0dXJuIGRkLkludCgKCQkoZGQuZGIgJiYgIWRkLm9wICYmICFkZC53M2MgJiYgZGQuZGIuY2xpZW50SGVpZ2h0KT8gZGQuZGIuY2xpZW50SGVpZ2h0CgkJOiAod2luZG93LmlubmVySGVpZ2h0IHx8IDApCgkpOwp9OwpkZC5nZXRTY3JvbGxYID0gZnVuY3Rpb24oKQp7CglyZXR1cm4gZGQuSW50KHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZGQuZGI/IGRkLmRiLnNjcm9sbExlZnQgOiAwKSk7Cn07CmRkLmdldFNjcm9sbFkgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkZC5kYj8gZGQuZGIuc2Nyb2xsVG9wIDogMCkpOwp9OwpkZC5nZXRQYWdlWFkgPSBmdW5jdGlvbihkX28pCnsKCWlmKGRkLm40ICYmIGRfbykKCXsKCQlkZC54ID0gZF9vLnBhZ2VYIHx8IDA7CgkJZGQueSA9IGRfby5wYWdlWSB8fCAwOwoJfQoJZWxzZQoJewoJCWRkLnggPSBkZC55ID0gMDsgLy9nbG9iYWwgaGVscGVyIHZhcnMKCQl3aGlsZShkX28pCgkJewoJCQlkZC54ICs9IGRkLkludChkX28ub2Zmc2V0TGVmdCk7CgkJCWRkLnkgKz0gZGQuSW50KGRfby5vZmZzZXRUb3ApOwoJCQlkX28gPSBkX28ub2Zmc2V0UGFyZW50IHx8IG51bGw7CgkJfQoJfQp9OwpkZC5nZXRDc3NYWSA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmRpdikKCXsKCQlpZihkZC5uNCkKCQl7CgkJCWRfby5jc3N4ID0gZF9vLmRpdi54OwoJCQlkX28uY3NzeSA9IGRfby5kaXYueTsKCQl9CgkJZWxzZSBpZihkZC5pZTQpCgkJewoJCQlkX28uY3NzeCA9IGRfby5jc3MucGl4ZWxMZWZ0OwoJCQlkX28uY3NzeSA9IGRfby5jc3MucGl4ZWxUb3A7CgkJfQoJCWVsc2UKCQl7CgkJCWRfby5jc3MubGVmdCA9IGRfby5jc3MudG9wID0gMCArIGRkLnB4OwoJCQlkZC5nZXRQYWdlWFkoZF9vLmRpdik7CgkJCWRfby5jc3N4ID0gZF9vLnggLSBkZC54OwoJCQlkX28uY3NzeSA9IGRfby55IC0gZGQueTsKCQkJZF9vLmNzcy5sZWZ0ID0gZF9vLmNzc3ggKyBkZC5weDsKCQkJZF9vLmNzcy50b3AgPSBkX28uY3NzeSArIGRkLnB4OwoJCX0KCX0KCWVsc2UKCXsKCQlkX28uY3NzeCA9IDA7CgkJZF9vLmNzc3kgPSAwOwoJfQp9OwpkZC5nZXRJbWdXID0gZnVuY3Rpb24oZF9vKQp7CglyZXR1cm4gZF9vPyBkZC5JbnQoZF9vLndpZHRoKSA6IDA7Cn07CmRkLmdldEltZ0ggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkX28/IGRkLkludChkX28uaGVpZ2h0KSA6IDA7Cn07CmRkLmdldERpdlcgPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAud2lkdGggOiAwKQoJCTogZF9vLmRpdj8gKGRfby5kaXYub2Zmc2V0V2lkdGggfHwgZF9vLmNzcy5waXhlbFdpZHRoIHx8IGRfby5jc3Mud2lkdGggfHwgMCkKCQk6IDAKCSk7Cn07CmRkLmdldERpdkggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAuaGVpZ2h0IDogMCkKCQk6IGRfby5kaXY/IChkX28uZGl2Lm9mZnNldEhlaWdodCB8fCBkX28uY3NzLnBpeGVsSGVpZ2h0IHx8IGRfby5jc3MuaGVpZ2h0IHx8IDApCgkJOiAwCgkpOwp9OwpkZC5nZXRXSCA9IGZ1bmN0aW9uKGRfbykKewoJZF9vLncgPSBkZC5nZXREaXZXKGRfbyk7CglkX28uaCA9IGRkLmdldERpdkgoZF9vKTsKCWlmKGRfby5jc3MpCgl7CgkJZF9vLmNzcy53aWR0aCA9IGRfby53ICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSBkX28uaCArIGRkLnB4OwoJCWRfby5kdyA9IGRkLmdldERpdlcoZF9vKS1kX28udzsKCQlkX28uZGggPSBkZC5nZXREaXZIKGRfbyktZF9vLmg7CgkJZF9vLmNzcy53aWR0aCA9IChkX28udy1kX28uZHcpICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSAoZF9vLmgtZF9vLmRoKSArIGRkLnB4OwoJfQoJZWxzZSBkX28uZHcgPSBkX28uZGggPSAwOwp9OwpkZC5nZXRDc3NQcm9wID0gZnVuY3Rpb24oZF9vLCBkX3BuNiwgZF9wc3R5bGUsIGRfcG40KQp7CglpZihkX28gJiYgZGQubjYpIHJldHVybiAnJyt3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkX28sIG51bGwpLmdldFByb3BlcnR5VmFsdWUoZF9wbjYpOwoJaWYoZF9vICYmIGRfby5jdXJyZW50U3R5bGUpIHJldHVybiAnJytldmFsKCdkX28uY3VycmVudFN0eWxlLicrZF9wc3R5bGUpOwoJaWYoZF9vICYmIGRfby5zdHlsZSkgcmV0dXJuICcnK2V2YWwoJ2Rfby5zdHlsZS4nK2RfcHN0eWxlKTsKCWlmKGRfbyAmJiBkZC5uNCkgcmV0dXJuICcnK2V2YWwoJ2Rfby4nK2RfcG40KTsKCXJldHVybiAnJzsKfTsKZGQuZ2V0RGl2ID0gZnVuY3Rpb24oZF94LCBkX2QpCnsKCWRfZCA9IGRfZCB8fCBkb2N1bWVudDsKCWlmKGRkLm40KQoJewoJCWlmKGRfZC5sYXllcnNbZF94XSkgcmV0dXJuIGRfZC5sYXllcnNbZF94XTsKCQlmb3IodmFyIGRfaSA9IGRfZC5sYXllcnMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJdmFyIGRfeSA9IGRkLmdldERpdihkX3gsIGRfZC5sYXllcnNbLS1kX2ldLmRvY3VtZW50KTsKCQkJaWYoZF95KSByZXR1cm4gZF95OwoJCX0KCX0KCWlmKGRkLmllKSByZXR1cm4gZF9kLmFsbFtkX3hdIHx8IG51bGw7CglpZihkX2QuZ2V0RWxlbWVudEJ5SWQpIHJldHVybiBkX2QuZ2V0RWxlbWVudEJ5SWQoZF94KSB8fCBudWxsOwoJcmV0dXJuIG51bGw7Cn07CmRkLmdldEltZyA9IGZ1bmN0aW9uKGRfbywgZF9ubSwgZF94eSwgZF93KQp7CglkX3cgPSBkX3cgfHwgd2luZG93OwoJdmFyIGRfaW1nOwoJaWYoZG9jdW1lbnQuaW1hZ2VzICYmIChkX2ltZyA9IGRfdy5kb2N1bWVudC5pbWFnZXNbZF9ubV0pKQoJewoJCWlmKGRfeHkpCgkJewoJCQlpZihkZC5uNCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfdyk7CgkJCQlkX28uZGVmeCA9IGRfaW1nLnggKyBkZC54OwoJCQkJZF9vLmRlZnkgPSBkX2ltZy55ICsgZGQueTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLmdldFBhZ2VYWShkX2ltZyk7CgkJCQlkX28uZGVmeCA9IGRkLng7CgkJCQlkX28uZGVmeSA9IGRkLnk7CgkJCX0KCQl9CgkJcmV0dXJuIGRfaW1nOwoJfQoJaWYoZGQubjQpIGZvcih2YXIgZF9pID0gZF93LmRvY3VtZW50LmxheWVycy5sZW5ndGg7IGRfaTspCgl7CgkJdmFyIGRfeSA9IGRkLmdldEltZyhkX28sIGRfbm0sIGRfeHksIGRfdy5kb2N1bWVudC5sYXllcnNbLS1kX2ldKTsKCQlpZihkX3kpIHJldHVybiBkX3k7Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWlmKGRkLm40KQoJewoJCWZvcih2YXIgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJaWYoISgoZF9wID0gZGQuZWxlbWVudHNbLS1kX2ldKS5pc19pbWFnZSkgJiYgZF9wLmRpdiAmJiAoZF9wLmRpdi5kb2N1bWVudC5sYXllcnNbZF9vLm5hbWVdIHx8IGRfby5vaW1nICYmIGRfcC5kaXYuZG9jdW1lbnQuaW1hZ2VzW2Rfby5vaW1nLm5hbWVdKSkKCQkJCWRfcC5hZGRDaGlsZChkX28sIGRfcC5kZXRhY2gsIDEpOwoJCX0KCX0KCWVsc2UKCXsKCQlkX3AgPSBkX28uaXNfaW1hZ2U/IGRkLmdldEltZyhkX28sIGRfby5vaW1nLm5hbWUpIDogKGRfby5kaXYgfHwgbnVsbCk7CgkJd2hpbGUoZF9wICYmICEhKGRfcCA9IGRfcC5vZmZzZXRQYXJlbnQgfHwgZF9wLnBhcmVudE5vZGUgfHwgbnVsbCkpCgkJewoJCQlpZihkX3AuZGRPYmopCgkJCXsKCQkJCWRfcC5kZE9iai5hZGRDaGlsZChkX28sIGRfcC5kZE9iai5kZXRhY2gsIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn07CmRkLmdldENtZCA9IGZ1bmN0aW9uKGRfbywgZF9jbWQsIGRfY21kU3RyKQp7Cgl2YXIgZF9pID0gZF9vLmlkLmluZGV4T2YoZF9jbWQpLCBkX2osCglkX3kgPSAoZF9pID49IDApKjE7CglpZihkX3kpCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aDsKCQlpZihkX2NtZFN0cikgZF9vLmNtZCArPSBkX28uaWQuc3Vic3RyaW5nKGRfaSwgZF9qKTsKCQlkX28uaWQgPSBkX28uaWQuc3Vic3RyaW5nKDAsIGRfaSkgKyBkX28uaWQuc3Vic3RyaW5nKGRfaik7Cgl9CglyZXR1cm4gZF95Owp9OwpkZC5nZXRDbWRWYWwgPSBmdW5jdGlvbihkX28sIGRfY21kLCBkX2NtZFN0ciwgaW50MCkKewoJdmFyIGRfaSA9IGRfby5pZC5pbmRleE9mKGRfY21kKSwgZF9qLAoJZF95ID0gKGRfby5pZC5pbmRleE9mKGRfY21kKSA+PSAwKT8gZGQuSW50KGRfby5pZC5zdWJzdHJpbmcoZF9vLmlkLmluZGV4T2YoZF9jbWQpK2RfY21kLmxlbmd0aCkpIDogaW50MD8gLTEgOiAwOwoJaWYoIWludDAgJiYgZF95IHx8IGludDAgJiYgZF95ID49IDApCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aCsoIiIrZF95KS5sZW5ndGg7CgkJaWYoZF9jbWRTdHIpIGRfby5jbWQgKz0gZF9vLmlkLnN1YnN0cmluZyhkX2ksIGRfaik7CgkJZF9vLmlkID0gZF9vLmlkLnN1YnN0cmluZygwLCBkX2kpICsgZF9vLmlkLnN1YnN0cmluZyhkX2opOwoJfQoJcmV0dXJuIGRfeTsKfTsKZGQuYWRkRWx0ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWRkLmVsZW1lbnRzW2Rfby5uYW1lXSA9IGRkLmVsZW1lbnRzW2Rfby5pbmRleCA9IGRkLmVsZW1lbnRzLmxlbmd0aF0gPSBkX287CglpZihkX3ApIGRfcC5jb3BpZXNbZF9vLm5hbWVdID0gZF9wLmNvcGllc1tkX3AuY29waWVzLmxlbmd0aF0gPSBkX287Cn07CmRkLm1rV3pEb20gPSBmdW5jdGlvbigpCnsKCXZhciBkX28sIGRfbCA9IGRkLmVsZW1lbnRzLmxlbmd0aCwgZF9pOwoJZm9yKGRfaSA9IGRfbDsgZF9pOykgZGQuZ2V0UGFyZW50KGRkLmVsZW1lbnRzWy0tZF9pXSk7Cglmb3IoZF9pID0gZF9sOyBkX2k7KQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1stLWRfaV0pLmNoaWxkcmVuICYmICFkX28ucGFyZW50KQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX28uY2hpbGRyZW4ubGVuZ3RoOyBkX2o7KQoJCQl7LS1kX2o7CgkJCQlkX28uY2hpbGRyZW5bZF9qXS5zZXRaKGRfby56K2Rfby5jaGlsZHJlbltkX2pdLnosIDEpOwoJCQl9CgkJfQoJfQp9OwpkZC5hZGRQcm9wcyA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmlzX2ltYWdlKQoJewoJCWRfby5kaXYgPSBkZC5nZXREaXYoZF9vLmlkKTsKCQlkX28uY3NzID0gKGRfby5kaXYgJiYgdHlwZW9mIGRfby5kaXYuc3R5bGUgIT0gZGRfdSk/IGRfby5kaXYuc3R5bGUgOiBudWxsOwoJCWRfby5uaW1nID0gKGRkLm40ICYmIGRfby5kaXYpPyBkX28uZGl2LmRvY3VtZW50LmltYWdlc1swXSA6IChkb2N1bWVudC5pbWFnZXNbZF9vLmlkKyJOSTFtNkciXSB8fCBudWxsKTsKCQlpZighZF9vLm5vYWx0ICYmICFkZC5ub2FsdCAmJiBkX28ubmltZyAmJiBkX28ub2ltZykKCQl7CgkJCWRfby5uaW1nLmFsdCA9IGRfby5vaW1nLmFsdCB8fCAnJzsKCQkJZF9vLm5pbWcudGl0bGUgPSBkX28ub2ltZy50aXRsZTsKCQkJZF9vLm5pbWcub25tb3VzZW92ZXIgPSBkX28ub2ltZy5vbm1vdXNlb3ZlcjsKCQkJZF9vLm5pbWcub25tb3VzZW91dCA9IGRfby5vaW1nLm9ubW91c2VvdXQ7CgkJfQoJCWRfby5iZ0NvbG9yID0gJyc7Cgl9CgllbHNlCgl7CgkJZF9vLmJnQ29sb3IgPSBkZC5nZXRDc3NQcm9wKGRfby5kaXYsICdiYWNrZ3JvdW5kLWNvbG9yJywnYmFja2dyb3VuZENvbG9yJywnYmdDb2xvcicpLnRvTG93ZXJDYXNlKCk7CgkJaWYoZGQubjYgJiYgZF9vLmRpdikKCQl7CgkJCXZhciBkX2MgPSBkX28uYmdDb2xvci50b0xvd2VyQ2FzZSgpOwoJCQlpZihkX2MuaW5kZXhPZigncmdiJykgPj0gMCkKCQkJewoJCQkJZF9jID0gZF9jLnN1YnN0cmluZyg0LCBkX2MubGVuZ3RoLTEpLnNwbGl0KCcsJyk7CgkJCQlkX28uYmdDb2xvciA9ICcjJzsKCQkJCWZvcih2YXIgZF9sID0gZF9jLmxlbmd0aCwgZF9pID0gMDsgZF9pIDwgZF9sOyBkX2krKykgZF9vLmJnQ29sb3IgKz0gcGFyc2VJbnQoZF9jW2RfaV0pLnRvU3RyaW5nKDB4MTApOwoJCQl9CgkJCWVsc2UgZF9vLmJnQ29sb3IgPSBkX2M7CgkJfQoJfQoJaWYoZGQuc2NhbGFibGUpIGRfby5zY2FsYWJsZSA9IGRfby5yZXNpemFibGVeMTsKCWVsc2UgaWYoZGQucmVzaXphYmxlKSBkX28ucmVzaXphYmxlID0gZF9vLnNjYWxhYmxlXjE7CglkX28uc2V0WihkX28uZGVmeik7CglkX28uY3Vyc29yID0gZF9vLmN1cnNvciB8fCBkZC5jdXJzb3IgfHwgJ2F1dG8nOwoJZF9vLl9zZXRDcnMoZF9vLm5vZHJhZz8gJ2F1dG8nIDogZF9vLmN1cnNvcik7CglkX28uZGlhcGhhbiA9IGRfby5kaWFwaGFuIHx8IGRkLmRpYXBoYW4gfHwgMDsKCWRfby5vcGFjaXR5ID0gMS4wOwoJZF9vLnZpc2libGUgPSB0cnVlOwp9OwpkZC5pbml0eiA9IGZ1bmN0aW9uKCkKewoJaWYoIShkZCAmJiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSkpIHJldHVybjsKCWVsc2UgaWYoZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkZC5yZWNhbGMoMSk7Cgl2YXIgZF9kcmFnID0gKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IERSQUcpLAoJZF9yZXNpemUgPSAoZG9jdW1lbnQub25tb3VzZW1vdmUgPT0gUkVTSVpFKTsKCWlmKGRkLmxvYWRGdW5jKSBkZC5sb2FkRnVuYygpOwoJaWYoZF9kcmFnKSBkZC5zZXRNb3ZIZGwoRFJBRyk7CgllbHNlIGlmKGRfcmVzaXplKSBkZC5zZXRNb3ZIZGwoUkVTSVpFKTsKCWlmKGRfZHJhZyB8fCBkX3Jlc2l6ZSkgZGQuc2V0VXBIZGwoRFJPUCk7CglkZC5zZXREd25IZGwoUElDSyk7Cn07CmRkLmZpbmx6ID0gZnVuY3Rpb24oKQp7CglpZihkZC5pZSAmJiBkZC5lbGVtZW50cykKCXsKCQlkZC5ub1JlY2FsYyA9IHRydWU7CgkJZm9yKHZhciBkX2kgPSBkZC5lbGVtZW50cy5sZW5ndGg7IGRfaTspCgkJCWRkLmVsZW1lbnRzWy0tZF9pXS5kZWwoKTsKCQlkZC5ub1JlY2FsYyA9IGZhbHNlOwoJfQoJaWYoZGQudWxvYWRGdW5jKSBkZC51bG9hZEZ1bmMoKTsKfTsKZGQuc2V0Q2UgPSBmdW5jdGlvbihkX2UsIGRfZm5jKQp7CglkX2ZuYz8gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhkX2UpIDogZG9jdW1lbnQucmVsZWFzZUV2ZW50cyhkX2UpOwp9OwpkZC5zZXREd25IZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IGRfeCkKCXsKCQlkZC5kb3duRnVuYyA9IGRvY3VtZW50Lm9ubW91c2Vkb3duOwoJCWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZF94OwoJCWlmKGRkLmNlKSBkZC5zZXRDZShFdmVudC5NT1VTRURPV04sIGRfeCk7Cgl9Cn07CmRkLnNldE1vdkhkbCA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZG9jdW1lbnQub25tb3VzZW1vdmUgIT0gZF94KQoJewoJCWRkLm1vdmVGdW5jID0gZG9jdW1lbnQub25tb3VzZW1vdmU7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkX3g7CgkJaWYoZGQuY2UpIGRkLnNldENlKEV2ZW50Lk1PVVNFTU9WRSwgZF94KTsKCX0KfTsKZGQuc2V0VXBIZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2V1cCAhPSBkX3gpCgl7CgkJZGQudXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwOwoJCWRvY3VtZW50Lm9ubW91c2V1cCA9IGRfeDsKCQlpZihkZC5jZSkgZGQuc2V0Q2UoRXZlbnQuTU9VU0VVUCwgZF94KTsKCX0KfTsKZGQuZXZ0ID0gZnVuY3Rpb24oZF9lKQp7Cgl0aGlzLmJ1dCA9ICh0aGlzLmUgPSBkX2UgfHwgd2luZG93LmV2ZW50KS53aGljaCB8fCB0aGlzLmUuYnV0dG9uIHx8IDA7Cgl0aGlzLmJ1dHRvbiA9ICh0aGlzLmUudHlwZSA9PSAnbW91c2Vkb3duJyk/IHRoaXMuYnV0CgkJOiAoZGQuZSAmJiBkZC5lLmJ1dHRvbik/IGRkLmUuYnV0dG9uCgkJOiAwOwoJdGhpcy5zcmMgPSB0aGlzLmUudGFyZ2V0IHx8IHRoaXMuZS5zcmNFbGVtZW50IHx8IG51bGw7Cgl0aGlzLnNyYy50YWcgPSAoIiIgKyAodGhpcy5zcmMudGFnTmFtZSB8fCB0aGlzLnNyYykpLnRvTG93ZXJDYXNlKCk7Cgl0aGlzLnggPSBkZC5JbnQodGhpcy5lLnBhZ2VYIHx8IHRoaXMuZS5jbGllbnRYIHx8IDApOwoJdGhpcy55ID0gZGQuSW50KHRoaXMuZS5wYWdlWSB8fCB0aGlzLmUuY2xpZW50WSB8fCAwKTsKCWlmKGRkLmllKQoJewoJCXRoaXMueCArPSBkZC5nZXRTY3JvbGxYKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJCXRoaXMueSArPSBkZC5nZXRTY3JvbGxZKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJfQoJdGhpcy5tb2RpZktleSA9IHRoaXMuZS5tb2RpZmllcnM/IHRoaXMuZS5tb2RpZmllcnMmRXZlbnQuU0hJRlRfTUFTSyA6ICh0aGlzLmUuc2hpZnRLZXkgfHwgZmFsc2UpOwp9OwpkZC5nZXRFdmVudFRhcmdldCA9IGZ1bmN0aW9uKGRfZSwgZF9zLCBkX24pCnsKCWRfZSA9IGRfZSB8fCB3aW5kb3cuZXZlbnQ7CglpZihkX2UgJiYgKGRfcyA9IGRfZS50YXJnZXQgfHwgZF9lLnNyY0VsZW1lbnQgfHwgbnVsbCkgIT0gbnVsbCkKCXsKCQlpZihudWxsICE9IChkX24gPSBkX3MuaWQgfHwgZF9zLm5hbWUgfHwgbnVsbCkpCgkJewoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2TkkxbTZHIikgPT0gZF9uLmxlbmd0aC0xMikKCQkJCXJldHVybiBkZC5lbGVtZW50c1tkX24uc3Vic3RyaW5nKDAsIGRfbi5sZW5ndGgtMTIpXSB8fCBudWxsOwoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2IikgPT0gZF9uLmxlbmd0aC02KQoJCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbi5zdWJzdHJpbmcoMCwgZF9uLmxlbmd0aC02KV0gfHwgbnVsbDsKCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbl0gfHwgbnVsbDsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQucmVjYWxjID0gZnVuY3Rpb24oZF94KQp7CglpZihkZC5ub1JlY2FsYykgcmV0dXJuOwoJZm9yKHZhciBkX28sIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSkuaXNfaW1hZ2UgJiYgZF9vLmRpdikKCQl7CgkJCWRkLmdldFdIKGRfbyk7CgkJCWlmKGRfby5kaXYucG9zX3JlbCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfby5kaXYpOwoJCQkJdmFyIGRfZHggPSBkZC54IC0gZF9vLngsIGRfZHkgPSBkZC55IC0gZF9vLnk7CgkJCQlkX28uZGVmeCArPSBkX2R4OwoJCQkJZF9vLnggKz0gZF9keDsKCQkJCWRfby5kZWZ5ICs9IGRfZHk7CgkJCQlkX28ueSArPSBkX2R5OwoJCQkJZm9yKHZhciBkX3AsIGRfaiA9IGRfby5jaGlsZHJlbi5sZW5ndGg7IGRfajspCgkJCQl7CgkJCQkJaWYoIShkX3AgPSBkX28uY2hpbGRyZW5bLS1kX2pdKS5kZXRhY2hlZCAmJiAoZF9vICE9IGRfcC5kZWZwYXJlbnQgfHwgIShkX3AuaXNfaW1hZ2UgJiYgZGQuZ2V0SW1nKGRfcCwgZF9wLm9pbWcubmFtZSwgMSkpKSkKCQkJCQl7CgkJCQkJCWRfcC5kZWZ4ICs9IGRfZHg7CgkJCQkJCWRfcC5kZWZ5ICs9IGRfZHk7CgkJCQkJCWRfcC5tb3ZlQnkoZF9keCwgZF9keSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYoZF9vLmlzX2ltYWdlICYmICFkZC5uNCkKCQl7CgkJCWlmKGRkLm42ICYmIGRfeCAmJiAhZF9vLmRlZncpIGRfby5yZXNpemVUbyhkX28uZGVmdyA9IGRkLmdldEltZ1coZF9vLm9pbWcpLCBkX28uZGVmaCA9IGRkLmdldEltZ0goZF9vLm9pbWcpKTsKCQkJdmFyIGRfZGVmeCA9IGRfby5kZWZ4LCBkX2RlZnkgPSBkX28uZGVmeTsKCQkJaWYoIShkX28ucGFyZW50ICYmIGRfby5wYXJlbnQgIT0gZF9vLmRlZnBhcmVudCkgJiYgKGRfeCB8fCAhZF9vLmRldGFjaGVkIHx8IGRfby5ob3Jpem9udGFsIHx8IGRfby52ZXJ0aWNhbCkgJiYgZGQuZ2V0SW1nKGRfbywgZF9vLm9pbWcubmFtZSwgMSkpCgkJCQlkX28ubW92ZUJ5KGRfby5kZWZ4LWRfZGVmeCwgZF9vLmRlZnktZF9kZWZ5KTsKCQl9Cgl9Cn07CmZ1bmN0aW9uIFdJTlNaKGRfeCkKewoJaWYoZF94KQoJewoJCWlmKGRkLm40KQoJCXsKCQkJZGQuaVcgPSBpbm5lcldpZHRoOwoJCQlkZC5pSCA9IGlubmVySGVpZ2h0OwoJCX0KCQl3aW5kb3cub25yZXNpemUgPSBuZXcgRnVuY3Rpb24oJ1dJTlNaKCk7Jyk7Cgl9CgllbHNlIGlmKGRkLm40ICYmIChpbm5lcldpZHRoICE9IGRkLmlXIHx8IGlubmVySGVpZ2h0ICE9IGRkLmlIKSkgbG9jYXRpb24ucmVsb2FkKCk7CgllbHNlIGlmKCFkZC5uNCkgc2V0VGltZW91dCgnZGQucmVjYWxjKCknLCAweGEpOwp9CldJTlNaKDEpOwoKZnVuY3Rpb24gRERPYmooZF9vLCBkX2kpCnsKCXRoaXMuaWQgPSBkX287Cgl0aGlzLmNtZCA9ICcnOwoJdGhpcy5jcHlfbiA9IGRkLmdldENtZFZhbCh0aGlzLCBDT1BZKTsKCXRoaXMubWF4b2ZmYiA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZCT1RUT00sIDAsIDEpOwoJdGhpcy5tYXhvZmZsID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRkxFRlQsIDAsIDEpOwoJdGhpcy5tYXhvZmZyID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRlJJR0hULCAwLCAxKTsKCXRoaXMubWF4b2ZmdCA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZUT1AsIDAsIDEpOwoJdmFyIGRfaiA9IGRkX2N1cnNvcnMubGVuZ3RoOyB3aGlsZShkX2otLSkKCQlpZihkZC5nZXRDbWQodGhpcywgZGRfY3Vyc29yc1tkX2pdLCAxKSkgdGhpcy5jdXJzb3IgPSBkZF9jdXJzb3JzW2Rfal0uc3Vic3RyaW5nKDIpOwoJdGhpcy5jbG9uZSA9IGRkLmdldENtZCh0aGlzLCBDTE9ORSwgMSk7Cgl0aGlzLmRldGFjaCA9IGRkLmdldENtZCh0aGlzLCBERVRBQ0hfQ0hJTERSRU4pOwoJdGhpcy5zY2FsYWJsZSA9IGRkLmdldENtZCh0aGlzLCBTQ0FMQUJMRSwgMSk7Cgl0aGlzLmhvcml6b250YWwgPSBkZC5nZXRDbWQodGhpcywgSE9SSVpPTlRBTCk7Cgl0aGlzLm5vYWx0ID0gZGQuZ2V0Q21kKHRoaXMsIE5PX0FMVCwgMSk7Cgl0aGlzLm5vZHJhZyA9IGRkLmdldENtZCh0aGlzLCBOT19EUkFHKTsKCXRoaXMuc2Nyb2xsID0gZGQuZ2V0Q21kKHRoaXMsIFNDUk9MTCwgMSk7Cgl0aGlzLnJlc2l6YWJsZSA9IGRkLmdldENtZCh0aGlzLCBSRVNJWkFCTEUsIDEpOwoJdGhpcy5yZV96ID0gZGQuZ2V0Q21kKHRoaXMsIFJFU0VUX1osIDEpOwoJdGhpcy5kaWFwaGFuID0gZGQuZ2V0Q21kKHRoaXMsIFRSQU5TUEFSRU5ULCAxKTsKCXRoaXMudmVydGljYWwgPSBkZC5nZXRDbWQodGhpcywgVkVSVElDQUwpOwoJdGhpcy5tYXh3ID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWFdJRFRILCAxLCAxKTsKCXRoaXMubWludyA9IE1hdGguYWJzKGRkLmdldENtZFZhbCh0aGlzLCBNSU5XSURUSCwgMSwgMSkpOwoJdGhpcy5tYXhoID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWEhFSUdIVCwgMSwgMSk7Cgl0aGlzLm1pbmggPSBNYXRoLmFicyhkZC5nZXRDbWRWYWwodGhpcywgTUlOSEVJR0hULCAxLCAxKSk7Cgl0aGlzLnBpY2tGdW5jID0gdGhpcy5kcmFnRnVuYyA9IHRoaXMucmVzaXplRnVuYyA9IHRoaXMuZHJvcEZ1bmMgPSBudWxsOwoKCXRoaXMubmFtZSA9IHRoaXMuaWQgKyAoZF9pIHx8ICcnKTsKCXRoaXMub2ltZyA9IGRkLmdldEltZyh0aGlzLCB0aGlzLmlkLCAxKTsKCXRoaXMuaXNfaW1hZ2UgPSAhIXRoaXMub2ltZzsKCXRoaXMuY29waWVzID0gbmV3IEFycmF5KCk7Cgl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Cgl0aGlzLnBhcmVudCA9IHRoaXMub3JpZ2luYWwgPSBudWxsOwoJaWYodGhpcy5vaW1nKQoJewoJCXRoaXMuaWQgPSB0aGlzLm5hbWUgKyAiZElpMTV2IjsKCQl0aGlzLncgPSBkZC5nZXRJbWdXKHRoaXMub2ltZyk7CgkJdGhpcy5oID0gZGQuZ2V0SW1nSCh0aGlzLm9pbWcpOwoJCXRoaXMuZHcgPSB0aGlzLmRoID0gMDsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLm9pbWcsICd6LWluZGV4JywnekluZGV4JywnekluZGV4JykpIHx8IDE7CgkJdGhpcy5kZWZzcmMgPSB0aGlzLnNyYyA9IHRoaXMub2ltZy5zcmM7CgkJdGhpcy5odG0gPSAnPGltZyBuYW1lPSInICsgdGhpcy5pZCArICdOSTFtNkciJysKCQkJJyBzcmM9IicgKyB0aGlzLm9pbWcuc3JjICsgJyIgJysKCQkJJ3dpZHRoPSInICsgdGhpcy53ICsgJyIgaGVpZ2h0PSInICsgdGhpcy5oICsgJyI+JzsKCQl0aGlzLnRfaHRtID0gJzxkaXYgaWQ9IicgKyB0aGlzLmlkICsKCQkJJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOycrCgkJCSdsZWZ0OicgKyAodGhpcy5jc3N4ID0gdGhpcy54ID0gdGhpcy5kZWZ4KSArICdweDsnKwoJCQkndG9wOicgKyAodGhpcy5jc3N5ID0gdGhpcy55ID0gdGhpcy5kZWZ5KSArICdweDsnKwoJCQknd2lkdGg6JyArIHRoaXMudyArICdweDsnKwoJCQknaGVpZ2h0OicgKyB0aGlzLmggKyAncHg7Ij4nKwoJCQl0aGlzLmh0bSArICc8L2Rpdj4nOwoJfQoJZWxzZQoJewoJCWlmKCEhKHRoaXMuZGl2ID0gZGQuZ2V0RGl2KHRoaXMuaWQpKSAmJiB0eXBlb2YgdGhpcy5kaXYuc3R5bGUgIT0gZGRfdSkgdGhpcy5jc3MgPSB0aGlzLmRpdi5zdHlsZTsKCQlkZC5nZXRXSCh0aGlzKTsKCQlpZih0aGlzLmRpdikKCQl7CgkJCXRoaXMuZGl2LmRkT2JqID0gdGhpczsKCQkJdGhpcy5kaXYucG9zX3JlbCA9IGRkLmdldENzc1Byb3AodGhpcy5kaXYsICdwb3NpdGlvbicsJ3Bvc2l0aW9uJywncG9zaXRpb24nKSA9PSAicmVsYXRpdmUiOwoJCX0KCQlkZC5nZXRQYWdlWFkodGhpcy5kaXYpOwoJCXRoaXMuZGVmeCA9IHRoaXMueCA9IGRkLng7CgkJdGhpcy5kZWZ5ID0gdGhpcy55ID0gZGQueTsKCQlkZC5nZXRDc3NYWSh0aGlzKTsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgJ3otaW5kZXgnLCd6SW5kZXgnLCd6SW5kZXgnKSk7Cgl9Cgl0aGlzLmRlZncgPSB0aGlzLncgfHwgMDsKCXRoaXMuZGVmaCA9IHRoaXMuaCB8fCAwOwp9CkRET2JqLnByb3RvdHlwZS5zZXRQaWNrRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5waWNrRnVuYyA9IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdGdW5jID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLmRyYWdGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0UmVzaXplRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5yZXNpemVGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0RHJvcEZ1bmMgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuZHJvcEZ1bmMgPSBkX3g7Cn07CkRET2JqLnByb3RvdHlwZS5tb3ZlQnkgPSBmdW5jdGlvbihkX3gsIGRfeSwgZF9rZHMsIGRfbykKewoJaWYoIXRoaXMuZGl2KSByZXR1cm47Cgl0aGlzLnggKz0gKGRfeCA9IGRkLkludChkX3gpKTsKCXRoaXMueSArPSAoZF95ID0gZGQuSW50KGRfeSkpOwoJaWYoIWRfa2RzIHx8IHRoaXMuaXNfaW1hZ2UgfHwgdGhpcy5wYXJlbnQgIT0gdGhpcy5kZWZwYXJlbnQpCgl7CgkJKGRfbyA9IHRoaXMuY3NzIHx8IHRoaXMuZGl2KS5sZWZ0ID0gKHRoaXMuY3NzeCArPSBkX3gpICsgZGQucHg7CgkJZF9vLnRvcCA9ICh0aGlzLmNzc3kgKz0gZF95KSArIGRkLnB4OwoJfQoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLm1vdmVCeShkX3gsIGRfeSwgMSk7CgkJZF9vLmRlZnggKz0gZF94OwoJCWRfby5kZWZ5ICs9IGRfeTsKCX0KfTsKCkRET2JqLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdGhpcy5tb3ZlQnkoZGQuSW50KGRfeCktdGhpcy54LCBkZC5JbnQoZF95KS10aGlzLnkpOwp9OwpERE9iai5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGRfbSwgZF9vLCBkX3ApCnsKCWlmKHRoaXMuZGl2ICYmIHRoaXMudmlzaWJsZSkKCXsKCQlkX3AgPSB0aGlzLmNzcyB8fCB0aGlzLmRpdjsKCQlpZihkX20gJiYgIWRkLm40KQoJCXsKCQkJdGhpcy5kaXNwbGF5ID0gZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCWlmKHRoaXMub2ltZykKCQkJewoJCQkJdGhpcy5vaW1nLmRpc3BsYXkgPSBkZC5nZXRDc3NQcm9wKHRoaXMub2ltZywgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCQl0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJfQoJCQlkX3AuZGlzcGxheSA9ICJub25lIjsKCQkJZGQucmVjYWxjKCk7CgkJfQoJCWVsc2UgZF9wLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCX0KCXRoaXMudmlzaWJsZSA9IGZhbHNlOwoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLmhpZGUoZF9tKTsKfTsKRERPYmoucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihkX28sIGRfcCkKewoJaWYodGhpcy5kaXYpCgl7CgkJZF9wID0gdGhpcy5jc3MgfHwgdGhpcy5kaXY7CgkJaWYoZF9wLmRpc3BsYXkgJiYgZF9wLmRpc3BsYXkgPT0gIm5vbmUiKQoJCXsKCQkJZF9wLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXkgfHwgImJsb2NrIjsKCQkJaWYodGhpcy5vaW1nKSB0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9IHRoaXMub2ltZy5kaXNwbGF5IHx8ICJpbmxpbmUiOwoJCQlkZC5yZWNhbGMoKTsKCQl9CgkJZWxzZSBkX3AudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCX0KCXRoaXMudmlzaWJsZSA9IHRydWU7Cglmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2hvdygpOwp9OwpERE9iai5wcm90b3R5cGUucmVzaXplVG8gPSBmdW5jdGlvbihkX3csIGRfaCwgZF9vKQp7CglpZighdGhpcy5kaXYpIHJldHVybjsKCWRfdyA9ICh0aGlzLncgPSBkZC5JbnQoZF93KSktdGhpcy5kdzsKCWRfaCA9ICh0aGlzLmggPSBkZC5JbnQoZF9oKSktdGhpcy5kaDsKCWlmKGRkLm40KQoJewoJCXRoaXMuZGl2LnJlc2l6ZVRvKGRfdywgZF9oKTsKCQlpZih0aGlzLmlzX2ltYWdlKQoJCXsKCQkJdGhpcy53cml0ZSgnPGltZyBzcmM9IicgKyB0aGlzLnNyYyArICciIHdpZHRoPSInICsgZF93ICsgJyIgaGVpZ2h0PSInICsgZF9oICsgJyI+Jyk7CgkJCSh0aGlzLm5pbWcgPSB0aGlzLmRpdi5kb2N1bWVudC5pbWFnZXNbMF0pLnNyYyA9IHRoaXMuc3JjOwoJCX0KCX0KCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLnBpeGVsV2lkdGggIT0gZGRfdSkKCXsKCQl0aGlzLmNzcy5waXhlbFdpZHRoID0gZF93OwoJCXRoaXMuY3NzLnBpeGVsSGVpZ2h0ID0gZF9oOwoJCWlmKHRoaXMuaXNfaW1hZ2UpCgkJewoJCQkoZF9vID0gdGhpcy5uaW1nLnN0eWxlKS5waXhlbFdpZHRoID0gZF93OwoJCQlkX28ucGl4ZWxIZWlnaHQgPSBkX2g7CgkJfQoJfQoJZWxzZQoJewoJCXRoaXMuY3NzLndpZHRoID0gZF93ICsgZGQucHg7CgkJdGhpcy5jc3MuaGVpZ2h0ID0gZF9oICsgZGQucHg7CgkJaWYodGhpcy5pc19pbWFnZSkKCQl7CgkJCShkX28gPSB0aGlzLm5pbWcpLndpZHRoID0gZF93OwoJCQlkX28uaGVpZ2h0ID0gZF9oOwoJCQlpZighZF9vLmNvbXBsZXRlKSBkX28uc3JjID0gdGhpcy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUucmVzaXplQnkgPSBmdW5jdGlvbihkX2R3LCBkX2RoKQp7Cgl0aGlzLnJlc2l6ZVRvKHRoaXMudytkZC5JbnQoZF9kdyksIHRoaXMuaCtkZC5JbnQoZF9kaCkpOwp9OwpERE9iai5wcm90b3R5cGUuc3dhcEltYWdlID0gZnVuY3Rpb24oZF94LCBkX2NwKQp7CglpZighdGhpcy5uaW1nKSByZXR1cm47Cgl0aGlzLm5pbWcuc3JjID0gZF94OwoJdGhpcy5zcmMgPSB0aGlzLm5pbWcuc3JjOwoJaWYoZF9jcCkKCXsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY29waWVzLmxlbmd0aDsgZF9pOykKCQl7LS1kX2k7CgkJCXRoaXMuY29waWVzW2RfaV0uc3JjID0gdGhpcy5jb3BpZXNbZF9pXS5uaW1nLnNyYyA9IHRoaXMubmltZy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUuc2V0QmdDb2xvciA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZGQubjQgJiYgdGhpcy5kaXYpIHRoaXMuZGl2LmJnQ29sb3IgPSBkX3g7CgllbHNlIGlmKHRoaXMuY3NzKSB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gZF94OwoJdGhpcy5iZ0NvbG9yID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkX3gsIGRfbykKewoJdGhpcy50ZXh0ID0gZF94OwoJaWYoIXRoaXMuZGl2KSByZXR1cm47CglpZihkZC5uNCkKCXsKCQkoZF9vID0gdGhpcy5kaXYuZG9jdW1lbnQpLm9wZW4oKTsKCQlkX28ud3JpdGUoZF94KTsKCQlkX28uY2xvc2UoKTsKCQlkZC5nZXRXSCh0aGlzKTsKCX0KCWVsc2UKCXsKCQl0aGlzLmNzcy5oZWlnaHQgPSAnYXV0byc7CgkJdGhpcy5kaXYuaW5uZXJIVE1MID0gZF94OwoJCWlmKCFkZC5pZTQpIGRkLnJlY2FsYygpOwoJCWlmKGRkLmllNCB8fCBkZC5uNikgc2V0VGltZW91dCgnZGQucmVjYWxjKCk7JywgMCk7IC8vIG42LjA6IHJlY2FsYyB0d2ljZQoJfQp9OwpERE9iai5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRfbiwgZF9wLCBkX2IpCnsKCWlmKCF0aGlzLm9pbWcpIHJldHVybjsKCWRfYiA9IChkZC5pZSAmJiBkb2N1bWVudC5hbGwudGFncygnYm9keScpKT8gZG9jdW1lbnQuYWxsLnRhZ3MoJ2JvZHknKVswXSA6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSB8fCBkZC5kYikgOiBkZC5kYjsKCWZvcihkX24gPSBkX24gfHwgMTsgZF9uID4gMDsgLS1kX24pCgl7CgkJdmFyIGRfbCA9IHRoaXMuY29waWVzLmxlbmd0aCwKCQlkX28gPSBuZXcgRERPYmoodGhpcy5uYW1lK3RoaXMuY21kLCBkX2wrMSk7CgkJaWYoZGQubjQpCgkJewoJCQlkX28uaWQgPSAoZF9wID0gbmV3IExheWVyKGRfby53KSkubmFtZTsKCQkJZF9wLmNsaXAuaGVpZ2h0ID0gZF9vLmg7CgkJCWRfcC52aXNpYmlsaXR5ID0gJ3Nob3cnOwoJCQkoZF9wID0gZF9wLmRvY3VtZW50KS5vcGVuKCk7CgkJCWRfcC53cml0ZShkX28uaHRtKTsKCQkJZF9wLmNsb3NlKCk7CgkJfQoJCWVsc2UgaWYoZF9iICYmIGRfYi5pbnNlcnRBZGphY2VudEhUTUwpIGRfYi5pbnNlcnRBZGphY2VudEhUTUwoIkFmdGVyQmVnaW4iLCBkX28udF9odG0pOwoJCWVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBkX2IgJiYgZF9iLmFwcGVuZENoaWxkKQoJCXsKCQkJZF9iLmFwcGVuZENoaWxkKGRfcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRJaTE1diIpKTsKCQkJZF9wLmlubmVySFRNTCA9IGRfby5odG07CgkJCWRfcC5pZCA9IGRfby5pZDsKCQkJZF9wLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJZF9wLnN0eWxlLndpZHRoID0gZF9vLncgKyAncHgnOwoJCQlkX3Auc3R5bGUuaGVpZ2h0ID0gZF9vLmggKyAncHgnOwoJCX0KCQllbHNlIGlmKGRfYiAmJiBkX2IuaW5uZXJIVE1MKSBkX2IuaW5uZXJIVE1MICs9IGRfby50X2h0bTsKCQlkX28uZGVmeiA9IHRoaXMuZGVmeisxK2RfbDsKCQlkZC5hZGRQcm9wcyhkX28pOwoJCWRfby5vcmlnaW5hbCA9IHRoaXM7CgkJZGQuYWRkRWx0KGRfbywgdGhpcyk7CgkJaWYodGhpcy5wYXJlbnQpCgkJewoJCQl0aGlzLnBhcmVudC5hZGRDaGlsZChkX28sIHRoaXMuZGV0YWNoZWQpOwoJCQlkX28uZGVmcGFyZW50ID0gdGhpcy5kZWZwYXJlbnQ7CgkJfQoJCWRfby5tb3ZlVG8oZF9vLmRlZnggPSB0aGlzLmRlZngsIGRfby5kZWZ5ID0gdGhpcy5kZWZ5KTsKCQlpZihkZC5uNCkgZF9vLmRlZnNyYyA9IGRfby5zcmMgPSB0aGlzLmRlZnNyYzsKCQlkX28uc3dhcEltYWdlKHRoaXMuc3JjKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oZF9rZCwgZGV0YWNoLCBkZWZwKQp7CglpZih0eXBlb2YgZF9rZCAhPSAib2JqZWN0IikgZF9rZCA9IGRkLmVsZW1lbnRzW2Rfa2RdOwoJaWYoZF9rZC5wYXJlbnQgJiYgZF9rZC5wYXJlbnQgPT0gdGhpcyB8fCBkX2tkID09IHRoaXMgfHwgIWRfa2QuaXNfaW1hZ2UgJiYgZF9rZC5kZWZwYXJlbnQgJiYgIWRlZnApIHJldHVybjsKCgl0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IHRoaXMuY2hpbGRyZW5bZF9rZC5uYW1lXSA9IGRfa2Q7CglkX2tkLmRldGFjaGVkID0gZGV0YWNoIHx8IDA7CglpZihkZWZwKSBkX2tkLmRlZnBhcmVudCA9IHRoaXM7CgllbHNlIGlmKHRoaXMgPT0gZF9rZC5kZWZwYXJlbnQgJiYgZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKHRoaXMsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCWlmKCFkX2tkLmRlZnBhcmVudCB8fCB0aGlzICE9IGRfa2QuZGVmcGFyZW50KQoJewoJCWRfa2QuZGVmeCA9IGRfa2QueDsKCQlkX2tkLmRlZnkgPSBkX2tkLnk7Cgl9CglpZighZGV0YWNoKQoJewoJCWRfa2QuZGVmeiA9IGRfa2QuZGVmeit0aGlzLmRlZnotKGRfa2QucGFyZW50PyBkX2tkLnBhcmVudC5kZWZ6IDogMCkrKCFkX2tkLmlzX2ltYWdlKjEpOwoJCWRfa2Quc2V0WihkX2tkLnordGhpcy56LShkX2tkLnBhcmVudD8gZF9rZC5wYXJlbnQueiA6IDApKyghZF9rZC5pc19pbWFnZSoxKSwgMSk7Cgl9CglpZihkX2tkLnBhcmVudCkgZF9rZC5wYXJlbnQucmVtb3ZlQ2hpbGQoZF9rZCwgMSk7CglkX2tkLnBhcmVudCA9IHRoaXM7Cn07CkRET2JqLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGRfa2QsIGRfbmV3cCkKewoJaWYodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpIGRfa2QgPSB0aGlzLmNoaWxkcmVuW2Rfa2RdOwoJdmFyIGRfb2MgPSB0aGlzLmNoaWxkcmVuLCBkX25jID0gbmV3IEFycmF5KCk7Cglmb3IodmFyIGRfaSA9IDA7IGRfaSA8IGRfb2MubGVuZ3RoOyBkX2krKykKCQlpZihkX29jW2RfaV0gIT0gZF9rZCkgZF9uY1tkX25jLmxlbmd0aF0gPSBkX29jW2RfaV07Cgl0aGlzLmNoaWxkcmVuID0gZF9uYzsKCWRfa2QucGFyZW50ID0gbnVsbDsKCWlmKCFkX25ld3ApCgl7CgkJZF9rZC5kZXRhY2hlZCA9IGRfa2QuZGVmcCA9IDA7CgkJaWYoZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKGRfa2QsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmF0dGFjaENoaWxkID0gZnVuY3Rpb24oZF9rZCkKewoJKGRfa2QgPSAodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpPyB0aGlzLmNoaWxkcmVuW2Rfa2RdOiBkX2tkKS5kZXRhY2hlZCA9IDA7CglkX2tkLnNldFooZF9rZC5kZWZ6ICsgdGhpcy56LXRoaXMuZGVmeiwgMSk7Cn07CkRET2JqLnByb3RvdHlwZS5kZXRhY2hDaGlsZCA9IGZ1bmN0aW9uKGRfa2QpCnsKCShkX2tkID0gKHR5cGVvZiBkX2tkICE9ICJvYmplY3QiKT8gdGhpcy5jaGlsZHJlbltkX2tkXTogZF9rZCkuZGV0YWNoZWQgPSAxOwp9OwpERE9iai5wcm90b3R5cGUuc2V0WiA9IGZ1bmN0aW9uKGRfeCwgZF9rZHMsIGRfbykKewoJaWYoZF9rZHMpCgl7CgkJZm9yKHZhciBkX2R6ID0gZF94LXRoaXMueiwgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28ueitkX2R6LCAxKTsKCX0KCWRkLnogPSBNYXRoLm1heChkZC56LCB0aGlzLnogPSB0aGlzLmRpdj8gKCh0aGlzLmNzcyB8fCB0aGlzLmRpdikuekluZGV4ID0gZF94KSA6IDApOwp9OwpERE9iai5wcm90b3R5cGUubWF4aW1pemVaID0gZnVuY3Rpb24oKQp7Cgl0aGlzLnNldFooZGQueisxLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9yZXNldFogPSBmdW5jdGlvbihkX28pCnsKCWlmKHRoaXMucmVfeiB8fCBkZC5yZV96KQoJewoJCXRoaXMuc2V0Wih0aGlzLmRlZnopOwoJCWZvcih2YXIgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28uZGVmeik7Cgl9Cn07CkRET2JqLnByb3RvdHlwZS5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLm9wYWNpdHkgPSBkX3g7Cgl0aGlzLl9zZXRPcGFSZWwoMS4wLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRPcGFSZWwgPSBmdW5jdGlvbihkX3gsIGRfa2QsIGRfeSwgZF9vKQp7CglpZih0aGlzLmNzcyAmJiAodGhpcy5kaWFwaGFuIHx8IGRfa2QpKQoJewoJCWRfeSA9IHRoaXMub3BhY2l0eSpkX3g7CgkJaWYodHlwZW9mIHRoaXMuY3NzLk1vek9wYWNpdHkgIT0gZGRfdSkgdGhpcy5jc3MuTW96T3BhY2l0eSA9IGRfeTsKCQllbHNlIGlmICh0eXBlb2YgdGhpcy5jc3Mub3BhY2l0eSAhPSBkZF91KSB0aGlzLmNzcy5vcGFjaXR5ID0gZF95OwoJCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLmZpbHRlciAhPSBkZF91KQoJCQl0aGlzLmNzcy5maWx0ZXIgPSAiQWxwaGEob3BhY2l0eT0iK3BhcnNlSW50KDEwMCpkX3kpKyIpIjsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLl9zZXRPcGFSZWwoZF94LCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5fc2V0Q3JzKHRoaXMuY3Vyc29yID0gKGRfeC5pbmRleE9mKCdjOicpKzEpPyBkX3guc3Vic3RyaW5nKDIpIDogZF94KTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRDcnMgPSBmdW5jdGlvbihkX3gpCnsKCWlmKHRoaXMuY3NzKSB0aGlzLmNzcy5jdXJzb3IgPSAoKCFkZC5pZSB8fCBkZC5pZW1hYykgJiYgZF94ID09ICdoYW5kJyk/ICdwb2ludGVyJyA6IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdnYWJsZSA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ub2RyYWcgPSAhZF94KjE7Cgl0aGlzLl9zZXRDcnMoZF94PyB0aGlzLmN1cnNvciA6ICdhdXRvJyk7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRSZXNpemFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMucmVzaXphYmxlID0gZF94KjE7CglpZihkX3gpIHRoaXMuc2NhbGFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0U2NhbGFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuc2NhbGFibGUgPSBkX3gqMTsKCWlmKGRfeCkgdGhpcy5yZXNpemFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0SG9yaXpvbnRhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ob3Jpem9udGFsID0gZF94KjE7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRWZXJ0aWNhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy52ZXJ0aWNhbCA9IGRfeCoxOwp9OwpERE9iai5wcm90b3R5cGUuZ2V0RWx0QmVsb3cgPSBmdW5jdGlvbihkX3JldCwgZF94LCBkX3kpCnsKCXZhciBkX28sIGRfY21wID0gLTEsIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgd2hpbGUoZF9pLS0pCgl7CgkJZF9vID0gZGQuZWxlbWVudHNbZF9pXTsKCQlkX3ggPSBkX28ueC10aGlzLncvMjsKCQlkX3kgPSBkX28ueS10aGlzLmgvMjsKCQlpZihkX28udmlzaWJsZSAmJiBkX28ueiA8IHRoaXMueiAmJiB0aGlzLnggPj0gZF94ICYmIHRoaXMueCA8PSBkX3grZF9vLncgJiYgdGhpcy55ID49IGRfeSAmJiB0aGlzLnkgPD0gZF95K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCkKCQkJewoJCQkJZF9jbXAgPSBkX28uejsKCQkJCWRfcmV0ID0gZF9vOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGRfcmV0Owp9OwpERE9iai5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24oZF9vcywgZF9vKQp7Cgl2YXIgZF9pLCBkX2w7CglpZih0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCkgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CglpZih0aGlzLm9yaWdpbmFsKQoJewoJCXRoaXMuaGlkZSgpOwoJCWlmKHRoaXMub3JpZ2luYWwuY29waWVzKQoJCXsKCQkJZF9vcyA9IG5ldyBBcnJheSgpOwoJCQlmb3IoZF9sID0gdGhpcy5vcmlnaW5hbC5jb3BpZXMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJCQkJaWYoKGRfbyA9IHRoaXMub3JpZ2luYWwuY29waWVzW2RfaV0pICE9IHRoaXMpIGRfb3NbZF9vLm5hbWVdID0gZF9vc1tkX29zLmxlbmd0aF0gPSBkX287CgkJCXRoaXMub3JpZ2luYWwuY29waWVzID0gZF9vczsKCQl9Cgl9CgllbHNlIGlmKHRoaXMuaXNfaW1hZ2UpCgl7CgkJdGhpcy5oaWRlKCk7CgkJaWYodGhpcy5vaW1nKQoJCXsKCQkgIGlmKGRkLm40KSB0aGlzLm9pbWcuc3JjID0gdGhpcy5kZWZzcmM7CgkJICBlbHNlIHRoaXMub2ltZy5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwoJCX0KCX0KCWVsc2UgaWYodGhpcy5tb3ZlVG8pCgl7CgkJaWYodGhpcy5jc3MpIHRoaXMuY3NzLmN1cnNvciA9ICdkZWZhdWx0JzsKCQl0aGlzLm1vdmVUbyh0aGlzLmRlZngsIHRoaXMuZGVmeSk7CgkJdGhpcy5yZXNpemVUbyh0aGlzLmRlZncsIHRoaXMuZGVmaCk7Cgl9CglkX29zID0gbmV3IEFycmF5KCk7Cglmb3IoZF9sID0gZGQuZWxlbWVudHMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1tkX2ldKSAhPSB0aGlzKSBkX29zW2Rfby5uYW1lXSA9IGRfb3NbZF9vLmluZGV4ID0gZF9vcy5sZW5ndGhdID0gZF9vOwoJCWVsc2UgZF9vLl9mcmVlKCk7Cgl9CglkZC5lbGVtZW50cyA9IGRfb3M7CglpZighZGQubjQpIGRkLnJlY2FsYygpOwp9OwpERE9iai5wcm90b3R5cGUuX2ZyZWUgPSBmdW5jdGlvbigpCnsKCWZvcih2YXIgZF9pIGluIHRoaXMpCgkJdGhpc1tkX2ldID0gbnVsbDsKCWRkLmVsZW1lbnRzW3RoaXMubmFtZV0gPSBudWxsOwp9OwpkZC5uNFJlY3RWaXMgPSBmdW5jdGlvbih2aXMpCnsKCWZvcih2YXIgZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5yZWN0SVtkX2ldLnZpc2liaWxpdHkgPSBkZC5yZWN0QVtkX2ldLnZpc2liaWxpdHkgPSB2aXM/ICdzaG93JyA6ICdoaWRlJzsKCQlpZih2aXMpIGRkLnJlY3RJW2RfaV0uekluZGV4ID0gZGQucmVjdEFbZF9pXS56SW5kZXggPSBkZC56KzI7Cgl9Cn07CmRkLm40UmVjdFBvcyA9IGZ1bmN0aW9uKGRfbywgZF94LCBkX3ksIGRfdywgZF9oKQp7CglkX28ueCA9IGRfeDsKCWRfby55ID0gZF95OwoJZF9vLmNsaXAud2lkdGggPSBkX3c7CglkX28uY2xpcC5oZWlnaHQgPSBkX2g7Cn07Ci8vIE5ONDogRHJhdyBpbWcgc2l6aW5nIHJlY3QKZGQubjRSZWN0ID0gZnVuY3Rpb24oZF93LCBkX2gpCnsKCXZhciBkX2k7CglpZighZGQucmVjdEkpCgl7CgkJZGQucmVjdEkgPSBuZXcgQXJyYXkoKTsKCQlkZC5yZWN0QSA9IG5ldyBBcnJheSgpOwoJfQoJaWYoIWRkLnJlY3RJWzBdKQoJewoJCWZvcihkX2kgPSA0OyBkX2k7KQoJCXsKCQkJKGRkLnJlY3RJWy0tZF9pXSA9IG5ldyBMYXllcigxKSkuYmdDb2xvciA9ICcjMDAwMDAwJzsKCQkJKGRkLnJlY3RBW2RfaV0gPSBuZXcgTGF5ZXIoMSkpLmJnQ29sb3IgPSAnI2ZmZmZmZic7CgkJfQoJfQoJaWYoIWRkLnJlY3RJWzBdLnZpc2liaWxpdHkgfHwgZGQucmVjdElbMF0udmlzaWJpbGl0eSA9PSAnaGlkZScpIGRkLm40UmVjdFZpcygxKTsKCWRkLm9iai53ID0gZF93OwoJZGQub2JqLmggPSBkX2g7Cglmb3IoZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5uNFJlY3RQb3MoZGQucmVjdElbZF9pXSwgZGQub2JqLnggKyAoIShkX2ktMSk/IChkZC5vYmoudy0xKSA6IDApLCBkZC5vYmoueSArICghKGRfaS0yKT8gKGRkLm9iai5oLTEpIDogMCksIGRfaSYxIHx8IGRkLm9iai53LCAhKGRfaSYxKSB8fCBkZC5vYmouaCk7CgkJZGQubjRSZWN0UG9zKGRkLnJlY3RBW2RfaV0sICEoZF9pLTEpPyBkZC5yZWN0SVsxXS54KzEgOiAoZGQub2JqLngtMSksICEoZF9pLTIpPyBkZC5yZWN0SVsyXS55KzEgOiAoZGQub2JqLnktMSksIGRfaSYxIHx8IGRkLm9iai53KzIsICEoZF9pJjEpIHx8IGRkLm9iai5oKzIpOwoJfQp9OwpkZC5yZXN6VG8gPSBmdW5jdGlvbihkX3csIGRfaCkKewoJaWYoZGQubjQgJiYgZGQub2JqLmlzX2ltYWdlKSBkZC5uNFJlY3QoZF93LCBkX2gpOwoJZWxzZSBkZC5vYmoucmVzaXplVG8oZF93LCBkX2gpOwp9OwpkZC5lbWJlZFZpcyA9IGZ1bmN0aW9uKGRfdmlzKQp7Cgl2YXIgZF9vID0gbmV3IEFycmF5KCdpZnJhbWUnLCAnYXBwbGV0JywgJ2VtYmVkJywgJ29iamVjdCcpOwoJZm9yKHZhciBkX2kgPSBkX28ubGVuZ3RoOyBkX2k7KQoJey0tZF9pOwoJCXZhciBkX3AgPSBkZC5pZT8gZG9jdW1lbnQuYWxsLnRhZ3MoZF9vW2RfaV0pIDogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGRfb1tkX2ldKSA6IG51bGw7CgkJaWYoZF9wKQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX3AubGVuZ3RoOyBkX2o7KQoJCQl7CgkJCQl2YXIgZF9xID0gZF9wWy0tZF9qXTsKCQkJCXdoaWxlKGRfcS5vZmZzZXRQYXJlbnQgfHwgZF9xLnBhcmVudE5vZGUpCgkJCQl7CgkJCQkJaWYoKGRfcSA9IGRfcS5wYXJlbnROb2RlIHx8IGRfcS5vZmZzZXRQYXJlbnQgfHwgbnVsbCkgPT0gZGQub2JqLmRpdikKCQkJCQl7CgkJCQkJCWRfcFtkX2pdLnN0eWxlLnZpc2liaWxpdHkgPSBkX3ZpczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKZGQubWF4T2ZmWCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZsKzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ4LWRkLm9iai5tYXhvZmZsKS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZnIrMSAmJiAoZF95ID0gZGQub2JqLmRlZngrZGQub2JqLm1heG9mZnIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQubWF4T2ZmWSA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZ0KzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ5LWRkLm9iai5tYXhvZmZ0KS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZmIrMSAmJiAoZF95ID0gZGQub2JqLmRlZnkrZGQub2JqLm1heG9mZmIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQuaW5XbmRXID0gZnVuY3Rpb24oZF94LCBkX3kpCnsKCXZhciBkX3d4ID0gZGQuZ2V0U2Nyb2xsWCgpLAoJZF93dyA9IGRkLmdldFduZFcoKTsKCXJldHVybigKCQkoKGRfeSA9IGRfd3grMiktZF94ID4gMCkgfHwgKChkX3kgPSBkX3d4K2Rfd3crZGQub2JqLnctMiktZF94IDwgMCk/IGRfeQoJCTogZF94CgkpOwp9OwpkZC5pblduZEggPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdmFyIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCksCglkX3doID0gZGQuZ2V0V25kSCgpOwoJcmV0dXJuKAoJCSgoZF95ID0gZF93eSsyKS1kX3ggPiAwKSB8fCAoKGRfeSA9IGRfd3krZF93aCtkZC5vYmouaC0yKS1kX3ggPCAwKT8gZF95CgkJOiBkX3gKCSk7Cn07Ci8vIFRoZXNlIHR3byBmdW5jcyBsaW1pdCB0aGUgc2l6ZSBvZiBlbGVtZW50IHdoZW4gbW91c2VyZXNpemVkLgovLyBJbXBsZW1lbnRlZCAyMi41LjIwMDMgYnkgR3JlZ29yIEx0b2xmLCBtb2RpZmllZCBieSBXYWx0ZXIgWm9ybgpkZC5saW1XID0gZnVuY3Rpb24oZF93KQp7CglyZXR1cm4oCgkJKGRkLm9iai5taW53LWRfdyA+IDApPyBkZC5vYmoubWludwoJCTogKGRkLm9iai5tYXh3ID4gMCAmJiBkZC5vYmoubWF4dy1kX3cgPCAwKT8gZGQub2JqLm1heHcKCQk6IGRfdwoJKTsKfTsKZGQubGltSCA9IGZ1bmN0aW9uKGRfaCkKewoJcmV0dXJuKAoJCShkZC5vYmoubWluaC1kX2ggPiAwKT8gZGQub2JqLm1pbmgKCQk6IChkZC5vYmoubWF4aCA+IDAgJiYgZGQub2JqLm1heGgtZF9oIDwgMCk/IGRkLm9iai5tYXhoCgkJOiBkX2gKCSk7Cn07Ci8vIE9wdGlvbmFsIGF1dG9zY3JvbGwtcGFnZSBmdW5jdGlvbmFsaXR5LiBDb3VydGVzeSBDZWRyaWMgU2F2YXJlc2UuCi8vIE1vZGlmaWVkIGJ5IFdhbHRlciBab3JuLgpmdW5jdGlvbiBERFNjcm9sbCgpCnsKCWlmKCFkZC5vYmogfHwgIWRkLm9iai5zY3JvbGwgJiYgIWRkLnNjcm9sbCB8fCBkZC5pZTQgfHwgZGQud2hyYXRpbykKCXsKCQlkZC5zY3J4ID0gZGQuc2NyeSA9IDA7CgkJcmV0dXJuOwoJfQoJdmFyIGRfYm5kID0gMHgxYywKCWRfd3ggPSBkZC5nZXRTY3JvbGxYKCksIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCk7CglpZihkZC5tc21vdmVkKQoJewoJCXZhciBkX3d3ID0gZGQuZ2V0V25kVygpLCBkX3doID0gZGQuZ2V0V25kSCgpLCBkX3k7CgkJZGQuc2NyeCA9ICgoZF95ID0gZGQuZS54LWRfd3ctZF93eCtkX2JuZCkgPiAwKT8gKGRfeT4+PTIpKmRfeQoJCQk6ICgoZF95ID0gZF93eCtkX2JuZC1kZC5lLngpID4gMCk/IC0oZF95Pj49MikqZF95CgkJCTogMDsKCQlkZC5zY3J5ID0gKChkX3kgPSBkZC5lLnktZF93aC1kX3d5K2RfYm5kKSA+IDApPyAoZF95Pj49MikqZF95CgkJCTogKChkX3kgPSBkX3d5K2RfYm5kLWRkLmUueSkgPiAwKT8gLShkX3k+Pj0yKSpkX3kKCQkJOiAwOwoJfQoJaWYoZGQuc2NyeCB8fCBkZC5zY3J5KQoJewoJCXdpbmRvdy5zY3JvbGxUbygKCQkJZF93eCArIChkZC5zY3J4ID0gZGQub2JqLmlzX3Jlc2l6ZWQ/IGRkLmxpbVcoZGQub2JqLncrZGQuc2NyeCktZGQub2JqLncgOiBkZC5vYmoudmVydGljYWw/IDAgOiAoZGQubWF4T2ZmWChkZC5vYmoueCtkZC5zY3J4KS1kZC5vYmoueCkpLAoJCQlkX3d5ICsgKGRkLnNjcnkgPSBkZC5vYmouaXNfcmVzaXplZD8gZGQubGltSChkZC5vYmouaCtkZC5zY3J5KS1kZC5vYmouaCA6IGRkLm9iai5ob3Jpem9udGFsPyAwIDogKGRkLm1heE9mZlkoZGQub2JqLnkrZGQuc2NyeSktZGQub2JqLnkpKQoJCSk7CgkJZGQub2JqLmlzX2RyYWdnZWQ/IGRkLm9iai5tb3ZlVG8oZGQub2JqLngrZGQuZ2V0U2Nyb2xsWCgpLWRfd3gsIGRkLm9iai55K2RkLmdldFNjcm9sbFkoKS1kX3d5KQoJCQk6IGRkLnJlc3pUbyhkZC5vYmoudytkZC5nZXRTY3JvbGxYKCktZF93eCwgZGQub2JqLmgrZGQuZ2V0U2Nyb2xsWSgpLWRfd3kpOwoJfQoJZGQubXNtb3ZlZCA9IDA7Cgl3aW5kb3cuc2V0VGltZW91dCgnRERTY3JvbGwoKScsIDB4MzMpOwp9CmZ1bmN0aW9uIFBJQ0soZF9ldikKewoJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CglpZihkZC5lLnggPj0gZGQuZ2V0V25kVygpK2RkLmdldFNjcm9sbFgoKSB8fCBkZC5lLnkgPj0gZGQuZ2V0V25kSCgpK2RkLmdldFNjcm9sbFkoKSkgcmV0dXJuIHRydWU7IC8vIG9uIHNjcm9sbGJhcgoJZm9yKHZhciBkX28sIGRfdCwgZF9jbXAgPSAtMSwgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXTsKCQlpZihkZC5uNCAmJiBkZC5lLmJ1dCA+IDEgJiYgZGQuZS5zcmMgPT0gZF9vLm9pbWcgJiYgIWRfby5jbG9uZSkgcmV0dXJuIGZhbHNlOwoJCWlmKGRfby52aXNpYmxlICYmIGRkLmUuYnV0IDw9IDEgJiYgZGQuZS54ID49IGRfby54ICYmIGRkLmUueCA8PSBkX28ueCtkX28udyAmJiBkZC5lLnkgPj0gZF9vLnkgJiYgZGQuZS55IDw9IGRfby55K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCAmJiAoZF90ID0gZGQuZS5zcmMudGFnKS5pbmRleE9mKCdpbnB1JykgPCAwICYmIGRfdC5pbmRleE9mKCd0ZXh0YScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2VsZScpIDwgMCAmJiBkX3QuaW5kZXhPZignb3B0aScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2Nyb2wnKSA8IDApCgkJCXsKCQkJCWRfY21wID0gZF9vLno7CgkJCQlkZC5vYmogPSBkX287CgkJCX0KCQl9Cgl9CglpZihkZC5vYmopCgl7CgkJaWYoZGQub2JqLm5vZHJhZykgZGQub2JqID0gbnVsbDsKCQllbHNlCgkJewoJCQlkZC5lLmUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCQkJdmFyIGRfcnN6ID0gZGQuZS5tb2RpZktleSAmJiAoZGQub2JqLnJlc2l6YWJsZSB8fCBkZC5vYmouc2NhbGFibGUpOwoJCQlpZihkZC5vcCkKCQkJewoJCQkJKGRfbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdPcEJsVXInKSkuc3R5bGUucGl4ZWxMZWZ0ID0gZGQuZS54OwoJCQkJZF9vLnN0eWxlLnBpeGVsVG9wID0gZGQuZS55OwoJCQkJKGRfbyA9IGRfby5jaGlsZHJlblswXS5jaGlsZHJlblswXSkuZm9jdXMoKTsKCQkJCWRfby5ibHVyKCk7CgkJCX0KCQkJZWxzZSBpZihkZC5pZSAmJiAhZGQuaWU0KQoJCQl7CgkJCQlpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKCQkJCWRkLmRiLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpCgkJCQl7CgkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQkJCX07CgkJCX0KCQkJaWYoZF9yc3opCgkJCXsKCQkJCWRkLm9iai5fc2V0Q3JzKCdzZS1yZXNpemUnKTsKCQkJCWRkLm9iai5pc19yZXNpemVkID0gMTsKCQkJCWRkLndocmF0aW8gPSBkZC5vYmouc2NhbGFibGU/IGRkLm9iai5kZWZ3L2RkLm9iai5kZWZoIDogMDsKCQkJCWlmKGRkLmllKQoJCQkJewoJCQkJCWlmKGRkLmllNCkKCQkJCQl7CgkJCQkJCXdpbmRvdy5kZF94ID0gZGQuZ2V0U2Nyb2xsWCgpOwoJCQkJCQl3aW5kb3cuZGRfeSA9IGRkLmdldFNjcm9sbFkoKTsKCQkJCQl9CgkJCQkJc2V0VGltZW91dCgKCQkJCQkJJ2lmKGRkLm9iaiAmJiBkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KScrCgkJCQkJCSd7JysKCQkJCQkJCSdkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsnKwoJCQkJCQkJJ2lmKGRkLmllNCkgd2luZG93LnNjcm9sbFRvKHdpbmRvdy5kZF94LCB3aW5kb3cuZGRfeSk7JysKCQkJCQkJJ30nCgkJCQkJLDApOwoJCQkJfQoJCQkJZGQuc2V0TW92SGRsKFJFU0laRSk7CgkJCQlkZC5yZXN6VG8oZGQub2JqLncsIGRkLm9iai5oKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLm9iai5pc19kcmFnZ2VkID0gMTsKCQkJCWRkLnNldE1vdkhkbChEUkFHKTsKCQkJfQoJCQlkZC5zZXRVcEhkbChEUk9QKTsKCQkJZGQuZW1iZWRWaXMoJ2hpZGRlbicpOwoJCQlkZC5vYmouX3NldE9wYVJlbCgwLjcpOwoJCQlkZC5vYmoubWF4aW1pemVaKCk7CgkJCWRkLm9meCA9IGRkLm9iai54K2RkLm9iai53LWRkLmUueDsKCQkJZGQub2Z5ID0gZGQub2JqLnkrZGQub2JqLmgtZGQuZS55OwoJCQlpZih3aW5kb3cubXlfUGlja0Z1bmMpIG15X1BpY2tGdW5jKCk7CgkJCWlmKGRkLm9iai5waWNrRnVuYykgZGQub2JqLnBpY2tGdW5jKCk7CgkJCUREU2Nyb2xsKCk7CgkJCXJldHVybiAhKAoJCQkJZGQub2JqLmlzX3Jlc2l6ZWQKCQkJCXx8IGRkLm40ICYmIGRkLm9iai5pc19pbWFnZQoJCQkJfHwgZGQubjYgfHwgZGQudzNjCgkJCSk7CgkJfQoJfQoJaWYoZGQuZG93bkZ1bmMpIHJldHVybiBkZC5kb3duRnVuYyhkX2V2KTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIERSQUcoZF9ldikKewoJaWYoIWRkLm9iaiB8fCAhZGQub2JqLnZpc2libGUpIHJldHVybiB0cnVlOwoJaWYoZGQuaWU0IHx8IGRkLnczYyB8fCBkZC5uNiB8fCBkZC5vYmouY2hpbGRyZW4ubGVuZ3RoID4gMHhmKQoJewoJCWlmKGRkLndhaXQpIHJldHVybiBmYWxzZTsKCQlkZC53YWl0ID0gMTsKCQlzZXRUaW1lb3V0KCdkZC53YWl0ID0gMDsnLCBkZC50V2FpdCk7Cgl9CglkZC5lID0gbmV3IGRkLmV2dChkX2V2KTsKCWlmKGRkLmllICYmICFkZC5lLmJ1dCkKCXsKCQlEUk9QKGRfZXYpOwoJCXJldHVybiB0cnVlOwoJfQoJZGQubXNtb3ZlZCA9IDE7CglkZC5vYmoubW92ZVRvKAoJCWRkLm9iai52ZXJ0aWNhbD8gZGQub2JqLnggOiBkZC5tYXhPZmZYKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoudyksCgkJZGQub2JqLmhvcml6b250YWw/IGRkLm9iai55IDogZGQubWF4T2ZmWShkZC5pblduZEgoZGQub2Z5K2RkLmUueSktZGQub2JqLmgpCgkpOwoKCWlmKHdpbmRvdy5teV9EcmFnRnVuYykgbXlfRHJhZ0Z1bmMoKTsKCWlmKGRkLm9iai5kcmFnRnVuYykgZGQub2JqLmRyYWdGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIFJFU0laRShkX2V2KQp7CglpZighZGQub2JqIHx8ICFkZC5vYmoudmlzaWJsZSkgcmV0dXJuIHRydWU7CglpZihkZC53YWl0KSByZXR1cm4gZmFsc2U7CglkZC53YWl0ID0gMTsKCXNldFRpbWVvdXQoJ2RkLndhaXQgPSAwOycsIGRkLnRXYWl0KTsKCWRkLmUgPSBuZXcgZGQuZXZ0KGRfZXYpOwoJaWYoZGQuaWUgJiYgIWRkLmUuYnV0KQoJewoJCURST1AoZF9ldik7CgkJcmV0dXJuIHRydWU7Cgl9CglkZC5tc21vdmVkID0gMTsKCXZhciBkX3cgPSBkZC5saW1XKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoueCksIGRfaDsKCWlmKCFkZC53aHJhdGlvKSBkX2ggPSBkZC5saW1IKGRkLmluV25kSChkZC5vZnkrZGQuZS55KS1kZC5vYmoueSk7CgllbHNlCgl7CgkJZF9oID0gZGQubGltSChkZC5pblduZEgoTWF0aC5yb3VuZChkX3cvZGQud2hyYXRpbykrZGQub2JqLnkpLWRkLm9iai55KTsKCQlkX3cgPSBNYXRoLnJvdW5kKGRfaCpkZC53aHJhdGlvKTsKCX0KCWRkLnJlc3pUbyhkX3csIGRfaCk7CglpZih3aW5kb3cubXlfUmVzaXplRnVuYykgbXlfUmVzaXplRnVuYygpOwoJaWYoZGQub2JqLnJlc2l6ZUZ1bmMpIGRkLm9iai5yZXNpemVGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIERST1AoZF9ldikKewoJaWYoZGQub2JqKQoJewoJCWlmKGRkLm9iai5pc19kcmFnZ2VkKQoJCXsKCQkJaWYoIWRkLm9iai5pc19pbWFnZSkgZGQuZ2V0V0goZGQub2JqKTsKCQl9CgkJZWxzZSBpZihkZC5uNCkKCQl7CgkJCWlmKGRkLm9iai5pc19pbWFnZSkKCQkJewoJCQkJZGQubjRSZWN0VmlzKDApOwoJCQkJZGQub2JqLnJlc2l6ZVRvKGRkLm9iai53LCBkZC5vYmouaCk7CgkJCX0KCQl9CgkJaWYoIWRkLm40IHx8ICFkZC5vYmouaXNfaW1hZ2UpIGRkLnJlY2FsYygpOwoJCWRkLnNldE1vdkhkbChkZC5tb3ZlRnVuYyk7CgkJZGQuc2V0VXBIZGwoZGQudXBGdW5jKTsKCQlpZihkZC5kYikgZGQuZGIub25zZWxlY3RzdGFydCA9IG51bGw7CgkJZGQub2JqLl9zZXRPcGFSZWwoMS4wKTsKCQlkZC5vYmouX3NldENycyhkZC5vYmouY3Vyc29yKTsKCQlkZC5lbWJlZFZpcygndmlzaWJsZScpOwoJCWRkLm9iai5fcmVzZXRaKCk7CgkJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CgkJaWYod2luZG93Lm15X0Ryb3BGdW5jKSBteV9Ecm9wRnVuYygpOwoJCWlmKGRkLm9iai5kcm9wRnVuYykgZGQub2JqLmRyb3BGdW5jKCk7CgkJZGQubXNtb3ZlZCA9IGRkLm9iai5pc19kcmFnZ2VkID0gZGQub2JqLmlzX3Jlc2l6ZWQgPSBkZC53aHJhdGlvID0gMDsKCQlkZC5vYmogPSBudWxsOwoJfQoJZGQuc2V0RHduSGRsKFBJQ0spOwp9CmZ1bmN0aW9uIFNFVF9ESFRNTCgpCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfYWksIGRfaHRtID0gJycsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsKCXdoaWxlKGRfaSkKCXsKCQlpZighKGRfYWkgPSBkX2FbLS1kX2ldKS5pbmRleE9mKCdjOicpKSBkZC5jdXJzb3IgPSBkX2FpLnN1YnN0cmluZygyKTsKCQllbHNlIGlmKGRfYWkgPT0gTk9fQUxUKSBkZC5ub2FsdCA9IDE7CgkJZWxzZSBpZihkX2FpID09IFNDUk9MTCkgZGQuc2Nyb2xsID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gUkVTRVRfWikgZGQucmVfeiA9IDE7CgkJZWxzZSBpZihkX2FpID09IFJFU0laQUJMRSkgZGQucmVzaXphYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gU0NBTEFCTEUpIGRkLnNjYWxhYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gVFJBTlNQQVJFTlQpIGRkLmRpYXBoYW4gPSAxOwoJCWVsc2UKCQl7CgkJCWRfbyA9IG5ldyBERE9iaihkX2FpKTsKCQkJZGQuYWRkRWx0KGRfbyk7CgkJCWRfaHRtICs9IGRfby50X2h0bSB8fCAnJzsKCQkJaWYoZF9vLm9pbWcgJiYgZF9vLmNweV9uKQoJCQl7CgkJCQlmb3IodmFyIGRfbCA9IGRfby5jcHlfbiwgZF9qID0gMDsgZF9qIDwgZF9sOykKCQkJCXsKCQkJCQl2YXIgZF9wID0gbmV3IERET2JqKGRfby5uYW1lK2Rfby5jbWQsICsrZF9qKTsKCQkJCQlkZC5hZGRFbHQoZF9wLCBkX28pOwoJCQkJCWRfcC5kZWZ6ID0gZF9vLmRlZnorZF9qOwoJCQkJCWRfcC5vcmlnaW5hbCA9IGRfbzsKCQkJCQlkX2h0bSArPSBkX3AudF9odG07CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkb2N1bWVudC53cml0ZSgKCQkoZGQubjQ/ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPjxcL2Rpdj5cbicKCQk6IChkZC5vcCAmJiAhZGQub3A2KT8gJzxkaXYgaWQ9Ik9wQmxVciIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO3dpZHRoOjBweDtoZWlnaHQ6MHB4OyI+PGZvcm0+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDowcHg7aGVpZ2h0OjBweDsiPjxcL2Zvcm0+PFwvZGl2PicKCQk6ICcnKSArIGRfaHRtCgkpOwoJZGQueiA9IDB4MzM7Cglmb3IoZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRkLmFkZFByb3BzKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSk7CgkJaWYoZF9vLmlzX2ltYWdlICYmICFkX28ub3JpZ2luYWwgJiYgIWRfby5jbG9uZSkKCQkJZGQubjQ/IGRfby5vaW1nLnNyYyA9IHNwYWNlciA6IGRfby5vaW1nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCX0KCWRkLm1rV3pEb20oKTsKCWlmKHdpbmRvdy5vbmxvYWQpIGRkLmxvYWRGdW5jID0gd2luZG93Lm9ubG9hZDsKCWlmKHdpbmRvdy5vbnVubG9hZCkgZGQudWxvYWRGdW5jID0gd2luZG93Lm9udW5sb2FkOwoJd2luZG93Lm9ubG9hZCA9IGRkLmluaXR6OwoJd2luZG93Lm9udW5sb2FkID0gZGQuZmlubHo7CglkZC5zZXREd25IZGwoUElDSyk7Cn0KZnVuY3Rpb24gQUREX0RIVE1MKCkgLy8gbGF5ZXJzIG9ubHkhCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsgd2hpbGUoZF9pKQoJewoJCWRfbyA9IG5ldyBERE9iaihkX2FbLS1kX2ldKTsKCQlkZC5hZGRFbHQoZF9vKTsKCQlkZC5hZGRQcm9wcyhkX28pOwoJfQoJZGQubWtXekRvbSgpOwp9CgoKCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSWYgbm90IG5lZWRlZCwgYWxsIGNvZGUgYmVsb3cgdGhpcyBsaW5lIG1heSBiZSByZW1vdmVkCgoKLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKZGQuZCA9IGRvY3VtZW50OwkJCS8vIDwgdi4gMi43Mgp2YXIgUkVTRVRfWklOREVYID0gUkVTRVRfWjsgLy8gPCAzLjQ0CnZhciBLRVlET1dOX1JFU0laRSA9IFJFU0laQUJMRTsgLy8gPCA0LjQzCnZhciBDVVJTT1JfUE9JTlRFUiA9IENVUlNPUl9IQU5EOyAvLyA8IDQuNDQKdmFyIE5PX1NDUk9MTCA9ICcnOwkJIC8vIDwgdi4gNC40OQoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEZVTkNUSU9OUyBGT1IgRVhURU5ERUQgU0NSSVBUSU5HCi8vIFVzZSB0aGVzZSBmb3IgeW91ciBvd24gZXh0ZW5zaW9ucywKLy8gb3IgdG8gY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUKCgoKLyogbXlfUGlja0Z1bmMgSVMgQVVUT01BVElDQUxMWSBDQUxMRUQgV0hFTiBBTiBJVEVNIFNUQVJUUyBUTyBCRSBEUkFHR0VELgpUaGUgZm9sbG93aW5nIG9iamVjdHMvcHJvcGVydGllcyBhcmUgYWNjZXNzaWJsZSBmcm9tIGhlcmU6CgotIGRkLmU6IGN1cnJlbnQgbW91c2UgZXZlbnQKLSBkZC5lLnByb3BlcnR5OiBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBtb3VzZSBldmVudC4KICBNb3N0bHkgcmVxdWVzdGVkIHByb3BlcnRpZXM6CiAgLSBkZC5lLng6IGRvY3VtZW50LXJlbGF0ZWQgeCBjby1vcmRpbmF0ZQogIC0gZGQuZS55OiBkb2N1bWVudC1yZWxhdGVkIHkgY28tb3JkCiAgLSBkZC5lLnNyYzogdGFyZ2V0IG9mIG1vdXNlIGV2ZW50IChub3QgaWRlbnRpY2FsIHdpdGggdGhlIGRyYWcgZHJvcCBvYmplY3QgaXRzZWxmKS4KICAtIGRkLmUuYnV0dG9uOiBjdXJyZW50bHkgcHJlc3NlZCBtb3VzZSBidXR0b24uIExlZnQgYnV0dG9uOiBkZC5lLmJ1dHRvbiA8PSAxCgotIGRkLm9iajogcmVmZXJlbmNlIHRvIGN1cnJlbnRseSBkcmFnZ2VkIGl0ZW0uCi0gZGQub2JqLnByb3BlcnR5OiBhY2Nlc3MgdG8gYW55IHByb3BlcnR5IG9mIHRoYXQgaXRlbS4KLSBkZC5vYmoubWV0aG9kKCk6IGZvciBleGFtcGxlIGRkLm9iai5yZXNpemVUbygpIG9yIGRkLm9iai5zd2FwSW1hZ2UoKSAuCiAgTW9zdGx5IHJlcXVlc3RlZCBwcm9wZXJ0aWVzOgoJLSBkZC5vYmoubmFtZTogaW1hZ2UgbmFtZSBvciBsYXllciBJRCBwYXNzZWQgdG8gU0VUX0RIVE1MKCk7CgktIGRkLm9iai54IGFuZCBkZC5vYmoueTogY28tb3JkaW5hdGVzOwoJLSBkZC5vYmoudyBhbmQgZGQub2JqLmg6IHNpemU7CgktIGRkLm9iai5pc19kcmFnZ2VkOiAxIHdoaWxlIGl0ZW0gaXMgZHJhZ2dlZCwgZWxzZSAwOwoJLSBkZC5vYmouaXNfcmVzaXplZDogMSB3aGlsZSBpdGVtIGlzIHJlc2l6ZWQsIGkuZS4gaWYgPGN0cmw+IG9yIDxzaGlmdD4gaXMgcHJlc3NlZCwgZWxzZSAwCgpGb3IgbW9yZSBwcm9wZXJ0aWVzIGFuZCBkZXRhaWxzLCB2aXNpdCB0aGUgQVBJIGRvY3VtZW50YXRpb24KYXQgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbS9kcmFnZHJvcC9hcGlfZS5odG0gKGVuZ2xpc2gpIG9yCmh0dHA6Ly93d3cud2FsdGVyem9ybi5kZS9kcmFnZHJvcC9hcGkuaHRtIChnZXJtYW4pCSovCmZ1bmN0aW9uIG15X1BpY2tGdW5jKCkKewp9CgoKCgovKiBteV9EcmFnRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBEUkFHR0VEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfRHJhZ0Z1bmMoKQp7CgkvL3dpbmRvdy5zdGF0dXMgPSAnZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy54ICA9ICcgKyBkZC5vYmoueCArICcJIGRkLmVsZW1lbnRzLicgKyBkZC5vYmoubmFtZSArICcueSA9ICcgKyBkZC5vYmoueTsKfQoKCgoKLyogbXlfUmVzaXplRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBSRVNJWkVEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfUmVzaXplRnVuYygpCnsKCS8vd2luZG93LnN0YXR1cyA9ICdkZC5lbGVtZW50cy4nICsgZGQub2JqLm5hbWUgKyAnLncgID0gJyArIGRkLm9iai53ICsgJwkgZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy5oID0gJyArIGRkLm9iai5oOwp9CgoKCgovKiBUSElTIE9ORSBJUyBDQUxMRUQgT05DRSBBTiBJVEVNIElTIERST1BQRUQKU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBteV9QaWNrRnVuYyBmb3Igd2hhdCdzIGFjY2Vzc2libGUgZnJvbSBoZXJlLgpIZXJlIG1heSBiZSBpbnZlc3RpZ2F0ZWQsIGZvciBleGFtcGxlLCB3aGF0J3MgdGhlIG5hbWUgKGRkLm9iai5uYW1lKQpvZiB0aGUgZHJvcHBlZCBpdGVtLCBhbmQgd2hlcmUgKGRkLm9iai54LCBkZC5vYmoueSkgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLiAqLwpmdW5jdGlvbiBteV9Ecm9wRnVuYygpCnsKfQo=//