# asv_amazon2 v1.0 # Add Amazon items to your TXP article # Amit Varia # http://www.amitvaria.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6ImFzdl9hbWF6b24yIjtzOjc6InZlcnNpb24iO3M6Mzoi MS4wIjtzOjY6ImF1dGhvciI7czoxMDoiQW1pdCBWYXJpYSI7czoxMDoiYXV0aG9yX3VyaSI7 czoyNToiaHR0cDovL3d3dy5hbWl0dmFyaWEuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MzY6IkFkZCBBbWF6b24gaXRlbXMgdG8geW91ciBUWFAgYXJ0aWNsZSI7czo0OiJ0eXBlIjtp OjE7czo0OiJoZWxwIjtzOjIzMzg6Igk8aDE+YXN2X2FtYXpvbjI8L2gxPgoKCTxoMj52ZXJz aW9uIDEuMHJjMTwvaDI+CgoJPGgzPldoYXQmIzgyMTc7cyBuZXc/PC9oMz4KCgk8cD5BIGxv bmcgdGltZSBhZ28sIEkgY3JlYXRlZCBhIHBsdWdpbiBjYWxsZWQgYXN2X2FtYXpvbiwgd2hp Y2ggbGV0IHlvdSBkaXNwbGF5IHByb2R1Y3RzIGZyb20gQW1hem9uIG9uIHlvdXIgc2l0ZS4g SXQgd29ya2VkLCBidXQgaW5zZXJ0aW5nIHRoZSBwcm9kdWN0IHJlcXVpcmVkIHlvdSB0byBn byB0byBBbWF6b24sIGNvcHkgdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5BU0lOPC9zcGFuPiBu dW1iZXIsIGFuZCBwYXN0ZSBpbnRvIHRoZSBUZXh0UGF0dGVybi4gV2hhdCBhIGhhc3NsZSEg V2VsbCBJIGZpbmFsbHkgZ290IGFyb3VuZCB0byB3cml0aW5nIHRoZSBuZXh0IHZlcnNpb24g b2YgYXN2X2FtYXpvbi4gSSYjODIxNzt2ZSBjYWxsZWQgaXQgYXN2X2FtYXpvbjIgc2luY2Ug aXQgaXMgY29tcGxldGVseSB3cml0dGVuIGFuZCB3b3JrcyBpbiBhIHdob2xlIG5ldyB3YXku PC9wPgoKCTxoMz5Ib3cgZG9lcyBpdCB3b3JrPzwvaDM+CgoJPHA+U2ltcGxlICYjODIxMTsg d2hlbiB3cml0aW5nIGFuIGFydGljbGUganVzdCBjbGljayBvbiB0aGUgJiM4MjIwO0FtYXpv biYjODIyMTsgbGluayBpbiB0aGUgdG9wIHJpZ2h0IGNvbHVtbi4gWW91IGNhbiBzZWFyY2gg YW5kIGFkZCBwcm9kdWN0cyB0byB5b3VyIHBvc3QgYnkgY2xpY2tpbmcgdGhlICYjODIyMDth ZGQmIzgyMjE7IGJ1dHRvbiBuZXh0IHRvIGVhY2ggaXRlbS48L3A+CgoJPGgzPkNyZWF0aW5n IGEgZm9ybTwvaDM+CgoJPHA+V2l0aCB2ZXJzaW9uIDEuMCwgeW91IHdpbGwgaGF2ZSB0byBo YXZlIGZvcm1zIHRvIGdlbmVyYXRlIHRoZSBsYXlvdXQgb2YgdGhlIHByb2R1Y3Qgb24geW91 ciBwYWdlLiBXaGVuIGNyZWF0aW5nIGEgbmV3ICYjODIxNjttaXNjJiM4MjE3OyBmb3JtIHlv dSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOjwvcD4KCgk8cD5hc3ZfdXJsPGJyIC8+ CmFzdl9zSW1hZ2VVcmw8YnIgLz4KYXN2X21JbWFnZVVybDxiciAvPgphc3ZfbEltYWdlVXJs PGJyIC8+CmFzdl9hc2luPGJyIC8+CmFzdl90aXRsZTwvcD4KCgk8cD5PUiB5b3UgY2FuIHVz ZSB0aGUgZGVwZWNyYXRlZCBsaXRlcmFscyBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uPC9w PgoKCTxwPmFzdl9EZXRhaWxQYWdlVVJMPGJyIC8+CmFzdl9TbWFsbEltYWdlVVJMPGJyIC8+ CmFzdl9NZWRpdW1JbWFnZVVSTDxiciAvPgphc3ZfTGFyZ2VJbWFnZVVSTDxiciAvPgphc3Zf VGl0bGU8L3A+CgoJPHA+YXN2X2FtYXpvbjIgd2lsbCBqdXN0IHJlcGxhY2UgdGhlc2UgbGl0 ZXJhbHMgd2l0aCB0aGVpciBwcm9kdWN0IGNvdW50ZXJwYXJ0LCBzbzo8L3A+Cgo8cHJlPjxj b2RlPiYjNjA7YSBocmVmPSYjMzQ7YXN2X2FtYXpvbjJfdXJsJiMzNDsmIzYyOyYjNjA7aW1n IHNyYz0mIzM0O2Fzdl9hbWF6b24yX3NJbWFnZVVybCYjMzQ7IC8mIzYyOyYjNjA7YnIgLyYj NjI7YXN2X2FtYXpvbjJfdGl0bGUmIzYwOy9hJiM2MjsKPC9jb2RlPjwvcHJlPgoKCTxwPnJl dHVybnM6PC9wPgoKPHByZT48Y29kZT4mIzYwO2EgaHJlZj0mIzM0O2h0dHA6Ly93d3cuYW1h em9uLmNvbS9ncC9yZWRpcmVjdC5odG1sJTNGQVNJTj0xNTkwNTk4MzI2JTI2dGFnPXdzJTI2 bGNvZGU9eG0yJTI2Y0lEPTIwMjUlMjZjY21JRD0xNjU5NTMlMjZsb2NhdGlvbj0vby9BU0lO LzE1OTA1OTgzMjYlMjUzRlN1YnNjcmlwdGlvbklkPTBZOEYxWVYxTjJZU0dKMU1DMjAyJiMz NDsmIzYyOyYjNjA7aW1nIHNyYz0mIzM0O2h0dHA6Ly9lYzEuaW1hZ2VzLWFtYXpvbi5jb20v aW1hZ2VzL0kvMDF5YXExZXRqS0wuanBnJiMzNDsgLyYjNjI7JiM2MDticiAvJiM2MjtUZXh0 cGF0dGVybiBTb2x1dGlvbnM6IFBIUC1CYXNlZCBDb250ZW50IE1hbmFnZW1lbnQgTWFkZSBF YXN5IChTb2x1dGlvbnMpJiM2MDsvYSYjNjI7CndoaWNoIHdpbGwgZGlzcGxheSBsaWtlIHRo aXM6CjwvY29kZT48L3ByZT4KCgk8cD48YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20v Z3AvcmVkaXJlY3QuaHRtbCUzRkFTSU49MTU5MDU5ODMyNiUyNnRhZz13cyUyNmxjb2RlPXht MiUyNmNJRD0yMDI1JTI2Y2NtSUQ9MTY1OTUzJTI2bG9jYXRpb249L28vQVNJTi8xNTkwNTk4 MzI2JTI1M0ZTdWJzY3JpcHRpb25JZD0wWThGMVlWMU4yWVNHSjFNQzIwMiI+PGltZyBzcmM9 Imh0dHA6Ly9lYzEuaW1hZ2VzLWFtYXpvbi5jb20vaW1hZ2VzL0kvMDF5YXExZXRqS0wuanBn IiAvPjxiciAvPgpUZXh0cGF0dGVybiBTb2x1dGlvbnM6IFBIUC1CYXNlZCBDb250ZW50IE1h bmFnZW1lbnQgTWFkZSBFYXN5IChTb2x1dGlvbnMpPC9hPjwvcD4iO3M6NDoiY29kZSI7czoy MDc0MDoiLy8gYXN2X2FtYXpvbjIKLy8gRGVzaWduZWQgYXJvdW5kIHRoZSBuZWVkIHRvIGlu Y2x1ZGUgaXRlbXMgZnJvbSBBbWF6b24gaW4geW91ciB3ZWJzaXRlCi8vLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYo J2FkbWluJyA9PSBAdHhwaW50ZXJmYWNlKQp7CglhZGRfcHJpdnMoJ2Fzdl9hbWF6b24yJywn MSwyLDMsNCcpOyAvLyBBbGxvdyBvbmx5IHVzZXJsZXZlbHMgMSwyLDMsNCBhY2VzcyB0byB0 aGlzIHBsdWdpbi4KCXJlZ2lzdGVyX3RhYignZXh0ZW5zaW9ucycsICdhc3ZfYW1hem9uMics ICJBbWF6b24gU2V0dGluZ3MiKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKCJhc3ZfYW1hem9uMiIs ICJhc3ZfYW1hem9uMiIpOwoKCXJlZ2lzdGVyX2NhbGxiYWNrKCdhc3ZfYW1hem9uX2JhY2tl bmQnLCAnYXJ0aWNsZScpOwoJcmVnaXN0ZXJfY2FsbGJhY2soJ2Fzdl9hbWF6b25fYmFja2Vu ZCcsICdwYWdlJyk7CglyZWdpc3Rlcl9jYWxsYmFjaygnYXN2X2FtYXpvbl9iYWNrZW5kJywg J2Zvcm0nKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYoZ3BzKCdhc3ZfYW1hem9uMl9hY3Rpb24nKSAm JiBncHMoJ2Fzdl9rZXl3b3JkcycpKQp7CgkkYXN2X2FtYXpvbiA9IG5ldyBhc3ZfQW1hem9u KCJVUyIpOwoJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQveG1sJyk7CgllY2hvICRhc3Zf YW1hem9uLT5yZXF1ZXN0SXRlbXMoYXJyYXkoCgkJCQkJCQkJIktleXdvcmRzIiA9PiBncHMo J2Fzdl9rZXl3b3JkcycpLAoJCQkJCQkJCSJTZWFyY2hJbmRleCIgPT4gZ3BzKCdhc3Zfc2Vh cmNoaW5kZXgnKSwKCQkJCQkJCQkiSXRlbVBhZ2UiID0+IGdwcygnYXN2X2l0ZW1wYWdlJyks CgkJCQkJCQkJIk9wZXJhdGlvbiIgPT4gIkl0ZW1TZWFyY2giCgkJCQkJCQkpKTsKCWV4aXQ7 Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24gYXN2X2FtYXpvbjIoJGV2ZW50LCAkc3RlcCkKewoJ cGFnZXRvcCgnQW1hem9uIENhY2hlIFNldHRpbmdzJyk7CgoJJGFzdl9hbWF6b25fY2FjaGVk aXIgPSAnJzsKCSRhc3ZfYW1hem9uX2NhY2hlZHVybCA9ICcnOwoKCglpZigkc3RlcCA9PSAn c2F2ZScpCgl7CgkJc2V0X3ByZWYoJ2Fzdl9hbWF6b25fY2FjaGVkaXInLCBncHMoJ2Fzdl9h bWF6b25fY2FjaGVkaXInKSwnJywnJyk7CgkJc2V0X3ByZWYoJ2Fzdl9hbWF6b25fY2FjaGV1 cmwnLCBncHMoJ2Fzdl9hbWF6b25fY2FjaGV1cmwnKSwnJywnJyk7Cgl9CgoJZXh0cmFjdChn ZXRfcHJlZnMoKSk7CgoJZWNobyBzdGFydFRhYmxlKCdsaXN0JykudHIodGQoZm9ybSgKCQkJ CWdyYWYodGFnKCdQYXRoIHRvIGNhY2hlOiAnLCAnbGFiZWwnKS4KCQkJCQlmSW5wdXQoJ3Rl eHQnLCAnYXN2X2FtYXpvbl9jYWNoZWRpcicsICRhc3ZfYW1hem9uX2NhY2hlZGlyLCAnZWRp dCcsICcnLCAnJywgMzApKS4KCQkJCWdyYWYodGFnKCdVUkwgdG8gY2FjaGU6ICcsICdsYWJl bCcpLgoJCQkJCWZJbnB1dCgndGV4dCcsICdhc3ZfYW1hem9uX2NhY2hldXJsJywgJGFzdl9h bWF6b25fY2FjaGV1cmwsICdlZGl0JywgJycsICcnLCAzMCkpLgoJCQkJZUlucHV0KCdhc3Zf YW1hem9uMicpLgoJCQkJc0lucHV0KCdzYXZlJykuCgkJIAkJZ3JhZihmSW5wdXQoJ3N1Ym1p dCcsICcnLCBnVHh0KCdTYXZlJyksICcnKSkKCQkJCSkpKS5lbmRUYWJsZSgpOwp9CgovLy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCmZ1bmN0aW9uIGFzdl9hbWF6b24yX2Rpc3BsYXkoJGF0dHMsJHRoaW5nKQp7Cgll eHRyYWN0KGxBdHRzKGFycmF5KAoJCSd1cmwnID0+ICcnLAoJCSdzbWFsbGltYWdlJyA9PiAn JywKCQknbWVkaXVtaW1hZ2UnID0+ICcnLAoJCSdsYXJnZWltYWdlJyA9PiAnJywKCQknYXNp bicgPT4gJycsCgkJJ3RpdGxlJyA9PiAnJywKCQknZm9ybScgPT4gJycsCgkJJ2NhY2hlJyA9 PiAnJywKCQknbG9jYWxlJyA9PiAnVVMnCgkpLCAkYXR0cykpOwoKCWlmKCRhc2luKQoJewoJ CSRkb2NhY2hlID0gKCRjYWNoZT09InkiKT8gdHJ1ZTogZmFsc2U7CgkJJGFzdl9hbWF6b25f cmVxdWVzdCA9IG5ldyBhc3ZfQW1hem9uKCRsb2NhbGUpOwoJCSRhc3ZfYW1hem9uMl9jb250 ZW50cyA9ICRhc3ZfYW1hem9uX3JlcXVlc3QtPnJlcXVlc3RJdGVtKGFycmF5KAoJCQkJCQkJ CQkJIkl0ZW1JZCIgPT4gJGFzaW4sCgkJCQkJCQkJCQkiT3BlcmF0aW9uIiA9PiAiSXRlbUxv b2t1cCIKCQkJCQkJCQkJKSwgJGRvY2FjaGUpOwoKCgkJJHVybCA9ICRhc3ZfYW1hem9uMl9j b250ZW50c1siYXN2X0RldGFpbFBhZ2VVUkwiXTsKCQkkc21hbGxpbWFnZSA9ICRhc3ZfYW1h em9uMl9jb250ZW50c1siYXN2X1NtYWxsSW1hZ2VVUkwiXTsKCQkkbWVkaXVtaW1hZ2UgPSAk YXN2X2FtYXpvbjJfY29udGVudHNbImFzdl9NZWRpdW1JbWFnZVVSTCJdOwoJCSRsYXJnZWlt YWdlID0gJGFzdl9hbWF6b24yX2NvbnRlbnRzWyJhc3ZfTGFyZ2VJbWFnZVVSTCJdOwoJCSR0 aXRsZSA9ICRhc3ZfYW1hem9uMl9jb250ZW50c1siYXN2X1RpdGxlIl07Cgl9CgoJaWYoJGZv cm0pCgl7CgkJJHRoaW5nID0gZmV0Y2hfZm9ybSgkZm9ybSk7Cgl9CglpZigkdGhpbmcpCgl7 CgoJCSR0aGluZyA9IHN0cl9yZXBsYWNlKCdhc3ZfdXJsJywgJHVybCwgJHRoaW5nKTsKCQkk dGhpbmcgPSBzdHJfcmVwbGFjZSgnYXN2X3NJbWFnZVVybCcsICRzbWFsbGltYWdlLCAkdGhp bmcpOwoJCSR0aGluZyA9IHN0cl9yZXBsYWNlKCdhc3ZfbUltYWdlVXJsJywgJG1lZGl1bWlt YWdlLCAkdGhpbmcpOwoJCSR0aGluZyA9IHN0cl9yZXBsYWNlKCdhc3ZfbEltYWdlVXJsJywg JGxhcmdlaW1hZ2UsICR0aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9hc2lu JywgJGFzaW4sICR0aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl90aXRsZScs ICR0aXRsZSwgJHRoaW5nKTsKCgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9hbWF6b24y X3VybCcsICR1cmwsICR0aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9hbWF6 b24yX3NJbWFnZVVybCcsICRzbWFsbGltYWdlLCAkdGhpbmcpOwoJCSR0aGluZyA9IHN0cl9y ZXBsYWNlKCdhc3ZfYW1hem9uMl9tSW1hZ2VVcmwnLCAkbWVkaXVtaW1hZ2UsICR0aGluZyk7 CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9hbWF6b24yX2xJbWFnZVVybCcsICRsYXJn ZWltYWdlLCAkdGhpbmcpOwoJCSR0aGluZyA9IHN0cl9yZXBsYWNlKCdhc3ZfYW1hem9uMl9h c2luJywgJGFzaW4sICR0aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9hbWF6 b24yX3RpdGxlJywgJHRpdGxlLCAkdGhpbmcpOwoKCQkkdGhpbmcgPSBzdHJfcmVwbGFjZSgn YXN2X0RldGFpbFBhZ2VVUkwnLCAkdXJsLCAkdGhpbmcpOwoJCSR0aGluZyA9IHN0cl9yZXBs YWNlKCdhc3ZfU21hbGxJbWFnZVVSTCcsICRzbWFsbGltYWdlLCAkdGhpbmcpOwoJCSR0aGlu ZyA9IHN0cl9yZXBsYWNlKCdhc3ZfTWVkaXVtSW1hZ2VVUkwnLCAkbWVkaXVtaW1hZ2UsICR0 aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9MYXJnZUltYWdlVVJMJywgJGxh cmdlaW1hZ2UsICR0aGluZyk7CgkJJHRoaW5nID0gc3RyX3JlcGxhY2UoJ2Fzdl9UaXRsZScs ICR0aXRsZSwgJHRoaW5nKTsKCX0KCWVsc2UKCXsKCQkkdGhpbmcgPSAgIjxhIGhyZWY9XCIi LiR1cmwuIlwiPjxpbWcgc3JjPVwiIi4kc21hbGxpbWFnZS4iXCIgLz48YnIgLz4iLiR0aXRs ZS4iPC9hPjxiciAvPiI7Cgl9CgoJcmV0dXJuICR0aGluZzsKfQoKLy8tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5j dGlvbiBhc3ZfYW1hem9uX2JhY2tlbmQgKCRldmVudCwgJHN0ZXApCnsKCSRhc3ZfYW1hem9u Ml9sb2NhdGlvbiA9ICcnOwoJJGFzdl9hbWF6b24yX3RleHRhcmVhPSAnJzsKCglzd2l0Y2go JGV2ZW50KXsKCQljYXNlICJhcnRpY2xlIjoKCQkJJGFzdl9hbWF6b24yX2xvY2F0aW9uID0g ImFkdmFuY2VkIjsKCQkJJGFzdl9hbWF6b24yX3RleHRhcmVhID0gImJvZHkiOwoJCQlicmVh azsKCQljYXNlICJwYWdlIjoKCQkJJGFzdl9hbWF6b24yX2xvY2F0aW9uID0gIm1pc2MtdGFn cyI7CgkJCSRhc3ZfYW1hem9uMl90ZXh0YXJlYSA9ICJodG1sIjsKCQkJYnJlYWs7CgkJY2Fz ZSAiZm9ybSI6CgkJCSRhc3ZfYW1hem9uMl9sb2NhdGlvbiA9ICJhcnRpY2xlLXRhZ3MiOwoJ CQkkYXN2X2FtYXpvbjJfdGV4dGFyZWEgPSAiZm9ybSI7CgkJCWJyZWFrOwoJfQoKCSRhc3Zf c2VhcmNoSW5kZXggPSBhcnJheSgiQXBwYXJlbCIsICJCYWJ5IiwgIkJsZW5kZWQiLCAiQm9v a3MiLCAiQ2xhc3NpY2FsIiwgIkRWRCIsICJEaWdpdGFsTXVzaWMiLCAiRWxlY3Ryb25pY3Mi LCAiR291cm1ldEZvb2QiLCAiSGVhbHRoUGVyc29uYWxDYXJlIiwgIkpld2VscnkiLCAiS2l0 Y2hlbiIsICJNYWdhemluZXMiLCAiTWVyY2hhbnRzIiwgIk1pc2NlbGxhbmVvdXMiLCAiTXVz aWMiLCAiTXVzaWNUcmFja3MiLCAiTXVzaWNhbEluc3RydW1lbnRzIiwgIk9mZmljZVByb2R1 Y3RzIiwgIk91dGRvb3JMaXZpbmciLCAiUENIYXJkd2FyZSIsICJQZXRTdXBwbGllcyIsICJQ aG90byIsICJSZXN0YXVyYW50cyIsICJTb2Z0d2FyZSIsICJTcG9ydGluZ0dvb2RzIiwgIlRv b2xzIiwgIlRveXMiLCAiVkhTIiwgIlZpZGVvIiwgIlZpZGVvR2FtZXMiLCAiV2lyZWxlc3NB Y2Nlc3NvcmllcyIpOwoKCSRsaW5lID0gIjxoMyBjbGFzcz1cInBsYWluXCI+IjsKCgkkbGlu ZSAuPSAiPGEgaHJlZj1cIiNhc3ZfYW1hem9uMlwiIG9uY2xpY2s9XCIkKCcjYXN2X2FtYXpv bjJ3cmFwcGVyJykuc2xpZGVUb2dnbGUoJ3Nsb3cnKTsgcmV0dXJuIGZhbHNlO1wiPkFtYXpv bjwvYT4iOwoKCSRsaW5lIC49ICI8L2gzPiI7CgoJJGZvcm0gPSAiPGZvcm0gb25TdWJtaXQ9 XCJhc3ZfbG9hZFJlc3VsdHMoKTsgcmV0dXJuIGZhbHNlO1wiPjxoMz5BbWF6b248L2gzPjxw IGlkPVwiYXN2X2FtYXpvbjJfY2xvc2VcIj48YSBocmVmPVwiI1wiIG9uY2xpY2s9XCIkKCcj YXN2X2FtYXpvbjJ3cmFwcGVyJykuc2xpZGVUb2dnbGUoJ3Nsb3cnKTsgcmV0dXJuIGZhbHNl O1wiPmNsb3NlPC9hPjwvcD48ZmllbGRzZXQ+PGxlZ2VuZD5TZWFyY2g8L2xlZ2VuZD4iLgoK CQlncmFmKCI8bGFiZWwgZm9yPVwiYXN2X1NlYXJjaEluZGV4XCI+Q2hvb3NlIGEgY2F0ZWdv cnk8L2xhYmVsPjxiciAvPiIuCgoJCQlzZWxlY3RJbnB1dCgnYXN2X1NlYXJjaEluZGV4Jywg JGFzdl9zZWFyY2hJbmRleCwgJGFzdl9zZWFyY2hJbmRleCwgZmFsc2UsJycsJ2Fzdl9TZWFy Y2hJbmRleCcpKS4KCgkJZ3JhZigiPGxhYmVsIGZvcj1cImFzdl9LZXl3b3Jkc1wiPktleXdv cmRzPC9sYWJlbD48YnIgLz4iLgoKCQkJZklucHV0KCd0ZXh0JywgJ2Fzdl9LZXl3b3Jkcycs ICcnLCAnZWRpdCcsICcnLCAnJywgJzIwJywgICcnLCAnYXN2X0tleXdvcmRzJykpLgoKCQlm SW5wdXQoJ3N1Ym1pdCcsJ2Fzdl9TZWFyY2gnLCdTZWFyY2gnLCJwdWJsaXNoIiwgJycsICdh c3ZfbG9hZFJlc3VsdHMoKTtyZXR1cm4gZmFsc2U7JywgJycsICcnKS4KCgkJZklucHV0KCdi dXR0b24nLCdhc3ZfQ2FuY2VsJywnQ2FuY2VsJywicHVibGlzaCIsICcnLCAnYXN2X2NhbmNl bFJlc3VsdHMoKTtyZXR1cm4gZmFsc2U7JywgJycsICcnKS4KCgkJIjwvZmllbGRzZXQ+PC9m b3JtPiI7CgoJJGxpbmUgLj0gIjxkaXYgaWQ9XCJhc3ZfYW1hem9uMndyYXBwZXJcIiBzdHls ZT1cImRpc3BsYXk6bm9uZVwiID48ZGl2IGlkPVwiYXN2X2FtYXpvbjJcIiA+JGZvcm08L2Rp dj48ZGl2IGlkPVwiYXN2X2FtYXpvbjJmb3JtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48 L2Rpdj48ZGl2IGlkPVwiYXN2X2FtYXpvbjJSZXN1bHRzXCIgc3R5bGU9XCJkaXNwbGF5Om5v bmVcIj48L2Rpdj48L2Rpdj4iOwoKCSRsaW5lID0gYXN2X3NhZmVKUygkbGluZSk7CgoJJHJz ID0gc2FmZV9jb2x1bW4oJ25hbWUnLCAndHhwX2Zvcm0nLCAidHlwZSA9ICdtaXNjJyIpOwoK CSRmb3JtcyA9ICc8cD48bGFiZWwgZm9yPSJhc3ZfYW1hem9uMl90YWd0eXBlIj5UeXBlPC9s YWJlbD46ICcuc2VsZWN0SW5wdXQoJ2Fzdl9hbWF6b24yX3RhZ3R5cGUnLCBhcnJheSgnZm9y bScsICdmb3JtIChjYWNoZWQpJywgJ2hhcmRjb2RlJyksIGFycmF5KCdmb3JtJywgJ2Zvcm0g KGNhY2hlZCknLCAnaGFyZGNvZGUnKSwgZmFsc2UsICcnLCAnYXN2X2FtYXpvbjJfdGFndHlw ZScpLic8L3A+JzsKCgkkZm9ybXMgLj0gJzxwPjxsYWJlbCBmb3I9ImFzdl9hbWF6b24yX2Zv cm0iPkZvcm08L2xhYmVsPjogJzsKCglpZiAoJHJzKQoJewoJCSRmb3JtcyAuPSBzZWxlY3RJ bnB1dCgnYXN2X2FtYXpvbjJfZm9ybScsICRycywgJGZvcm0sIHRydWUsICcnLCAnYXN2X2Ft YXpvbjJfZm9ybScpLic8L3A+JzsKCX0KCWVsc2UKCXsKCQkkZm9ybXMgLj0gJzxzZWxlY3Qg aWQ9ImFzdl9hbWF6b24yX2Zvcm0iPjxvcHRpb24gLz48L3NlbGVjdD48L3A+JzsKCX0KCSRh c3ZfYW1hem9uMl9pbWFnZXNpemUgPSBhcnJheSgnc21hbGwnLCAnbWVkaXVtJywgJ2xhcmdl Jyk7CgoJJGZvcm1zID0gYXN2X3NhZmVKUygkZm9ybXMpOwoKCSRqcyA9IDw8PEVPRgo8c2Ny aXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBTUkM9Ii90ZXh0cGF0dGVybi9qcXVlcnkuanMi Pgo8L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9q YXZhc2NyaXB0Ij4KPCEtLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vQXR0YWNoIHRoZSBhbWF6b24yIHBsdWdp biB0byB0aGUgcGFnZQoKICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJJCgiJGxp bmUiKS5pbnNlcnRCZWZvcmUoJCgiIyRhc3ZfYW1hem9uMl9sb2NhdGlvbiIpLnByZXYoKSk7 CgoJJCgiI2Fzdl9hbWF6b24yd3JhcHBlciIpLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUi KTsKCSQoIiNhc3ZfYW1hem9uMndyYXBwZXIiKS5jc3MoInRvcCIsICI4MHB4Iik7CgkkKCIj YXN2X2FtYXpvbjJ3cmFwcGVyIikuY3NzKCJyaWdodCIsICIwcHgiKTsKCSQoIiNhc3ZfYW1h em9uMndyYXBwZXIiKS5jc3MoIndpZHRoIiwgIjIwMHB4Iik7CgkkKCIjYXN2X2FtYXpvbjJ3 cmFwcGVyIikuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwgIiNmZmZmY2MiKTsKCSQoIiNhc3Zf YW1hem9uMndyYXBwZXIiKS5jc3MoInBhZGRpbmciLCAiMjBweCIpOwoJJCgiI2Fzdl9hbWF6 b24yd3JhcHBlciBoMyIpLmNzcygiZmxvYXQiLCAibGVmdCIpOwoJJCgiI2Fzdl9hbWF6b24y d3JhcHBlciBoMyIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUiKTsKCSQoIiNhc3ZfYW1hem9u Ml9jbG9zZSIpLmNzcygidGV4dC1hbGlnbiIsICJyaWdodCIpOwogICB9KTsKCi8vLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKZnVuY3Rpb24gYXN2X2xvYWRSZXN1bHRzKCkKewoJdmFyIGtleXdvcmRzID0JJCgiI2Fz dl9LZXl3b3JkcyIpLnZhbCgpOwoJdmFyIHNlYXJjaGluZGV4ID0gJCgiI2Fzdl9TZWFyY2hJ bmRleCBvcHRpb25bQHNlbGVjdGVkXSIpLnRleHQoKTsKCWFzdl9yZXF1ZXN0KGtleXdvcmRz LCBzZWFyY2hpbmRleCwgJzEnKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBhc3ZfcmVxdWVz dChrZXl3b3Jkcywgc2VhcmNoaW5kZXgsIGl0ZW1wYWdlKXsKCSQoJyNhc3ZfYW1hem9uMmZv cm0nKS5odG1sKCc8ZmllbGRzZXQ+PGxlZ2VuZD5PcHRpb25zPC9sZWdlbmQ+PGZvcm0+JGZv cm1zPC9mb3JtPicpOwoJJCgnI2Fzdl9hbWF6b24yUmVzdWx0cycpLmh0bWwoJzxmaWVsZHNl dD48bGVnZW5kPlJlc3VsdHM8L2xlZ2VuZD48ZGl2IGlkPSJhc3ZfYW1hem9uMlJlc3VsdHNE YXRhIj48cCA+bG9hZGluZy4uLjwvcD48L2Rpdj48L2ZpZWxkc2V0PicpOwoJJCgiI2Fzdl9h bWF6b24yUmVzdWx0c0RhdGEiKS5jc3MoInBhZGRpbmciLCAiMHB4IDBweCAxMHB4IDBweCIp OwoJJCgnI2Fzdl9hbWF6b24yZm9ybScpLnNob3coJ3Nsb3cnKTsKCSQoJyNhc3ZfYW1hem9u MlJlc3VsdHMnKS5zaG93KCdzbG93Jyk7CgoJJC5nZXQoJ2luZGV4LnBocCcsCgkgCXthc3Zf YW1hem9uMl9hY3Rpb246ICIxIiwgYXN2X2tleXdvcmRzOiBlc2NhcGUoa2V5d29yZHMpLCBh c3Zfc2VhcmNoaW5kZXg6IGVzY2FwZShzZWFyY2hpbmRleCksIGFzdl9pdGVtcGFnZTogaXRl bXBhZ2UgfSwKCSAgIGFzdl9wYXJzZVJlc3BvbnNlLAoJICAgInhtbCIKCSApOwp9CgovLy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCmZ1bmN0aW9uIGFzdl9wYXJzZVJlc3BvbnNlKHhtbCkKewoJdmFyIGl0ZW1QYWdl ID0gJCgnSXRlbVBhZ2UnLCB4bWwpLnRleHQoKTsKCXZhciBzZWFyY2hpbmRleCA9ICQoJ1Nl YXJjaEluZGV4JywgeG1sKS50ZXh0KCk7Cgl2YXIgdG90YWxQYWdlcyA9ICQoJ1RvdGFsUGFn ZXMnLCB4bWwpLnRleHQoKTsKCXZhciBrZXl3b3JkcyA9ICQoJ0tleXdvcmRzJywgeG1sKS50 ZXh0KCk7Cgl2YXIgbGluZSA9IiI7CgoJbGluZSArPSBhc3ZfcHJldm5leHRfbGluayhrZXl3 b3Jkcywgc2VhcmNoaW5kZXgsIGl0ZW1QYWdlLCB0b3RhbFBhZ2VzLCAidG9wIik7CgoKCSQo eG1sKS5maW5kKCdJdGVtJykuZWFjaChmdW5jdGlvbigpewoJCXZhciB0aXRsZSA9ICQoJ1Rp dGxlJyx0aGlzKS50ZXh0KCk7CgkJdmFyIHNJbWFnZVVSTCA9ICQoIlNtYWxsSW1hZ2UgPiBV UkwiLHRoaXMpLnRleHQoKTsKCQl2YXIgbUltYWdlVVJMID0gJCgiTWVkaXVtSW1hZ2UgPiBV UkwiLHRoaXMpLnRleHQoKTsKCQl2YXIgbEltYWdlVVJMID0gJCgiTGFyZ2VJbWFnZSA+IFVS TCIsdGhpcykudGV4dCgpOwoJCXZhciB1cmwgPSAkKCdEZXRhaWxQYWdlVVJMJyx0aGlzKS50 ZXh0KCk7CgkJdmFyIGFzaW4gPSAkKCdBU0lOJyx0aGlzKS50ZXh0KCk7CgoKCQl2YXIgYW1h em9uSFRNTCA9ICc8YSBocmVmPSInK3VybCsnIj48aW1nIHNyYz0iJysgc0ltYWdlVVJMICsn IiBzdHlsZT0iZGlzcGxheTogYmxvY2s7bWFyZ2luLWxlZnQ6IGF1dG87bWFyZ2luLXJpZ2h0 OiBhdXRvOyIvPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPicgKyB0aXRsZSAr ICc8L3NwYW4+PC9hPicgOwoKCQl2YXIgZm9ybSA9ICc8Zm9ybSBpZD0iYXN2X2FtYXpvbjJf Jythc2luKyciPicgKwoJCQkJCSc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhc3ZfYW1h em9uMl90aXRsZSIgdmFsdWU9IicrdGl0bGUrJyIgLz4nICsKCQkJCQknPGlucHV0IHR5cGU9 ImhpZGRlbiIgbmFtZT0iYXN2X2FtYXpvbjJfc0ltYWdlVVJMIiB2YWx1ZSA9Iicrc0ltYWdl VVJMKyciIC8+JyArCgkJCQkJJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFzdl9hbWF6 b24yX21JbWFnZVVSTCIgdmFsdWUgPSInK21JbWFnZVVSTCsnIiAvPicgKwoJCQkJCSc8aW5w dXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhc3ZfYW1hem9uMl9sSW1hZ2VVUkwiIHZhbHVlID0i JytsSW1hZ2VVUkwrJyIgLz4nICsKCQkJCQknPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0i YXN2X2FtYXpvbjJfdXJsIiB2YWx1ZSA9IicrdXJsKyciIC8+JyArCgkJCQkJJzxpbnB1dCB0 eXBlPSJoaWRkZW4iIG5hbWU9ImFzdl9hbWF6b24yX2FzaW4iIHZhbHVlID0iJythc2luKyci IC8+JyArCgkJCQkJJzxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJhc3ZfYW1hem9uMl9hZGRf Jythc2luKyciIHN0eWxlPSJmbG9hdDpyaWdodCIgb25jbGljaz0iYXN2X2FtYXpvbjJfYWRk dG9Cb2R5KHRoaXMucGFyZW50Tm9kZSkiIGNsYXNzPSJwdWJsaXNoIiB2YWx1ZT0iYWRkIiAv PicrICAnPC9mb3JtPic7CgoJCWxpbmUgKz0gJzxwPicgKyBmb3JtICsgYW1hem9uSFRNTCAg KyAnPC9wPic7CiAgICB9KTsKCglsaW5lICs9IGFzdl9wcmV2bmV4dF9saW5rKGtleXdvcmRz LCBzZWFyY2hpbmRleCwgaXRlbVBhZ2UsIHRvdGFsUGFnZXMsICJib3R0b20iKTsKCiAgICAk KCIjYXN2X2FtYXpvbjJSZXN1bHRzRGF0YSIpLmh0bWwobGluZSk7CgkkKCIjYXN2X2FtYXpv bjJSZXN1bHRzRGF0YSIpLmNzcygibWF4LWhlaWdodCIsICI1MDBweCIpOwoJJCgiI2Fzdl9h bWF6b24yUmVzdWx0c0RhdGEiKS5jc3MoIm92ZXJmbG93IiwgImF1dG8iKTsKCSQoIiNhc3Zf YW1hem9uMlJlc3VsdHNEYXRhIikuY3NzKCJwYWRkaW5nIiwgIjBweCAwcHggMTBweCAwcHgi KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCgokLmZuLmFwcGVuZFZhbCA9IGZ1bmN0aW9uKHR4dCkgewogICAg cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewogICAgICAgIHRoaXMudmFsdWUgKz0gdHh0 OwogICAgfSk7Cn07CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpmdW5jdGlvbiBhc3ZfYW1hem9uMl9hZGR0b0Jv ZHkoZWxlbSkKewoJdmFyIHRpdGxlID0gJCgnaW5wdXQ6aGlkZGVuW0BuYW1lPWFzdl9hbWF6 b24yX3RpdGxlXScsIGVsZW0pLnZhbCgpOwoJdmFyIHNJbWFnZVVSTCA9ICQoJ2lucHV0Omhp ZGRlbltAbmFtZT1hc3ZfYW1hem9uMl9zSW1hZ2VVUkxdJywgZWxlbSkudmFsKCk7Cgl2YXIg bUltYWdlVVJMID0gJCgnaW5wdXQ6aGlkZGVuW0BuYW1lPWFzdl9hbWF6b24yX21JbWFnZVVS TF0nLCBlbGVtKS52YWwoKTsKCXZhciBsSW1hZ2VVUkwgPSAkKCdpbnB1dDpoaWRkZW5bQG5h bWU9YXN2X2FtYXpvbjJfbEltYWdlVVJMXScsIGVsZW0pLnZhbCgpOwoJdmFyIHVybCA9ICQo J2lucHV0OmhpZGRlbltAbmFtZT1hc3ZfYW1hem9uMl91cmxdJywgZWxlbSkudmFsKCk7Cgl2 YXIgYXNpbiA9ICQoJ2lucHV0OmhpZGRlbltAbmFtZT1hc3ZfYW1hem9uMl9hc2luXScsIGVs ZW0pLnZhbCgpOwoJdmFyIGZvcm0gPSAkKCIjYXN2X2FtYXpvbjJfZm9ybSBvcHRpb25bQHNl bGVjdGVkXSIpLnRleHQoKTsKCglzd2l0Y2goJCgiI2Fzdl9hbWF6b24yX3RhZ3R5cGUgb3B0 aW9uW0BzZWxlY3RlZF0iKS50ZXh0KCkpCgl7CgkJY2FzZSAiaGFyZGNvZGUiOgoJCQl2YXIg YXN2X3RhZyA9ICc8dHhwOmFzdl9hbWF6b24yX2Rpc3BsYXkgJzsKCQkJYXN2X3RhZyArPSAo dGl0bGUpPyAndGl0bGU9IicrdGl0bGUrJyIgJyA6ICIiOwoJCQlhc3ZfdGFnICs9IChzSW1h Z2VVUkwpPyAnc21hbGxpbWFnZT0iJytzSW1hZ2VVUkwrJyIgJyA6ICIiOwoJCQlhc3ZfdGFn ICs9IChtSW1hZ2VVUkwpPyAnbWVkaXVtaW1hZ2U9IicrbUltYWdlVVJMKyciICcgOiAiIjsK CQkJYXN2X3RhZyArPSAobEltYWdlVVJMKT8gJ2xhcmdlaW1hZ2U9IicrbEltYWdlVVJMKyci ICcgOiAiIjsKCQkJYXN2X3RhZyArPSAodXJsKT8gJ3VybD0iJyt1cmwrJyIgJyA6ICIiOwoJ CQlhc3ZfdGFnICs9IChmb3JtKT8gJ2Zvcm09IicrZm9ybSsnIiAnIDogIiI7CgkJCWFzdl90 YWcgKz0gJyAvPic7CgkJCWJyZWFrOwoJCWNhc2UgImZvcm0iOgoJCQl2YXIgYXN2X3RhZyA9 ICc8dHhwOmFzdl9hbWF6b24yX2Rpc3BsYXkgJzsKCQkJYXN2X3RhZyArPSAoYXNpbik/ICdh c2luPSInK2FzaW4rJyIgJyA6ICIiOwoJCQlhc3ZfdGFnICs9IChmb3JtKT8gJ2Zvcm09Iicr Zm9ybSsnIiAnIDogIiI7CgkJCWFzdl90YWcgKz0gJyAvPic7CgkJCWJyZWFrOwoJCWNhc2Ug ImZvcm0gKGNhY2hlZCkiOgoJCQl2YXIgYXN2X3RhZyA9ICc8dHhwOmFzdl9hbWF6b24yX2Rp c3BsYXkgJzsKCQkJYXN2X3RhZyArPSAoYXNpbik/ICdhc2luPSInK2FzaW4rJyIgJyA6ICIi OwoJCQlhc3ZfdGFnICs9IChmb3JtKT8gJ2Zvcm09IicrZm9ybSsnIiAnIDogIiI7CgkJCWFz dl90YWcgKz0gJ2NhY2hlPSJ5Iic7CgkJCWFzdl90YWcgKz0gJyAvPic7CgkJCWJyZWFrOwoJ fQoJLy9lZEluc2VydENvbnRlbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyRhc3ZfYW1h em9uMl90ZXh0YXJlYScpLCBhc3ZfdGFnKTsKCgkkKCcjJGFzdl9hbWF6b24yX3RleHRhcmVh JykuaW5zZXJ0QXRDYXJldChhc3ZfdGFnKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBhc3Zf YW1hem9uMl9hZGR0b0JvZHlfUmVzcG9uc2UocmVzcG9uc2UpCnsKCWluc2VydEF0Q2FyZXQo JCgnIyRhc3ZfYW1hem9uMl90ZXh0YXJlYScpLCByZXNwb25zZSk7Cn0KCi8vLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK ZnVuY3Rpb24gYXN2X2NhbmNlbFJlc3VsdHMoKQp7CgkkKCcjYXN2X2FtYXpvbjJSZXN1bHRz Jykuc2xpZGVVcCgnc2xvdycpOwoJJCgnI2Fzdl9hbWF6b24yZm9ybScpLnNsaWRlVXAoJ3Ns b3cnKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBhc3ZfcHJldm5leHRfbGluayhrZXl3b3Jk cywgc2VhcmNoaW5kZXgsIGl0ZW1QYWdlLCB0b3RhbFBhZ2VzLCBsb2MpCnsKCWxpbmUgPSAn JzsKCglpZihwYXJzZUludCh0b3RhbFBhZ2VzKT4xKQoJewoJCWlmKGxvYz09ImJvdHRvbSIp IGxpbmUrPSc8aHIgLz4nOwoKCQlsaW5lKz0nPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRl cjsiPic7CgoJCWl0ZW1QYWdlID0gcGFyc2VJbnQoaXRlbVBhZ2UpOwoKCQl2YXIgdGV4dCA9 ICcnOwoKCQlpZihpdGVtUGFnZT4xKQoJCXsKCQkJdmFyIHBJdGVtUGFnZSA9IGl0ZW1QYWdl IC0gMTsKCgkJCWxpbmUgKz0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImFzdl9yZXF1ZXN0KFwn JytrZXl3b3JkcyArICdcJyxcJycgKyBzZWFyY2hpbmRleCArICdcJyxcJycrIHBJdGVtUGFn ZSsnXCcpO3JldHVybiBmYWxzZTsiPnByZXZpb3VzPC9hPiB8ICc7CgoJCX0KCQlpZihpdGVt UGFnZTx0b3RhbFBhZ2VzKQoJCXsKCQkJdmFyIG5JdGVtUGFnZSA9IGl0ZW1QYWdlICsgMTsK CgkJCWxpbmUgKz0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImFzdl9yZXF1ZXN0KFwnJytrZXl3 b3JkcyArICdcJyxcJycgKyBzZWFyY2hpbmRleCArICdcJyxcJycrIG5JdGVtUGFnZSsnXCcp O3JldHVybiBmYWxzZTsiPm5leHQ8L2E+JzsKCgkJfQoKCQlsaW5lKz0nPC9wPic7CgoJCWlm KGxvYz09InRvcCIpIGxpbmUrPSc8aHIgLz4nOwoJfQoKCXJldHVybiBsaW5lOwp9CgovLy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCi8qKgogKiBJbnNlcnQgY29udGVudCBhdCBjYXJldCBwb3NpdGlvbiAoY29udmVy dGVkIHRvIGpxdWVyeSBmdW5jdGlvbikKICogQGxpbmsgaHR0cDovL2FsZXhraW5nLm9yZy9i bG9nLzIwMDMvMDYvMDIvaW5zZXJ0aW5nLWF0LXRoZS1jdXJzb3ItdXNpbmctamF2YXNjcmlw dAogKi8KJC5mbi5pbnNlcnRBdENhcmV0ID0gZnVuY3Rpb24gKG15VmFsdWUpIHsKCXJldHVy biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkvL0lFIHN1cHBvcnQKCQlpZiAoZG9jdW1lbnQu c2VsZWN0aW9uKSB7CgkJCXRoaXMuZm9jdXMoKTsKCQkJc2VsID0gZG9jdW1lbnQuc2VsZWN0 aW9uLmNyZWF0ZVJhbmdlKCk7CgkJCXNlbC50ZXh0ID0gbXlWYWx1ZTsKCQkJdGhpcy5mb2N1 cygpOwoJCX0KCQkvL01PWklMTEEvTkVUU0NBUEUgc3VwcG9ydAoJCWVsc2UgaWYgKHRoaXMu c2VsZWN0aW9uU3RhcnQgfHwgdGhpcy5zZWxlY3Rpb25TdGFydCA9PSAnMCcpIHsKCQkJdmFy IHN0YXJ0UG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydDsKCQkJdmFyIGVuZFBvcyA9IHRoaXMu c2VsZWN0aW9uRW5kOwoJCQl2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CgkJCXRo aXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydFBvcykKCQkJICAgICAg ICAgICAgICArIG15VmFsdWUKCSAgICAgICAgICAgICAgICAgICAgICArIHRoaXMudmFsdWUu c3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwoJCQl0aGlzLmZvY3VzKCk7 CgkJCXRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcyArIG15VmFsdWUubGVuZ3RoOwoJ CQl0aGlzLnNlbGVjdGlvbkVuZCA9IHN0YXJ0UG9zICsgbXlWYWx1ZS5sZW5ndGg7CgkJCXRo aXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoJCX0gZWxzZSB7CgkJCXRoaXMudmFsdWUgKz0g bXlWYWx1ZTsKCQkJdGhpcy5mb2N1cygpOwoJCX0KCX0pOwoKfTsKCi8vLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8v IC0tPgo8L3NjcmlwdD4KRU9GOwoJZWNobyAkanM7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24g YXN2X3NhZmVKUygkbGluZSkKewoJcmV0dXJuIHN0cl9yZXBsYWNlKCJcbiIsICIiLCBhZGRz bGFzaGVzKCRsaW5lKSk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgYXN2X0FtYXpvbgp7Cgl2YXIg JGFwaV9rZXkgPSAiMFk4RjFZVjFOMllTR0oxTUMyMDIiOwoJdmFyICRjb250ZW50VHlwZSA9 ICJ0ZXh0JTJGeG1sIjsKCXZhciAkb3BlcmF0aW9uID0gIkl0ZW1TZWFyY2giOwoJdmFyICRz ZXJ2aWNlID0gIkFXU0VDb21tZXJjZVNlcnZpY2UiOwoJdmFyICRiYXNlVVJMID0gImh0dHA6 Ly9lY3MuYW1hem9uYXdzLmNvbS9vbmNhL3htbD8iOwoJdmFyICRzZWFyY2hJbmRleCA9ICJC bGVuZGVkIjsKCXZhciAkcmVzcG9uc2VHcm91cCA9ICJJbWFnZXMsU21hbGwiOwoJdmFyICR2 ZXJzaW9uID0gIjIwMDUtMDMtMjMiOwoKCXZhciAkbG9jYWxlOwoKCS8vLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWZ1 bmN0aW9uIGFzdl9BbWF6b24oJGxvY2FsZSkKCXsKCQkkdGhpcy0+bG9jYWxlID0gJGxvY2Fs ZTsKCgkJc3dpdGNoKCRsb2NhbGUpCgkJewoJCQljYXNlICJVUyI6CgkJCQkkdGhpcy0+YmFz ZVVSTCA9ICJodHRwOi8vd2Vic2VydmljZXMuYW1hem9uLmNvbS9vbmNhL3htbD8iOwoJCQkJ YnJlYWs7CgkJCWNhc2UgIkRFIjoKCQkJCSR0aGlzLT5iYXNlVVJMID0gImh0dHA6Ly93ZWJz ZXJ2aWNlcy5hbWF6b24uZGUvb25jYS94bWw/IjsKCQkJCWJyZWFrOwoJCQljYXNlICJKUCI6 CgkJCQkkdGhpcy0+YmFzZVVSTCA9ICJodHRwOi8vd2Vic2VydmljZXMuYW1hem9uLmNvLmpw L29uY2EveG1sPyI7CgkJCQlicmVhazsKCQkJY2FzZSAiRlIiOgoJCQkJJHRoaXMtPmJhc2VV UkwgPSAiaHR0cDovL3dlYnNlcnZpY2VzLmFtYXpvbi5mci9vbmNhL3htbD8iOwoJCQkJYnJl YWs7CgkJCWNhc2UgIkNBIjoKCQkJCSR0aGlzLT5iYXNlVVJMID0gImh0dHA6Ly93ZWJzZXJ2 aWNlcy5hbWF6b24uY2Evb25jYS94bWw/IjsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJ JHRoaXMtPmJhc2VVUkwgPSAiaHR0cDovL3dlYnNlcnZpY2VzLmFtYXpvbi5jb20vb25jYS94 bWw/IjsKCQkJCWJyZWFrOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCglmdW5jdGlvbiByZXF1ZXN0 SXRlbSgkcmVxdWVzdEl0ZW1zLCAkZG9jYWNoZSkKCXsKCQlleHRyYWN0KGdldF9wcmVmcygp KTsKCgoJCSRjYWNoZV9sb2NhbHBhdGggPSAiJGFzdl9hbWF6b25fY2FjaGVkaXIvJHRoaXMt PmxvY2FsZS0iLiRyZXF1ZXN0SXRlbXNbJ0l0ZW1JZCddOwoJCSRjYWNoZXVybCA9ICR0ZW1w ZGlyLiRjYWNoZV9sb2NhbHBhdGg7CgoJCWlmKCRkb2NhY2hlICYmIGZpbGVfZXhpc3RzKCRj YWNoZXVybCkgJiYgdGltZSgpIC0gZmlsZW10aW1lKCRjYWNoZXVybCkgPDMwMCkKCQl7CgkJ CSR1cmwgPSAkY2FjaGV1cmw7CgkJfQoJCWVsc2UKCQl7CgkJCSR1cmwgPSAkdGhpcy0+YnVp bGRVUkwoJHJlcXVlc3RJdGVtcyk7CgkJfQoKCgkJJGRhdGEgPSAkdGhpcy0+ZmV0Y2hVUkwo JHVybCk7CgoJCSRjb250ZW50cyA9ICR0aGlzLT5wYXJzZSgkZGF0YSk7CgoJCWlmKCRkb2Nh Y2hlKQoJCXsKCQkJaWYoJGNhY2hldXJsICE9ICR1cmwpCgkJCXsKCQkJCSR0aGlzLT5jYWNo ZSgkY2FjaGVfbG9jYWxwYXRoLCAkZGF0YSk7CgkJCX0KCgkJCWZvcmVhY2goJGNvbnRlbnRz IGFzICRrZXk9PiR2YWx1ZSkKCQkJewoJCQkJc3dpdGNoKCRrZXkpCgkJCQl7CgkJCQkJY2Fz ZSAiYXN2X1NtYWxsSW1hZ2VVUkwiOgoJCQkJCWNhc2UgImFzdl9NZWRpdW1JbWFnZVVSTCI6 CgkJCQkJY2FzZSAiYXN2X0xhcmdlSW1hZ2VVUkwiOgoJCQkJCQkkY2FjaGVfbG9jYWxwYXRo ID0gJGFzdl9hbWF6b25fY2FjaGVkaXIuIi8iLmJhc2VuYW1lKCR2YWx1ZSk7CgoJCQkJCQlp ZighZmlsZV9leGlzdHMoJGNhY2hlX2xvY2FscGF0aCkgfHwgdGltZSgpIC0gZmlsZW10aW1l KCRjYWNoZV9sb2NhbHBhdGgpID4zMDApCgkJCQkJCXsKCQkJCQkJCSRkYXRhID0gJHRoaXMt PmZldGNoVVJMKCR2YWx1ZSk7CgkJCQkJCQkkdGhpcy0+Y2FjaGUoJGNhY2hlX2xvY2FscGF0 aCwgJGRhdGEpOwoJCQkJCQl9CgoJCQkJCQkkY29udGVudHNbJGtleV0gPSAkYXN2X2FtYXpv bl9jYWNoZXVybC4nLycuYmFzZW5hbWUoJHZhbHVlKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0 dXJuICRjb250ZW50czsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCglmdW5jdGlvbiByZXF1ZXN0SXRlbXMo JHJlcXVlc3RJdGVtcykKCXsKCQkkdXJsID0gJHRoaXMtPmJ1aWxkVVJMKCRyZXF1ZXN0SXRl bXMpOwoKCQlyZXR1cm4gJHRoaXMtPmZldGNoVVJMKCR1cmwpOwoJfQoKCS8vLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK CWZ1bmN0aW9uIHBhcnNlKCRkYXRhKQoJewoKCQlleHRyYWN0KGdldF9wcmVmcygpKTsKCgkJ JHBhcnNlciA9IHhtbF9wYXJzZXJfY3JlYXRlKCk7CgkJJGFtYXpvbl9wYXJzZXIgPSAmbmV3 IEFtYXpvbjJQYXJzZXIoKTsKCQl4bWxfc2V0X29iamVjdCgkcGFyc2VyLCAkYW1hem9uX3Bh cnNlcik7CgkJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fQ0FT RV9GT0xESU5HLCBmYWxzZSk7CgkJeG1sX3NldF9lbGVtZW50X2hhbmRsZXIoJHBhcnNlciwg InN0YXJ0RWxlbWVudCIsICJlbmRFbGVtZW50Iik7CgkJeG1sX3NldF9jaGFyYWN0ZXJfZGF0 YV9oYW5kbGVyKCRwYXJzZXIsICJjaGFyYWN0ZXJEYXRhIik7CgoJCWlmICgheG1sX3BhcnNl KCRwYXJzZXIsICRkYXRhKSkKCQl7CgkJCXByaW50KHNwcmludGYoIlhNTCBlcnJvcjogJXMg YXQgbGluZSAlZCIsCgkJCXhtbF9lcnJvcl9zdHJpbmcoeG1sX2dldF9lcnJvcl9jb2RlKCRw YXJzZXIpKSwKCQkJeG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyKCRwYXJzZXIpKSk7CgkJ fQoKCQl4bWxfcGFyc2VyX2ZyZWUoJHBhcnNlcik7CgoJCXJldHVybiAkYW1hem9uX3BhcnNl ci0+Z2V0Q29udGVudHNBcnJheSgpOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIGNhY2hl KCRsb2NhbHBhdGgsICRkYXRhKQoJewoJCSRmcCA9IGZvcGVuKCRsb2NhbHBhdGgsICd3Jyk7 CgkJZndyaXRlKCRmcCwgJGRhdGEpOwoJCWZjbG9zZSgkZnApOwoJfQoKCS8vLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK CWZ1bmN0aW9uIGZldGNoVVJMKCR1cmwpCgl7CgkJLy8gY3JlYXRlIGEgbmV3IGN1cmwgcmVz b3VyY2UKCQkkY2ggPSBjdXJsX2luaXQoKTsKCgkJLy8gc2V0IFVSTCBhbmQgb3RoZXIgYXBw cm9wcmlhdGUgb3B0aW9ucwoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwp OwoKCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7CgoJCS8v IGdyYWIgVVJMIGFuZCBwYXNzIGl0IHRvIHRoZSBicm93c2VyCgkJJGRhdGEgPSBjdXJsX2V4 ZWMoJGNoKTsKCgkJLy8gY2xvc2UgY3VybCByZXNvdXJjZSwgYW5kIGZyZWUgdXAgc3lzdGVt IHJlc291cmNlcwoJCWN1cmxfY2xvc2UoJGNoKTsKCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8v LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKCWZ1bmN0aW9uIGJ1aWxkVVJMIC8qIHByaXZhdGUgKi8oJHJlcXVlc3RJdGVt cykKCXsKCQkkdXJsID0gJHRoaXMtPmJhc2VVUkwuCgkJCQkiU2VydmljZT0iLiR0aGlzLT5z ZXJ2aWNlLgoJCQkJIiZTdWJzY3JpcHRpb25JZD0iLiR0aGlzLT5hcGlfa2V5LgoJCQkJIiZW ZXJzaW9uPSIuJHRoaXMtPnZlcnNpb24uCgkJCQkiJlJlc3BvbnNlR3JvdXA9Ii4kdGhpcy0+ cmVzcG9uc2VHcm91cDsKCgkJJHRoaXMtPnJlcXVlc3RlZEl0ZW1zID0gJHJlcXVlc3RJdGVt czsKCgkJZm9yZWFjaCgkcmVxdWVzdEl0ZW1zIGFzICRrZXk9PiR2YWx1ZSkKCQl7CgkJCQkk dXJsIC49ICcmJy4ka2V5Lic9Jy4kdmFsdWU7CgkJfQoKCQlyZXR1cm4gJHVybDsKCX0KCgkv Ly0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KCglmdW5jdGlvbiBnZXRSZXNwb25zZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5y ZXNwb25zZTsKCX0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBBbWF6b24yUGFyc2VyCnsKLy8tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCi8qIFRoaXMgY2xhc3MgaXMgYSBoZWxwZXIgdG8gdGhlIGFzdl9hbWF6b24gZnVuY3Rp b24uIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gcGFyc2UgdGhlIHhtbCBkYXRh IGFuZCByZXR1cm4gdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBhc3ZfYW1hem9uIGZ1bmN0aW9u LiovCiAgIHZhciAkYXN2X2NvbnRlbnRzOwkvL2hvbGQgYWxsIHRoZSBkYXRhIHRvIHJldHVy bgogICB2YXIgJGFzdl9mbGFnOwkvL2hvbGQgdGhlIGN1cnJlbnQgdGFnIG5hbWUKCiAgIC8v LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKICAgZnVuY3Rpb24gQW1hem9uMlBhcnNlcigpCiAgIHsKICAgfQoKICAgLy8t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgogICBmdW5jdGlvbiBzdGFydEVsZW1lbnQoJHBhcnNlciwgJHRhZ05hbWUsICRh dHRycyl7CgkgICBzd2l0Y2ggKCR0YWdOYW1lKSB7CgkJICAgY2FzZSAiRGV0YWlsUGFnZVVS TCI6CgkJICAgY2FzZSAiU21hbGxJbWFnZSI6CgkJICAgY2FzZSAiTWVkaXVtSW1hZ2UiOgoJ CSAgIGNhc2UgIkxhcmdlSW1hZ2UiOgoJCSAgIGNhc2UgIkl0ZW1BdHRyaWJ1dGVzIjoKCQkJ ICAgJHRoaXMtPmFzdl9mbGFnID0gJHRhZ05hbWU7CgkJCSAgIGJyZWFrOwoJCSAgIGNhc2Ug IlVSTCI6CgkJCSAgIGlmKCR0aGlzLT5hc3ZfZmxhZyA9PSAiU21hbGxJbWFnZSIpCgkJCQkg ICAkdGhpcy0+YXN2X2ZsYWcgPSAiU21hbGxJbWFnZVVSTCI7CgkJCSAgIGlmKCR0aGlzLT5h c3ZfZmxhZyA9PSAiTWVkaXVtSW1hZ2UiKQoJCQkJICAgJHRoaXMtPmFzdl9mbGFnID0gIk1l ZGl1bUltYWdlVVJMIjsKCQkJICAgaWYoJHRoaXMtPmFzdl9mbGFnID09ICJMYXJnZUltYWdl IikKCQkJCSAgICR0aGlzLT5hc3ZfZmxhZyA9ICJMYXJnZUltYWdlVVJMIjsKCQkJICAgYnJl YWs7CgkJICAgY2FzZSAiVGl0bGUiOgoJCQkgICBpZigkdGhpcy0+YXN2X2ZsYWcgPT0gIkl0 ZW1BdHRyaWJ1dGVzIikKCQkJCSAgICR0aGlzLT5hc3ZfZmxhZyA9ICJUaXRsZSI7CgkJCSAg IGJyZWFrOwoJICAgfQogICB9CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIGZ1bmN0aW9uIGVuZEVsZW1l bnQoJHBhcnNlciwgJHRhZ05hbWUpewogICB9CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIGZ1bmN0aW9u IGNoYXJhY3RlckRhdGEoJHBhcnNlciwgJGRhdGEpewoJICAgc3dpdGNoICgkdGhpcy0+YXN2 X2ZsYWcpIHsKCQkgICBjYXNlICJEZXRhaWxQYWdlVVJMIjoKCQkgICBjYXNlICJTbWFsbElt YWdlVVJMIjoKCQkgICBjYXNlICJNZWRpdW1JbWFnZVVSTCI6CgkJICAgY2FzZSAiTGFyZ2VJ bWFnZVVSTCI6CgkJICAgY2FzZSAiVGl0bGUiOgoJCQkgICAkdGhpcy0+YXN2X2NvbnRlbnRz WyJhc3ZfIi4kdGhpcy0+YXN2X2ZsYWddID0gJGRhdGE7CgkJCSAgICR0aGlzLT5hc3ZfZmxh ZyA9ICcnOwoJCQkgICBicmVhazsKCSAgIH0KICAgfQoKICAgLy8tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICBmdW5j dGlvbiBnZXRDb250ZW50c0FycmF5KCl7CgkgICByZXR1cm4gJHRoaXMtPmFzdl9jb250ZW50 czsKICAgfQoKfSI7czozOiJtZDUiO3M6MzI6Ijc1ZDkwODA3MDQzOTFjOTAwNmQwYTA5MTMw MWNiMDQzIjt9