iPhoneHandle
0.0.2
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Improved ScreenConfig feature for Dynamic iPhone Screens.
Init release.
The iPhoneHandle Package.
Das iPhoneHandle Paket.
2.4.x
3.0.x
2010-06-25 18:14:39
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBiaW4vY2dpLWJpbi9qc29uLnBsIC0ganNvbiBoYW5kbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IGpzb24ucGwsdiAxLjcgMjAxMC8wNi8yMiAyMDowMTo0NCBjciBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgdXNlIC4uLy4uLyBhcyBsaWIgbG9jYXRpb24KdXNlIEZpbmRCaW4gcXcoJEJpbik7CnVzZSBsaWIgIiRCaW4vLi4vLi4iOwp1c2UgbGliICIkQmluLy4uLy4uL0tlcm5lbC9jcGFuLWxpYiI7Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6QXV0aDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlF1ZXVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2NrOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SlNPTjsKdXNlIEtlcm5lbDo6U3lzdGVtOjppUGhvbmU7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpteSAkU2VsZiA9IENvcmUtPm5ldygpOwpwcmludCAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBcbiI7CnByaW50ICJcbiI7CnByaW50ICRTZWxmLT5EaXNwYXRjaCgpOwoKcGFja2FnZSBDb3JlOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBEaXNwYXRjaCB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgIyBjb21tb24gb2JqZWN0cwogICAgJFNlbGYtPntDb25maWdPYmplY3R9ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgJFNlbGYtPntFbmNvZGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIExvZ1ByZWZpeCA9PiAnT1RSUy1SUEMnLAogICAgICAgICV7JFNlbGZ9LAogICAgKTsKICAgICRTZWxmLT57TWFpbk9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1F1ZXVlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UXVldWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1R5cGVPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xvY2tPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9jay0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKCiAgICAkU2VsZi0+e0pTT05PYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SlNPTi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQYXJhbU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntpUGhvbmVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OmlQaG9uZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIG15ICRVc2VyICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyJyApOwogICAgbXkgJFB3ICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Bhc3N3b3JkJyApOwogICAgbXkgJE9iamVjdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09iamVjdCcgKTsKICAgIG15ICRNZXRob2QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdNZXRob2QnICk7CiAgICBteSAkRGF0YSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGF0YScgKTsKICAgIG15ICRQYXJhbVNjYWxhciA9ICRTZWxmLT57SlNPTk9iamVjdH0tPkRlY29kZSggRGF0YSA9PiAkRGF0YSApOwogICAgbXkgJVBhcmFtOwogICAgaWYgKCRQYXJhbVNjYWxhcikgewogICAgICAgICVQYXJhbSA9ICV7JFBhcmFtU2NhbGFyfTsKICAgIH0KICAgICRVc2VyIHx8PSAnJzsKICAgICRQdyAgIHx8PSAnJzsKCiAgICAjIGFnZW50IGF1dGgKICAgIG15ICVQYXJhbUZpeGVkOwogICAgaWYgKDEpIHsKICAgICAgICBteSAkQXV0aE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpBdXRoLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgbXkgJFVzZXJMb2dpbiA9ICRBdXRoT2JqZWN0LT5BdXRoKCBVc2VyID0+ICRVc2VyLCBQdyA9PiAkUHcgKTsKICAgICAgICBpZiAoICEkVXNlckxvZ2luICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF1dGggZm9yIHVzZXIgJFVzZXIgKHB3ICRQdykgZmFpbGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmVzdWx0KCk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB1c2VyIGlkCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGlmICEkVXNlcklEOwoKICAgICAgICAkUGFyYW1GaXhlZHtVc2VySUR9ID0gJFVzZXJJRDsKICAgIH0KCiAgICAjIHN5c3RlbSBhdXRoCiAgICBlbHNlIHsKICAgICAgICBteSAkUmVxdWlyZWRVc2VyICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTT0FQOjpVc2VyJyk7CiAgICAgICAgbXkgJFJlcXVpcmVkUGFzc3dvcmQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU09BUDo6UGFzc3dvcmQnKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhZGVmaW5lZCAkUmVxdWlyZWRVc2VyCiAgICAgICAgICAgIHx8ICFsZW5ndGggJFJlcXVpcmVkVXNlcgogICAgICAgICAgICB8fCAhZGVmaW5lZCAkUmVxdWlyZWRQYXNzd29yZCB8fCAhbGVuZ3RoICRSZXF1aXJlZFBhc3N3b3JkCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU09BUDo6VXNlciBvciBTT0FQOjpQYXNzd29yZCBpcyBlbXB0eSwgU09BUCBhY2Nlc3MgZGVuaWVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmVzdWx0KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRVc2VyIG5lICRSZXF1aXJlZFVzZXIgfHwgJFB3IG5lICRSZXF1aXJlZFBhc3N3b3JkICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF1dGggZm9yIHVzZXIgJFVzZXIgKHB3ICRQdykgZmFpbGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmVzdWx0KCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gJiYgJE9iamVjdCBuZSAnQ3VzdG9tT2JqZWN0JyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggT2JqZWN0ICRPYmplY3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+UmVzdWx0KCk7CiAgICB9CgogICAgaWYgKCAoICRTZWxmLT57JE9iamVjdH0gJiYgISRTZWxmLT57JE9iamVjdH0tPmNhbigkTWV0aG9kKSApICYmICEkU2VsZi0+Y2FuKCRNZXRob2QpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBtZXRob2QgJyRNZXRob2QnIGluICckT2JqZWN0JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXN1bHQoKTsKICAgIH0KCiAgICBpZiAoICRPYmplY3QgPX4gL14oREJPYmplY3R8VGlja2V0T2JqZWN0MTIzKSQvICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYWNjZXNzIHRvICckT2JqZWN0JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXN1bHQoKTsKICAgIH0KCiAgICBpZiAoICRPYmplY3QgZXEgJ0N1c3RvbU9iamVjdCcgKSB7CiAgICAgICAgbXkgQFJlc3VsdCA9ICRTZWxmLT57aVBob25lT2JqZWN0fS0+JE1ldGhvZCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlUGFyYW1GaXhlZCwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+UmVzdWx0KCBcQFJlc3VsdCApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgQFJlc3VsdCA9ICRTZWxmLT57JE9iamVjdH0tPiRNZXRob2QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVBhcmFtRml4ZWQsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPlJlc3VsdCggXEBSZXN1bHQgKTsKICAgIH0KfQoKc3ViIFJlc3VsdCB7CiAgICBteSAoICRTZWxmLCAkUmVzdWx0ICkgPSBAXzsKCiAgICBteSAlUmVzdWx0UHJvdG9jb2w7CiAgICBpZiAoJFJlc3VsdCkgewogICAgICAgICRSZXN1bHRQcm90b2NvbHtSZXN1bHR9ID0gJ3N1Y2Nlc3NmdWwnOwogICAgICAgICRSZXN1bHRQcm90b2NvbHtEYXRhfSAgID0gJFJlc3VsdDsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZXN1bHRQcm90b2NvbHtSZXN1bHR9ID0gJ2ZhaWxlZCc7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KGVycm9yIG5vdGljZSkpIHsKICAgICAgICAgICAgJFJlc3VsdFByb3RvY29se01lc3NhZ2V9ID0gJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJEtleSwKICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICApOwogICAgICAgICAgICBsYXN0IGlmICRSZXN1bHRQcm90b2NvbHtNZXNzYWdlfTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntKU09OT2JqZWN0fS0+RW5jb2RlKCBEYXRhID0+IFwlUmVzdWx0UHJvdG9jb2wgKTsKfQoKMTsK
cGFja2FnZSBKU09OOwoKCnVzZSBzdHJpY3Q7CnVzZSBDYXJwICgpOwp1c2UgYmFzZSBxdyhFeHBvcnRlcik7CkBKU09OOjpFWFBPUlQgPSBxdyhmcm9tX2pzb24gdG9fanNvbiBqc29uVG9PYmogb2JqVG9Kc29uIGVuY29kZV9qc29uIGRlY29kZV9qc29uKTsKCkJFR0lOIHsKICAgICRKU09OOjpWRVJTSU9OID0gJzIuMjEnOwogICAgJEpTT046OkRFQlVHICAgPSAwIHVubGVzcyAoZGVmaW5lZCAkSlNPTjo6REVCVUcpOwp9CgpteSAkTW9kdWxlX1hTICA9ICdKU09OOjpYUyc7Cm15ICRNb2R1bGVfUFAgID0gJ0pTT046OlBQJzsKbXkgJFhTX1ZlcnNpb24gPSAnMi4yNyc7CgoKIyBYUyBhbmQgUFAgY29tbW9uIG1ldGhvZHMKCm15IEBQdWJsaWNNZXRob2RzID0gcXcvCiAgICBhc2NpaSBsYXRpbjEgdXRmOCBwcmV0dHkgaW5kZW50IHNwYWNlX2JlZm9yZSBzcGFjZV9hZnRlciByZWxheGVkIGNhbm9uaWNhbCBhbGxvd19ub25yZWYgCiAgICBhbGxvd19ibGVzc2VkIGNvbnZlcnRfYmxlc3NlZCBmaWx0ZXJfanNvbl9vYmplY3QgZmlsdGVyX2pzb25fc2luZ2xlX2tleV9vYmplY3QgCiAgICBzaHJpbmsgbWF4X2RlcHRoIG1heF9zaXplIGVuY29kZSBkZWNvZGUgZGVjb2RlX3ByZWZpeCBhbGxvd191bmtub3duCi87CgpteSBAUHJvcGVydGllcyA9IHF3LwogICAgYXNjaWkgbGF0aW4xIHV0ZjggaW5kZW50IHNwYWNlX2JlZm9yZSBzcGFjZV9hZnRlciByZWxheGVkIGNhbm9uaWNhbCBhbGxvd19ub25yZWYKICAgIGFsbG93X2JsZXNzZWQgY29udmVydF9ibGVzc2VkIHNocmluayBtYXhfZGVwdGggbWF4X3NpemUgYWxsb3dfdW5rbm93bgovOwoKbXkgQFhTT25seU1ldGhvZHMgPSBxdy8vOyAjIEN1cnJlbnRseSBub3RoaW5nCgpteSBAUFBPbmx5TWV0aG9kcyA9IHF3LwogICAgaW5kZW50X2xlbmd0aCBzb3J0X2J5CiAgICBhbGxvd19zaW5nbGVxdW90ZSBhbGxvd19iaWdudW0gbG9vc2UgYWxsb3dfYmFyZWtleSBlc2NhcGVfc2xhc2ggYXNfbm9uYmxlc3NlZAovOyAjIEpTT046OlBQIHNwZWNpZmljCgoKIyB1c2VkIGluIF9sb2FkX3hzIGFuZCBfbG9hZF9wcCAoJElOU1RBTExfT05MWSBpcyBub3QgdXNlZCBjdXJyZW50bHkpCm15ICRfSU5TVEFMTF9ET05UX0RJRSAgPSAxOyAjIFdoZW4gX2xvYWRfeHMgZmFpbHMgdG8gbG9hZCBYUywgZG9uJ3QgZGllLgpteSAkX0lOU1RBTExfT05MWSAgICAgID0gMjsgIyBEb24ndCBjYWxsIF9zZXRfbWV0aG9kcygpCm15ICRfQUxMT1dfVU5TVVBQT1JURUQgPSAwOwpteSAkX1VOSVZfQ09OVl9CTEVTU0VEID0gMDsKCgojIENoZWNrIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZWNpZGUgd29ya2VyIG1vZHVsZS4gCgp1bmxlc3MgKCRKU09OOjpCYWNrZW5kKSB7CiAgICAkSlNPTjo6REVCVUcgYW5kICBDYXJwOjpjYXJwKCJDaGVjayB1c2VkIHdvcmtlciBtb2R1bGUuLi4iKTsKCiAgICBteSAkYmFja2VuZCA9IGV4aXN0cyAkRU5We1BFUkxfSlNPTl9CQUNLRU5EfSA/ICRFTlZ7UEVSTF9KU09OX0JBQ0tFTkR9IDogMTsKCiAgICBpZiAoJGJhY2tlbmQgZXEgJzEnIG9yICRiYWNrZW5kID1+IC9KU09OOjpYU1xzKixccypKU09OOjpQUC8pIHsKICAgICAgICBfbG9hZF94cygkX0lOU1RBTExfRE9OVF9ESUUpIG9yIF9sb2FkX3BwKCk7CiAgICB9CiAgICBlbHNpZiAoJGJhY2tlbmQgZXEgJzAnIG9yICRiYWNrZW5kIGVxICdKU09OOjpQUCcpIHsKICAgICAgICBfbG9hZF9wcCgpOwogICAgfQogICAgZWxzaWYgKCRiYWNrZW5kIGVxICcyJyBvciAkYmFja2VuZCBlcSAnSlNPTjo6WFMnKSB7CiAgICAgICAgX2xvYWRfeHMoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIENhcnA6OmNyb2FrICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAnUEVSTF9KU09OX0JBQ0tFTkQnIGlzIGludmFsaWQuIjsKICAgIH0KfQoKCnN1YiBpbXBvcnQgewogICAgbXkgJHBrZyA9IHNoaWZ0OwogICAgbXkgQHdoYXRfdG9fZXhwb3J0OwogICAgbXkgJG5vX2V4cG9ydDsKCiAgICBmb3IgbXkgJHRhZyAoQF8pIHsKICAgICAgICBpZiAoJHRhZyBlcSAnLXN1cHBvcnRfYnlfcHAnKSB7CiAgICAgICAgICAgIGlmICghJF9BTExPV19VTlNVUFBPUlRFRCsrKSB7CiAgICAgICAgICAgICAgICBKU09OOjpCYWNrZW5kOjpYUwogICAgICAgICAgICAgICAgICAgIC0+c3VwcG9ydF9ieV9wcChAUFBPbmx5TWV0aG9kcykgaWYgKCRKU09OOjpCYWNrZW5kIGVxICRNb2R1bGVfWFMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkdGFnIGVxICctbm9fZXhwb3J0JykgewogICAgICAgICAgICAkbm9fZXhwb3J0KyssIG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJHRhZyBlcSAnLWNvbnZlcnRfYmxlc3NlZF91bml2ZXJzYWxseScgKSB7CiAgICAgICAgICAgIGV2YWwgcXwKICAgICAgICAgICAgICAgIHJlcXVpcmUgQjsKICAgICAgICAgICAgICAgICpVTklWRVJTQUw6OlRPX0pTT04gPSBzdWIgewogICAgICAgICAgICAgICAgICAgIG15ICRiX29iaiA9IEI6OnN2cmVmXzJvYmplY3QoICRfWzBdICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAgICRiX29iai0+aXNhKCdCOjpIVicpID8geyAleyAkX1swXSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJGJfb2JqLT5pc2EoJ0I6OkFWJykgPyBbIEB7ICRfWzBdIH0gXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB8IGlmICggISRfVU5JVl9DT05WX0JMRVNTRUQrKyApOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KICAgICAgICBwdXNoIEB3aGF0X3RvX2V4cG9ydCwgJHRhZzsKICAgIH0KCiAgICByZXR1cm4gaWYgKCRub19leHBvcnQpOwoKICAgIF9fUEFDS0FHRV9fLT5leHBvcnRfdG9fbGV2ZWwoMSwgJHBrZywgQHdoYXRfdG9fZXhwb3J0KTsKfQoKCiMgT0JTT0xFVEVECgpzdWIganNvblRvT2JqIHsKICAgIG15ICRhbHRlcm5hdGl2ZSA9ICdmcm9tX2pzb24nOwogICAgaWYgKGRlZmluZWQgJF9bMF0gYW5kIFVOSVZFUlNBTDo6aXNhKCRfWzBdLCAnSlNPTicpKSB7CiAgICAgICAgc2hpZnQgQF87ICRhbHRlcm5hdGl2ZSA9ICdkZWNvZGUnOwogICAgfQogICAgQ2FycDo6Y2FycCAiJ2pzb25Ub09iaicgd2lsbCBiZSBvYnNvbGV0ZWQuIFBsZWFzZSB1c2UgJyRhbHRlcm5hdGl2ZScgaW5zdGVhZC4iOwogICAgcmV0dXJuIEpTT046OmZyb21fanNvbihAXyk7Cn07CgpzdWIgb2JqVG9Kc29uIHsKICAgIG15ICRhbHRlcm5hdGl2ZSA9ICd0b19qc29uJzsKICAgIGlmIChkZWZpbmVkICRfWzBdIGFuZCBVTklWRVJTQUw6OmlzYSgkX1swXSwgJ0pTT04nKSkgewogICAgICAgIHNoaWZ0IEBfOyAkYWx0ZXJuYXRpdmUgPSAnZW5jb2RlJzsKICAgIH0KICAgIENhcnA6OmNhcnAgIidvYmpUb0pzb24nIHdpbGwgYmUgb2Jzb2xldGVkLiBQbGVhc2UgdXNlICckYWx0ZXJuYXRpdmUnIGluc3RlYWQuIjsKICAgIEpTT046OnRvX2pzb24oQF8pOwp9OwoKCiMgSU5URVJGQUNFUwoKc3ViIHRvX2pzb24gKCRAKSB7CiAgICBteSAkanNvbiA9IG5ldyBKU09OOwoKICAgIGlmIChAXyA9PSAyIGFuZCByZWYgJF9bMV0gZXEgJ0hBU0gnKSB7CiAgICAgICAgbXkgJG9wdCAgPSAkX1sxXTsKICAgICAgICBmb3IgbXkgJG1ldGhvZCAoa2V5cyAlJG9wdCkgewogICAgICAgICAgICAkanNvbi0+JG1ldGhvZCggJG9wdC0+eyRtZXRob2R9ICk7CiAgICAgICAgfQogICAgfQoKICAgICRqc29uLT5lbmNvZGUoJF9bMF0pOwp9CgoKc3ViIGZyb21fanNvbiAoJEApIHsKICAgIG15ICRqc29uID0gbmV3IEpTT047CgogICAgaWYgKEBfID09IDIgYW5kIHJlZiAkX1sxXSBlcSAnSEFTSCcpIHsKICAgICAgICBteSAkb3B0ICA9ICRfWzFdOwogICAgICAgIGZvciBteSAkbWV0aG9kIChrZXlzICUkb3B0KSB7CiAgICAgICAgICAgICRqc29uLT4kbWV0aG9kKCAkb3B0LT57JG1ldGhvZH0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRqc29uLT5kZWNvZGUoICRfWzBdICk7Cn0KCgpzdWIgdHJ1ZSAgeyAkSlNPTjo6dHJ1ZSAgfQoKc3ViIGZhbHNlIHsgJEpTT046OmZhbHNlIH0KCnN1YiBudWxsICB7IHVuZGVmOyB9CgoKc3ViIHJlcXVpcmVfeHNfdmVyc2lvbiB7ICRYU19WZXJzaW9uOyB9CgpzdWIgYmFja2VuZCB7CiAgICBteSAkcHJvdG8gPSBzaGlmdDsKICAgICRKU09OOjpCYWNrZW5kOwp9CgojKm1vZHVsZSA9ICpiYWNrZW5kOwoKCnN1YiBpc194cyB7CiAgICByZXR1cm4gJF9bMF0tPm1vZHVsZSBlcSAkTW9kdWxlX1hTOwp9CgoKc3ViIGlzX3BwIHsKICAgIHJldHVybiAkX1swXS0+bW9kdWxlIGVxICRNb2R1bGVfUFA7Cn0KCgpzdWIgcHVyZXBlcmxfb25seV9tZXRob2RzIHsgQFBQT25seU1ldGhvZHM7IH0KCgpzdWIgcHJvcGVydHkgewogICAgbXkgKCRzZWxmLCAkbmFtZSwgJHZhbHVlKSA9IEBfOwoKICAgIGlmIChAXyA9PSAxKSB7CiAgICAgICAgbXkgJXByb3BzOwogICAgICAgIGZvciAkbmFtZSAoQFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgbXkgJG1ldGhvZCA9ICdnZXRfJyAuICRuYW1lOwogICAgICAgICAgICBpZiAoJG5hbWUgZXEgJ21heF9zaXplJykgewogICAgICAgICAgICAgICAgbXkgJHZhbHVlID0gJHNlbGYtPiRtZXRob2QoKTsKICAgICAgICAgICAgICAgICRwcm9wc3skbmFtZX0gPSAkdmFsdWUgPT0gMSA/IDAgOiAkdmFsdWU7CiAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwcm9wc3skbmFtZX0gPSAkc2VsZi0+JG1ldGhvZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gXCVwcm9wczsKICAgIH0KICAgIGVsc2lmIChAXyA+IDMpIHsKICAgICAgICBDYXJwOjpjcm9haygncHJvcGVydHkoKSBjYW4gdGFrZSBvbmx5IHRoZSBvcHRpb24gd2l0aGluIDIgYXJndW1lbnRzLicpOwogICAgfQogICAgZWxzaWYgKEBfID09IDIpIHsKICAgICAgICBpZiAoIG15ICRtZXRob2QgPSAkc2VsZi0+Y2FuKCdnZXRfJyAuICRuYW1lKSApIHsKICAgICAgICAgICAgaWYgKCRuYW1lIGVxICdtYXhfc2l6ZScpIHsKICAgICAgICAgICAgICAgIG15ICR2YWx1ZSA9ICRzZWxmLT4kbWV0aG9kKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlID09IDEgPyAwIDogJHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzZWxmLT4kbWV0aG9kKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHNlbGYtPiRuYW1lKCR2YWx1ZSk7CiAgICB9Cgp9CgoKCiMgSU5URVJOQUwKCnN1YiBfbG9hZF94cyB7CiAgICBteSAkb3B0ID0gc2hpZnQ7CgogICAgJEpTT046OkRFQlVHIGFuZCBDYXJwOjpjYXJwICJMb2FkICRNb2R1bGVfWFMuIjsKCiAgICAjIGlmIGNhbGxlZCBhZnRlciBpbnN0YWxsIG1vZHVsZSwgb3ZlcmxvYWQgaXMgZGlzYWJsZS4uLi4gd2h5PwogICAgSlNPTjo6Qm9vbGVhbjo6X292ZXJycmlkZV9vdmVybG9hZCgkTW9kdWxlX1hTKTsKICAgIEpTT046OkJvb2xlYW46Ol9vdmVycnJpZGVfb3ZlcmxvYWQoJE1vZHVsZV9QUCk7CgogICAgZXZhbCBxcXwKICAgICAgICB1c2UgJE1vZHVsZV9YUyAkWFNfVmVyc2lvbiAoKTsKICAgIHw7CgogICAgaWYgKCRAKSB7CiAgICAgICAgaWYgKGRlZmluZWQgJG9wdCBhbmQgJG9wdCAmICRfSU5TVEFMTF9ET05UX0RJRSkgewogICAgICAgICAgICAkSlNPTjo6REVCVUcgYW5kIENhcnA6OmNhcnAgIkNhbid0IGxvYWQgJE1vZHVsZV9YUy4uLigkQCkiOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgQ2FycDo6Y3JvYWsgJEA7CiAgICB9CgogICAgdW5sZXNzIChkZWZpbmVkICRvcHQgYW5kICRvcHQgJiAkX0lOU1RBTExfT05MWSkgewogICAgICAgIF9zZXRfbW9kdWxlKCAkSlNPTjo6QmFja2VuZCA9ICRNb2R1bGVfWFMgKTsKICAgICAgICBteSAkZGF0YSA9IGpvaW4oIiIsIDxEQVRBPik7ICMgdGhpcyBjb2RlIGlzIGZyb20gSmNvZGUgMi54eC4KICAgICAgICBjbG9zZShEQVRBKTsKICAgICAgICBldmFsICRkYXRhOwogICAgICAgIEpTT046OkJhY2tlbmQ6OlhTLT5pbml0OwogICAgfQoKICAgIHJldHVybiAxOwp9OwoKCnN1YiBfbG9hZF9wcCB7CiAgICBteSAkb3B0ID0gc2hpZnQ7CgogICAgJEpTT046OkRFQlVHIGFuZCBDYXJwOjpjYXJwICJMb2FkICRNb2R1bGVfUFAuIjsKCiAgICAjIGlmIGNhbGxlZCBhZnRlciBpbnN0YWxsIG1vZHVsZSwgb3ZlcmxvYWQgaXMgZGlzYWJsZS4uLi4gd2h5PwogICAgSlNPTjo6Qm9vbGVhbjo6X292ZXJycmlkZV9vdmVybG9hZCgkTW9kdWxlX1hTKTsKICAgIEpTT046OkJvb2xlYW46Ol9vdmVycnJpZGVfb3ZlcmxvYWQoJE1vZHVsZV9QUCk7CgogICAgZXZhbCBxcXwgcmVxdWlyZSAkTW9kdWxlX1BQIHw7CiAgICBpZiAoJEApIHsKICAgICAgICBDYXJwOjpjcm9hayAkQDsKICAgIH0KCiAgICB1bmxlc3MgKGRlZmluZWQgJG9wdCBhbmQgJG9wdCAmICRfSU5TVEFMTF9PTkxZKSB7CiAgICAgICAgX3NldF9tb2R1bGUoICRKU09OOjpCYWNrZW5kID0gJE1vZHVsZV9QUCApOwogICAgICAgIEpTT046OkJhY2tlbmQ6OlBQLT5pbml0OwogICAgfQp9OwoKCnN1YiBfc2V0X21vZHVsZSB7CiAgICBteSAkbW9kdWxlID0gc2hpZnQ7CgogICAgbG9jYWwgJF5XOwogICAgbm8gc3RyaWN0IHF3KHJlZnMpOwoKICAgICRKU09OOjp0cnVlICA9ICR7IiRtb2R1bGVcOjp0cnVlIn07CiAgICAkSlNPTjo6ZmFsc2UgPSAkeyIkbW9kdWxlXDo6ZmFsc2UifTsKCiAgICBwdXNoIEBKU09OOjpJU0EsICRtb2R1bGU7CiAgICBwdXNoIEB7IiRtb2R1bGVcOjpCb29sZWFuOjpJU0EifSwgcXcoSlNPTjo6Qm9vbGVhbik7CgogICAgKnsiSlNPTjo6aXNfYm9vbCJ9ID0gXCZ7IiRtb2R1bGVcOjppc19ib29sIn07CgogICAgZm9yIG15ICRtZXRob2QgKCRtb2R1bGUgZXEgJE1vZHVsZV9YUyA/IEBQUE9ubHlNZXRob2RzIDogQFhTT25seU1ldGhvZHMpIHsKICAgICAgICAqeyJKU09OOjokbWV0aG9kIn0gPSBzdWIgewogICAgICAgICAgICBDYXJwOjpjYXJwKCIkbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gJG1vZHVsZS4iKTsKICAgICAgICAgICAgJF9bMF07CiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKCgojCiMgSlNPTiBCb29sZWFuCiMKCnBhY2thZ2UgSlNPTjo6Qm9vbGVhbjsKCm15ICVJbnN0YWxsZWQ7CgpzdWIgX292ZXJycmlkZV9vdmVybG9hZCB7CiAgICByZXR1cm4gaWYgKCRJbnN0YWxsZWR7ICRfWzBdIH0rKyk7CgogICAgbXkgJGJvb2xlYW4gPSAkX1swXSAuICc6OkJvb2xlYW4nOwoKICAgIGV2YWwgc3ByaW50ZihxfAogICAgICAgIHBhY2thZ2UgJXM7CiAgICAgICAgdXNlIG92ZXJsb2FkICgKICAgICAgICAgICAgJyIiJyA9PiBzdWIgeyAkeyRfWzBdfSA9PSAxID8gJ3RydWUnIDogJ2ZhbHNlJyB9LAogICAgICAgICAgICAnZXEnID0+IHN1YiB7CiAgICAgICAgICAgICAgICBteSAoJG9iaiwgJG9wKSA9IHJlZiAoJF9bMF0pID8gKCRfWzBdLCAkX1sxXSkgOiAoJF9bMV0sICRfWzBdKTsKICAgICAgICAgICAgICAgIGlmICgkb3AgZXEgJ3RydWUnIG9yICRvcCBlcSAnZmFsc2UnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIkb2JqIiBlcSAndHJ1ZScgPyAndHJ1ZScgZXEgJG9wIDogJ2ZhbHNlJyBlcSAkb3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG9iaiA/IDEgPT0gJG9wIDogMCA9PSAkb3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIHwsICRib29sZWFuKTsKCiAgICBpZiAoJEApIHsgQ2FycDo6Y3JvYWsgJEA7IH0KCiAgICByZXR1cm4gMTsKfQoKCiMKIyBIZWxwZXIgY2xhc3NlcyBmb3IgQmFja2VuZCBNb2R1bGUgKFBQKQojCgpwYWNrYWdlIEpTT046OkJhY2tlbmQ6OlBQOwoKc3ViIGluaXQgewogICAgbG9jYWwgJF5XOwogICAgbm8gc3RyaWN0IHF3KHJlZnMpOwogICAgKnsiSlNPTjo6ZGVjb2RlX2pzb24ifSA9IFwmeyJKU09OOjpQUDo6ZGVjb2RlX2pzb24ifTsKICAgICp7IkpTT046OmVuY29kZV9qc29uIn0gPSBcJnsiSlNPTjo6UFA6OmVuY29kZV9qc29uIn07CiAgICAqeyJKU09OOjpQUDo6aXNfeHMifSAgPSBzdWIgeyAwIH07CiAgICAqeyJKU09OOjpQUDo6aXNfcHAifSAgPSBzdWIgeyAxIH07CiAgICByZXR1cm4gMTsKfQoKIwojIFRvIHNhdmUgbWVtb3J5LCB0aGUgYmVsb3cgbGluZXMgYXJlIHJlYWQgb25seSB3aGVuIFhTIGJhY2tlbmQgaXMgdXNlZC4KIwoKcGFja2FnZSBKU09OOwoKMTsKX19EQVRBX18KCgojCiMgSGVscGVyIGNsYXNzZXMgZm9yIEJhY2tlbmQgTW9kdWxlIChYUykKIwoKcGFja2FnZSBKU09OOjpCYWNrZW5kOjpYUzsKCnVzZSBjb25zdGFudCBJTkRFTlRfTEVOR1RIX0ZMQUcgPT4gMTUgPDwgMTI7Cgp1c2UgY29uc3RhbnQgVU5TVVBQT1JURURfRU5DT0RFX0ZMQUcgPT4gewogICAgRVNDQVBFX1NMQVNIICAgICAgPT4gMHgwMDAwMDAxMCwKICAgIEFMTE9XX0JJR05VTSAgICAgID0+IDB4MDAwMDAwMjAsCiAgICBBU19OT05CTEVTU0VEICAgICA9PiAweDAwMDAwMDQwLAogICAgRVhQQU5ERUQgICAgICAgICAgPT4gMHgxMDAwMDAwMCwgIyBmb3IgZGV2ZWxvcGVyJ3MKfTsKCnVzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9ERUNPREVfRkxBRyA9PiB7CiAgICBMT09TRSAgICAgICAgICAgICA9PiAweDAwMDAwMDAxLAogICAgQUxMT1dfQklHTlVNICAgICAgPT4gMHgwMDAwMDAwMiwKICAgIEFMTE9XX0JBUkVLRVkgICAgID0+IDB4MDAwMDAwMDQsCiAgICBBTExPV19TSU5HTEVRVU9URSA9PiAweDAwMDAwMDA4LAogICAgRVhQQU5ERUQgICAgICAgICAgPT4gMHgyMDAwMDAwMCwgIyBmb3IgZGV2ZWxvcGVyJ3MKfTsKCgpzdWIgaW5pdCB7CiAgICBsb2NhbCAkXlc7CiAgICBubyBzdHJpY3QgcXcocmVmcyk7CiAgICAqeyJKU09OOjpkZWNvZGVfanNvbiJ9ID0gXCZ7IkpTT046OlhTOjpkZWNvZGVfanNvbiJ9OwogICAgKnsiSlNPTjo6ZW5jb2RlX2pzb24ifSA9IFwmeyJKU09OOjpYUzo6ZW5jb2RlX2pzb24ifTsKICAgICp7IkpTT046OlhTOjppc194cyJ9ICA9IHN1YiB7IDEgfTsKICAgICp7IkpTT046OlhTOjppc19wcCJ9ICA9IHN1YiB7IDAgfTsKICAgIHJldHVybiAxOwp9CgoKc3ViIHN1cHBvcnRfYnlfcHAgewogICAgbXkgKCRjbGFzcywgQG1ldGhvZHMpID0gQF87CgogICAgbG9jYWwgJF5XOwogICAgbm8gc3RyaWN0IHF3KHJlZnMpOwoKICAgIHB1c2ggQEpTT046OkJhY2tlbmQ6OlhTOjpTdXBwb3J0YWJsZTo6SVNBLCAnSlNPTic7CgogICAgbXkgJHBrZyA9ICdKU09OOjpCYWNrZW5kOjpYUzo6U3VwcG9ydGFibGUnOwoKICAgICp7SlNPTjo6bmV3fSA9IHN1YiB7CiAgICAgICAgbXkgJHByb3RvID0gbmV3IEpTT046OlhTOyAkJHByb3RvID0gMDsKICAgICAgICBibGVzcyAgJHByb3RvLCAkcGtnOwogICAgfTsKCgogICAgZm9yIG15ICRtZXRob2QgKEBtZXRob2RzKSB7CiAgICAgICAgbXkgJGZsYWcgPSB1YygkbWV0aG9kKTsKICAgICAgICBteSAkdHlwZSB8PSAoVU5TVVBQT1JURURfRU5DT0RFX0ZMQUctPnskZmxhZ30gfHwgMCk7CiAgICAgICAgICAgJHR5cGUgfD0gKFVOU1VQUE9SVEVEX0RFQ09ERV9GTEFHLT57JGZsYWd9IHx8IDApOwoKICAgICAgICBuZXh0IHVubGVzcygkdHlwZSk7CgogICAgICAgICRwa2ctPl9tYWtlX3Vuc3VwcG9ydGVkX21ldGhvZCgkbWV0aG9kID0+ICR0eXBlKTsKICAgIH0KCiAgICBwdXNoIEB7IkpTT046OlhTOjpCb29sZWFuOjpJU0EifSwgcXcoSlNPTjo6UFA6OkJvb2xlYW4pOwogICAgcHVzaCBAeyJKU09OOjpQUDo6Qm9vbGVhbjo6SVNBIn0sIHF3KEpTT046OkJvb2xlYW4pOwoKICAgICRKU09OOjpERUJVRyBhbmQgQ2FycDo6Y2FycCgic2V0IC1zdXBwb3J0X2J5X3BwIG1vZGUuIik7CgogICAgcmV0dXJuIDE7Cn0KCgoKCiMKIyBIZWxwZXIgY2xhc3NlcyBmb3IgWFMKIwoKcGFja2FnZSBKU09OOjpCYWNrZW5kOjpYUzo6U3VwcG9ydGFibGU7Cgp7CiAgICBteSAkSlNPTl9YU19lbmNvZGVfb3JpZ25hbCA9IFwmSlNPTjo6WFM6OmVuY29kZTsKICAgIG15ICRKU09OX1hTX2RlY29kZV9vcmlnbmFsID0gXCZKU09OOjpYUzo6ZGVjb2RlOwogICAgbXkgJEpTT05fWFNfaW5jcl9wYXJzZV9vcmlnbmFsID0gXCZKU09OOjpYUzo6aW5jcl9wYXJzZTsKCiAgICBsb2NhbCAkXlc7CiAgICAqSlNPTjo6WFM6OmRlY29kZSA9IFwmSlNPTjo6QmFja2VuZDo6WFM6OlN1cHBvcnRhYmxlOjpfZGVjb2RlOwogICAgKkpTT046OlhTOjplbmNvZGUgPSBcJkpTT046OkJhY2tlbmQ6OlhTOjpTdXBwb3J0YWJsZTo6X2VuY29kZTsKICAgICpKU09OOjpYUzo6aW5jcl9wYXJzZSA9IFwmSlNPTjo6QmFja2VuZDo6WFM6OlN1cHBvcnRhYmxlOjpfaW5jcl9wYXJzZTsKCiAgICAqe0pTT046OlhTOjpfb3JpZ2luYWxfZGVjb2RlfSA9ICRKU09OX1hTX2RlY29kZV9vcmlnbmFsOwogICAgKntKU09OOjpYUzo6X29yaWdpbmFsX2VuY29kZX0gPSAkSlNPTl9YU19lbmNvZGVfb3JpZ25hbDsKICAgICp7SlNPTjo6WFM6Ol9vcmlnaW5hbF9pbmNyX3BhcnNlfSA9ICRKU09OX1hTX2luY3JfcGFyc2Vfb3JpZ25hbDsKfQoKJENhcnA6OkludGVybmFseydKU09OOjpCYWNrZW5kOjpYUzo6U3VwcG9ydGFibGUnfSA9IDE7CgpzdWIgX21ha2VfdW5zdXBwb3J0ZWRfbWV0aG9kIHsKICAgIG15ICgkcGtnLCAkbWV0aG9kLCAkdHlwZSkgPSBAXzsKCiAgICBsb2NhbCAkXlc7CiAgICBubyBzdHJpY3QgcXcocmVmcyk7CgogICAgKnsiJHBrZ1w6OiRtZXRob2QifSA9IHN1YiB7CiAgICAgICAgbG9jYWwgJF5XOwogICAgICAgIGlmIChkZWZpbmVkICRfWzFdID8gJF9bMV0gOiAxKSB7CiAgICAgICAgICAgICR7JF9bMF19IHw9ICR0eXBlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHskX1swXX0gJj0gfiR0eXBlOwogICAgICAgIH0KICAgICAgICAkX1swXTsKICAgIH07CgogICAgKnsiJHBrZ1w6OmdldF8kbWV0aG9kIn0gPSBzdWIgewogICAgICAgICR7JF9bMF19ICYgJHR5cGUgPyAxIDogJyc7CiAgICB9OwoKfQoKCnN1YiBfc2V0X2Zvcl9wcCB7CiAgICByZXF1aXJlIEpTT046OlBQOwogICAgbXkgJHR5cGUgID0gc2hpZnQ7CiAgICBteSAkcHAgICAgPSBuZXcgSlNPTjo6UFA7CiAgICBteSAkcHJvcCA9ICRfWzBdLT5wcm9wZXJ0eTsKCiAgICBmb3IgbXkgJG5hbWUgKGtleXMgJSRwcm9wKSB7CiAgICAgICAgJHBwLT4kbmFtZSggJHByb3AtPnskbmFtZX0gPyAkcHJvcC0+eyRuYW1lfSA6IDAgKTsKICAgIH0KCiAgICBteSAkdW5zdXBwb3J0ZWQgPSAkdHlwZSBlcSAnZW5jb2RlJyA/IEpTT046OkJhY2tlbmQ6OlhTOjpVTlNVUFBPUlRFRF9FTkNPREVfRkxBRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OOjpCYWNrZW5kOjpYUzo6VU5TVVBQT1JURURfREVDT0RFX0ZMQUc7CiAgICBteSAkZmxhZ3MgICAgICAgPSAkeyRfWzBdfSB8fCAwOwoKICAgIGZvciBteSAkbmFtZSAoa2V5cyAlJHVuc3VwcG9ydGVkKSB7CiAgICAgICAgbmV4dCBpZiAoJG5hbWUgZXEgJ0VYUEFOREVEJyk7ICMgZm9yIGRldmVsb3BlcidzCiAgICAgICAgbXkgJGVuYWJsZSA9ICgkZmxhZ3MgJiAkdW5zdXBwb3J0ZWQtPnskbmFtZX0pID8gMSA6IDA7CiAgICAgICAgbXkgJG1ldGhvZCA9IGxjICRuYW1lOwogICAgICAgICRwcC0+JG1ldGhvZCgkZW5hYmxlKTsKICAgIH0KCiAgICAkcHAtPmluZGVudF9sZW5ndGgoICRfWzBdLT5nZXRfaW5kZW50X2xlbmd0aCApOwoKICAgIHJldHVybiAkcHA7Cn0KCnN1YiBfZW5jb2RlIHsgIyB1c2luZyB3aXRoIFBQIGVuY29kCiAgICBpZiAoJHskX1swXX0pIHsKICAgICAgICBfc2V0X2Zvcl9wcCgnZW5jb2RlJyA9PiBAXyktPmVuY29kZSgkX1sxXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkX1swXS0+X29yaWdpbmFsX2VuY29kZSggJF9bMV0gKTsKICAgIH0KfQoKCnN1YiBfZGVjb2RlIHsgIyBpZiB1bnN1cHBvcnRlZC1mbGFnIGlzIHNldCwgdXNlIFBQCiAgICBpZiAoJHskX1swXX0pIHsKICAgICAgICBfc2V0X2Zvcl9wcCgnZGVjb2RlJyA9PiBAXyktPmRlY29kZSgkX1sxXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkX1swXS0+X29yaWdpbmFsX2RlY29kZSggJF9bMV0gKTsKICAgIH0KfQoKCnN1YiBkZWNvZGVfcHJlZml4IHsgIyBpZiB1bnN1cHBvcnRlZC1mbGFnIGlzIHNldCwgdXNlIFBQCiAgICBfc2V0X2Zvcl9wcCgnZGVjb2RlJyA9PiBAXyktPmRlY29kZV9wcmVmaXgoJF9bMV0pOwp9CgoKc3ViIF9pbmNyX3BhcnNlIHsKICAgIGlmICgkeyRfWzBdfSkgewogICAgICAgIF9zZXRfZm9yX3BwKCdkZWNvZGUnID0+IEBfKS0+aW5jcl9wYXJzZSgkX1sxXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkX1swXS0+X29yaWdpbmFsX2luY3JfcGFyc2UoICRfWzFdICk7CiAgICB9Cn0KCgpzdWIgZ2V0X2luZGVudF9sZW5ndGggewogICAgJHskX1swXX0gPDwgNCA+PiAxNjsKfQoKCnN1YiBpbmRlbnRfbGVuZ3RoIHsKICAgIG15ICRsZW5ndGggPSAkX1sxXTsKCiAgICBpZiAoIWRlZmluZWQgJGxlbmd0aCBvciAkbGVuZ3RoID4gMTUgb3IgJGxlbmd0aCA8IDApIHsKICAgICAgICBDYXJwOjpjYXJwICJUaGUgYWNjZXB0YWJsZSByYW5nZSBvZiBpbmRlbnRfbGVuZ3RoKCkgaXMgMCB0byAxNS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbG9jYWwgJF5XOwogICAgICAgICRsZW5ndGggPDw9IDEyOwogICAgICAgICR7JF9bMF19ICY9IH4gSlNPTjo6QmFja2VuZDo6WFM6OklOREVOVF9MRU5HVEhfRkxBRzsKICAgICAgICAkeyRfWzBdfSB8PSAkbGVuZ3RoOwogICAgICAgICpKU09OOjpYUzo6ZW5jb2RlID0gXCZKU09OOjpCYWNrZW5kOjpYUzo6U3VwcG9ydGFibGU6Ol9lbmNvZGU7CiAgICB9CgogICAgJF9bMF07Cn0KCgoxOwpfX0VORF9fCgo9aGVhZDEgTkFNRQoKSlNPTiAtIEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBlbmNvZGVyL2RlY29kZXIKCj1oZWFkMSBTWU5PUFNJUwoKIHVzZSBKU09OOyAjIGltcG9ydHMgZW5jb2RlX2pzb24sIGRlY29kZV9qc29uLCB0b19qc29uIGFuZCBmcm9tX2pzb24uCiAKICMgc2ltcGxlIGFuZCBmYXN0IGludGVyZmFjZXMgKGV4cGVjdC9nZW5lcmF0ZSBVVEYtOCkKIAogJHV0ZjhfZW5jb2RlZF9qc29uX3RleHQgPSBlbmNvZGVfanNvbiAkcGVybF9oYXNoX29yX2FycmF5cmVmOwogJHBlcmxfaGFzaF9vcl9hcnJheXJlZiAgPSBkZWNvZGVfanNvbiAkdXRmOF9lbmNvZGVkX2pzb25fdGV4dDsKIAogIyBPTy1pbnRlcmZhY2UKIAogJGpzb24gPSBKU09OLT5uZXctPmFsbG93X25vbnJlZjsKIAogJGpzb25fdGV4dCAgID0gJGpzb24tPmVuY29kZSggJHBlcmxfc2NhbGFyICk7CiAkcGVybF9zY2FsYXIgPSAkanNvbi0+ZGVjb2RlKCAkanNvbl90ZXh0ICk7CiAKICRwcmV0dHlfcHJpbnRlZCA9ICRqc29uLT5wcmV0dHktPmVuY29kZSggJHBlcmxfc2NhbGFyICk7ICMgcHJldHR5LXByaW50aW5nCiAKICMgSWYgeW91IHdhbnQgdG8gdXNlIFBQIG9ubHkgc3VwcG9ydCBmZWF0dXJlcywgY2FsbCB3aXRoICctc3VwcG9ydF9ieV9wcCcKICMgV2hlbiBYUyB1bnN1cHBvcnRlZCBmZWF0dXJlIGlzIGVuYWJsZSwgdXNpbmcgUFAgKGRlfGVuKWNvZGUgaW5zdGVhZCBvZiBYUyBvbmVzLgogCiB1c2UgSlNPTiAtc3VwcG9ydF9ieV9wcDsKIAogIyBvcHRpb24tYWNjZXB0YWJsZSBpbnRlcmZhY2VzIChleHBlY3QvZ2VuZXJhdGUgVU5JQ09ERSBieSBkZWZhdWx0KQogCiAkanNvbl90ZXh0ICAgPSB0b19qc29uKCAkcGVybF9zY2FsYXIsIHsgYXNjaWkgPT4gMSwgcHJldHR5ID0+IDEgfSApOwogJHBlcmxfc2NhbGFyID0gZnJvbV9qc29uKCAkanNvbl90ZXh0LCB7IHV0ZjggID0+IDEgfSApOwogCiAjIEJldHdlZW4gKGVufGRlKWNvZGVfanNvbiBhbmQgKHRvfGZyb20pX2pzb24sIGlmIHlvdSB3YW50IHRvIHdyaXRlCiAjIGEgY29kZSB3aGljaCBjb21tdW5pY2F0ZXMgdG8gYW4gb3V0ZXIgd29ybGQgKGVuY29kZWQgaW4gVVRGLTgpLAogIyByZWNvbW1lbmQgdG8gdXNlIChlbnxkZSljb2RlX2pzb24uCiAKPWhlYWQxIFZFUlNJT04KCiAgICAyLjIxCgpUaGlzIHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIEpTT046OlhTIEI8Mi4yNz4gYW5kIGxhdGVyLgoKCj1oZWFkMSBERVNDUklQVElPTgoKICoqKioqKioqKioqKioqKioqKioqKioqKioqIENBVVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhpcyBpcyAnSlNPTiBtb2R1bGUgdmVyc2lvbiAyJyBhbmQgdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW5jZXMgICoKICogdG8gdmVyc2lvbiAxLnh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogUGxlYXNlIGNoZWNrIHlvdXIgYXBwbGljYXRpb25zIHVzZWluZyBvbGQgdmVyc2lvbi4gICAgICAgICAgICAgICoKICogICBTZWUgdG8gJ0lOQ09NUEFUSUJMRSBDSEFOR0VTIFRPIE9MRCBWRVJTSU9OJyAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBpcyBhIHNpbXBsZSBkYXRhIGZvcm1hdC4KU2VlIHRvIEw8aHR0cDovL3d3dy5qc29uLm9yZy8+IGFuZCBDPFJGQzQ2Mjc+KEw8aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQ+KS4KClRoaXMgbW9kdWxlIGNvbnZlcnRzIFBlcmwgZGF0YSBzdHJ1Y3R1cmVzIHRvIEpTT04gYW5kIHZpY2UgdmVyc2EgdXNpbmcgZWl0aGVyCkw8SlNPTjo6WFM+IG9yIEw8SlNPTjo6UFA+LgoKSlNPTjo6WFMgaXMgdGhlIGZhc3Rlc3QgYW5kIG1vc3QgcHJvcGVyIEpTT04gbW9kdWxlIG9uIENQQU4gd2hpY2ggbXVzdCBiZQpjb21waWxlZCBhbmQgaW5zdGFsbGVkIGluIHlvdXIgZW52aXJvbm1lbnQuCkpTT046OlBQIGlzIGEgcHVyZS1QZXJsIG1vZHVsZSB3aGljaCBpcyBidW5kbGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGFuZApoYXMgYSBzdHJvbmcgY29tcGF0aWJpbGl0eSB0byBKU09OOjpYUy4KClRoaXMgbW9kdWxlIHRyeSB0byB1c2UgSlNPTjo6WFMgYnkgZGVmYXVsdCBhbmQgZmFpbCB0byBpdCwgdXNlIEpTT046OlBQIGluc3RlYWQuClNvIGl0cyBmZWF0dXJlcyBjb21wbGV0ZWx5IGRlcGVuZCBvbiBKU09OOjpYUyBvciBKU09OOjpQUC4KClNlZSB0byBMPEJBQ0tFTkQgTU9EVUxFIERFQ0lTSU9OPi4KClRvIGRpc3Rpbmd1aXNoIHRoZSBtb2R1bGUgbmFtZSAnSlNPTicgYW5kIHRoZSBmb3JtYXQgdHlwZSBKU09OLAp0aGUgZm9ybWVyIGlzIHF1b3RlZCBieSBDRTxsdD5FPGd0PiAoaXRzIHJlc3VsdHMgdmFyeSB3aXRoIHlvdXIgdXNpbmcgbWVkaWEpLAphbmQgdGhlIGxhdHRlciBpcyBsZWZ0IGp1c3QgYXMgaXQgaXMuCgpNb2R1bGUgbmFtZSA6IEM8SlNPTj4KCkZvcm1hdCB0eXBlIDogSlNPTgoKPWhlYWQyIEZFQVRVUkVTCgo9b3ZlcgoKPWl0ZW0gKiBjb3JyZWN0IHVuaWNvZGUgaGFuZGxpbmcKClRoaXMgbW9kdWxlIChpLmUuIGJhY2tlbmQgbW9kdWxlcykga25vd3MgaG93IHRvIGhhbmRsZSBVbmljb2RlLCBkb2N1bWVudHMKaG93IGFuZCB3aGVuIGl0IGRvZXMgc28sIGFuZCBldmVuIGRvY3VtZW50cyB3aGF0ICJjb3JyZWN0IiBtZWFucy4KCkV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBsaW1pdGF0aW9ucywgdGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSBzaW5jZSBQZXJsIHZlcnNpb24gNS42LgoKSlNPTjo6WFMgcmVxdWlyZXMgUGVybCA1LjguMiAoYnV0IHdvcmtzIGNvcnJlY3RseSBpbiA1LjguOCBvciBsYXRlciksIHNvIGluIG9sZGVyIHZlcnNpb25zCkM8SlNPTj4gc2hvbHVkIGNhbGwgSlNPTjo6UFAgYXMgdGhlIGJhY2tlbmQgd2hpY2ggY2FuIGJlIHVzZWQgc2luY2UgUGVybCA1LjAwNS4KCldpdGggUGVybCA1LjgueCBKU09OOjpQUCB3b3JrcywgYnV0IGZyb20gNS44LjAgdG8gNS44LjIsIGJlY2F1c2Ugb2YgYSBQZXJsIHNpZGUgcHJvYmxlbSwKSlNPTjo6UFAgd29ya3Mgc2xvd2VyIGluIHRoZSB2ZXJzaW9ucy4gQW5kIGluIDUuMDA1LCB0aGUgVW5pY29kZSBoYW5kbGluZyBpcyBub3QgYXZhaWxhYmxlLgpTZWUgdG8gTDxKU09OOjpQUC9VTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KClNlZSBhbHNvIHRvIEw8SlNPTjo6WFMvQSBGRVcgTk9URVMgT04gVU5JQ09ERSBBTkQgUEVSTD4KYW5kIEw8SlNPTjo6WFMvRU5DT0RJTkcvQ09ERVNFVF9GTEFHX05PVEVTPi4KCgo9aXRlbSAqIHJvdW5kLXRyaXAgaW50ZWdyaXR5CgpXaGVuIHlvdSBzZXJpYWxpc2UgYSBwZXJsIGRhdGEgc3RydWN0dXJlIHVzaW5nIG9ubHkgZGF0YSB0eXBlcyBzdXBwb3J0ZWQKYnkgSlNPTiBhbmQgUGVybCwgdGhlIGRlc2VyaWFsaXNlZCBkYXRhIHN0cnVjdHVyZSBpcyBpZGVudGljYWwgb24gdGhlIFBlcmwKbGV2ZWwuIChlLmcuIHRoZSBzdHJpbmcgIjIuMCIgZG9lc24ndCBzdWRkZW5seSBiZWNvbWUgIjIiIGp1c3QgYmVjYXVzZQppdCBsb29rcyBsaWtlIGEgbnVtYmVyKS4gVGhlcmUgSTxhcmU+IG1pbm9yIGV4Y2VwdGlvbnMgdG8gdGhpcywgcmVhZCB0aGUKTDwvTUFQUElORz4gc2VjdGlvbiBiZWxvdyB0byBsZWFybiBhYm91dCB0aG9zZS4KCgo9aXRlbSAqIHN0cmljdCBjaGVja2luZyBvZiBKU09OIGNvcnJlY3RuZXNzCgpUaGVyZSBpcyBubyBndWVzc2luZywgbm8gZ2VuZXJhdGluZyBvZiBpbGxlZ2FsIEpTT04gdGV4dHMgYnkgZGVmYXVsdCwKYW5kIG9ubHkgSlNPTiBpcyBhY2NlcHRlZCBhcyBpbnB1dCBieSBkZWZhdWx0ICh0aGUgbGF0dGVyIGlzIGEgc2VjdXJpdHkKZmVhdHVyZSkuCgpTZWUgdG8gTDxKU09OOjpYUy9GRUFUVVJFUz4gYW5kIEw8SlNPTjo6UFAvRkVBVFVSRVM+LgoKPWl0ZW0gKiBmYXN0CgpUaGlzIG1vZHVsZSByZXR1cm5zIGEgSlNPTjo6WFMgb2JqZWN0IGl0c2VsZiBpZiBhdmFpbGFibGUuCkNvbXBhcmVkIHRvIG90aGVyIEpTT04gbW9kdWxlcyBhbmQgb3RoZXIgc2VyaWFsaXNlcnMgc3VjaCBhcyBTdG9yYWJsZSwKSlNPTjo6WFMgdXN1YWxseSBjb21wYXJlcyBmYXZvdXJhYmx5IGluIHRlcm1zIG9mIHNwZWVkLCB0b28uCgpJZiBub3QgYXZhaWxhYmxlLCBDPEpTT04+IHJldHVybnMgYSBKU09OOjpQUCBvYmplY3QgaW5zdGVhZCBvZiBKU09OOjpYUyBhbmQKaXQgaXMgdmVyeSBzbG93IGFzIHB1cmUtUGVybC4KCj1pdGVtICogc2ltcGxlIHRvIHVzZQoKVGhpcyBtb2R1bGUgaGFzIGJvdGggYSBzaW1wbGUgZnVuY3Rpb25hbCBpbnRlcmZhY2UgYXMgd2VsbCBhcyBhbgpvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIGludGVyZmFjZS4KCj1pdGVtICogcmVhc29uYWJseSB2ZXJzYXRpbGUgb3V0cHV0IGZvcm1hdHMKCllvdSBjYW4gY2hvb3NlIGJldHdlZW4gdGhlIG1vc3QgY29tcGFjdCBndWFyYW50ZWVkLXNpbmdsZS1saW5lIGZvcm1hdCBwb3NzaWJsZQoobmljZSBmb3Igc2ltcGxlIGxpbmUtYmFzZWQgcHJvdG9jb2xzKSwgYSBwdXJlLUFTQ0lJIGZvcm1hdCAoZm9yIHdoZW4geW91ciB0cmFuc3BvcnQKaXMgbm90IDgtYml0IGNsZWFuLCBzdGlsbCBzdXBwb3J0cyB0aGUgd2hvbGUgVW5pY29kZSByYW5nZSksIG9yIGEgcHJldHR5LXByaW50ZWQKZm9ybWF0IChmb3Igd2hlbiB5b3Ugd2FudCB0byByZWFkIHRoYXQgc3R1ZmYpLiBPciB5b3UgY2FuIGNvbWJpbmUgdGhvc2UgZmVhdHVyZXMKaW4gd2hhdGV2ZXIgd2F5IHlvdSBsaWtlLgoKPWJhY2sKCj1oZWFkMSBGVU5DVElPTkFMIElOVEVSRkFDRQoKU29tZSBkb2N1bWVudHMgYXJlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBMPEpTT046OlhTL0ZVTkNUSU9OQUwgSU5URVJGQUNFPi4KQzx0b19qc29uPiBhbmQgQzxmcm9tX2pzb24+IGFyZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucy4KCj1oZWFkMiBlbmNvZGVfanNvbgoKICAgICRqc29uX3RleHQgPSBlbmNvZGVfanNvbiAkcGVybF9zY2FsYXIKCkNvbnZlcnRzIHRoZSBnaXZlbiBQZXJsIGRhdGEgc3RydWN0dXJlIHRvIGEgVVRGLTggZW5jb2RlZCwgYmluYXJ5IHN0cmluZy4KClRoaXMgZnVuY3Rpb24gY2FsbCBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvOgoKICAgICRqc29uX3RleHQgPSBKU09OLT5uZXctPnV0ZjgtPmVuY29kZSgkcGVybF9zY2FsYXIpCgo9aGVhZDIgZGVjb2RlX2pzb24KCiAgICAkcGVybF9zY2FsYXIgPSBkZWNvZGVfanNvbiAkanNvbl90ZXh0CgpUaGUgb3Bwb3NpdGUgb2YgQzxlbmNvZGVfanNvbj46IGV4cGVjdHMgYW4gVVRGLTggKGJpbmFyeSkgc3RyaW5nIGFuZCB0cmllcwp0byBwYXJzZSB0aGF0IGFzIGFuIFVURi04IGVuY29kZWQgSlNPTiB0ZXh0LCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZwpyZWZlcmVuY2UuCgpUaGlzIGZ1bmN0aW9uIGNhbGwgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0bzoKCiAgICAkcGVybF9zY2FsYXIgPSBKU09OLT5uZXctPnV0ZjgtPmRlY29kZSgkanNvbl90ZXh0KQoKCj1oZWFkMiB0b19qc29uCgogICAkanNvbl90ZXh0ID0gdG9fanNvbigkcGVybF9zY2FsYXIpCgpDb252ZXJ0cyB0aGUgZ2l2ZW4gUGVybCBkYXRhIHN0cnVjdHVyZSB0byBhIGpzb24gc3RyaW5nLgoKVGhpcyBmdW5jdGlvbiBjYWxsIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG86CgogICAkanNvbl90ZXh0ID0gSlNPTi0+bmV3LT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKVGFrZXMgYSBoYXNoIHJlZmVyZW5jZSBhcyB0aGUgc2Vjb25kLgoKICAgJGpzb25fdGV4dCA9IHRvX2pzb24oJHBlcmxfc2NhbGFyLCAkZmxhZ19oYXNocmVmKQoKU28sCgogICAkanNvbl90ZXh0ID0gZW5jb2RlX2pzb24oJHBlcmxfc2NhbGFyLCB7dXRmOCA9PiAxLCBwcmV0dHkgPT4gMX0pCgplcXVpdmFsZW50IHRvOgoKICAgJGpzb25fdGV4dCA9IEpTT04tPm5ldy0+dXRmOCgxKS0+cHJldHR5KDEpLT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKSWYgeW91IHdhbnQgdG8gd3JpdGUgYSBtb2Rlcm4gcGVybCBjb2RlIHdoaWNoIGNvbW11bmljYXRlcyB0byBvdXRlciB3b3JsZCwKeW91IHNob3VsZCB1c2UgQzxlbmNvZGVfanNvbj4gKHN1cHBvc2VkIHRoYXQgSlNPTiBkYXRhIGFyZSBlbmNvZGVkIGluIFVURi04KS4KCj1oZWFkMiBmcm9tX2pzb24KCiAgICRwZXJsX3NjYWxhciA9IGZyb21fanNvbigkanNvbl90ZXh0KQoKVGhlIG9wcG9zaXRlIG9mIEM8dG9fanNvbj46IGV4cGVjdHMgYSBqc29uIHN0cmluZyBhbmQgdHJpZXMKdG8gcGFyc2UgaXQsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHJlZmVyZW5jZS4KClRoaXMgZnVuY3Rpb24gY2FsbCBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvOgoKICAgICRwZXJsX3NjYWxhciA9IEpTT04tPmRlY29kZSgkanNvbl90ZXh0KQoKVGFrZXMgYSBoYXNoIHJlZmVyZW5jZSBhcyB0aGUgc2Vjb25kLgoKICAgICRwZXJsX3NjYWxhciA9IGZyb21fanNvbigkanNvbl90ZXh0LCAkZmxhZ19oYXNocmVmKQoKU28sCgogICAgJHBlcmxfc2NhbGFyID0gZnJvbV9qc29uKCRqc29uX3RleHQsIHt1dGY4ID0+IDF9KQoKZXF1aXZhbGVudCB0bzoKCiAgICAkcGVybF9zY2FsYXIgPSBKU09OLT5uZXctPnV0ZjgoMSktPmRlY29kZSgkanNvbl90ZXh0KQoKSWYgeW91IHdhbnQgdG8gd3JpdGUgYSBtb2Rlcm4gcGVybCBjb2RlIHdoaWNoIGNvbW11bmljYXRlcyB0byBvdXRlciB3b3JsZCwKeW91IHNob3VsZCB1c2UgQzxkZWNvZGVfanNvbj4gKHN1cHBvc2VkIHRoYXQgSlNPTiBkYXRhIGFyZSBlbmNvZGVkIGluIFVURi04KS4KCj1oZWFkMiBKU09OOjppc19ib29sCgogICAgJGlzX2Jvb2xlYW4gPSBKU09OOjppc19ib29sKCRzY2FsYXIpCgpSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBzY2FsYXIgcmVwcmVzZW50cyBlaXRoZXIgSlNPTjo6dHJ1ZSBvcgpKU09OOjpmYWxzZSwgdHdvIGNvbnN0YW50cyB0aGF0IGFjdCBsaWtlIEM8MT4gYW5kIEM8MD4gcmVzcGVjdGl2ZWx5CmFuZCBhcmUgYWxzbyB1c2VkIHRvIHJlcHJlc2VudCBKU09OIEM8dHJ1ZT4gYW5kIEM8ZmFsc2U+IGluIFBlcmwgc3RyaW5ncy4KCj1oZWFkMiBKU09OOjp0cnVlCgpSZXR1cm5zIEpTT04gdHJ1ZSB2YWx1ZSB3aGljaCBpcyBibGVzc2VkIG9iamVjdC4KSXQgQzxpc2E+IEpTT046OkJvb2xlYW4gb2JqZWN0LgoKPWhlYWQyIEpTT046OmZhbHNlCgpSZXR1cm5zIEpTT04gZmFsc2UgdmFsdWUgd2hpY2ggaXMgYmxlc3NlZCBvYmplY3QuCkl0IEM8aXNhPiBKU09OOjpCb29sZWFuIG9iamVjdC4KCj1oZWFkMiBKU09OOjpudWxsCgpSZXR1cm5zIEM8dW5kZWY+LgoKU2VlIEw8TUFQUElORz4sIGJlbG93LCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgSlNPTiB2YWx1ZXMgYXJlIG1hcHBlZCB0bwpQZXJsLgoKPWhlYWQxIEhPVyBETyBJIERFQ09ERSBBIERBVEEgRlJPTSBPVVRFUiBBTkQgRU5DT0RFIFRPIE9VVEVSCgpUaGlzIHNlY3Rpb24gc3VwcG9zZXMgdGhhdCB5b3VyIHBlcmwgdnJlc2lvbiBpcyA1Ljggb3IgbGF0ZXIuCgpJZiB5b3Uga25vdyBhIEpTT04gdGV4dCBmcm9tIGFuIG91dGVyIHdvcmxkIC0gYSBuZXR3b3JrLCBhIGZpbGUgY29udGVudCwgYW5kIHNvIG9uLAppcyBlbmNvZGVkIGluIFVURi04LCB5b3Ugc2hvdWxkIHVzZSBDPGRlY29kZV9qc29uPiBvciBDPEpTT04+IG1vZHVsZSBvYmplY3QKd2l0aCBDPHV0Zjg+IGVuYWJsZS4gQW5kIHRoZSBkZWNvZGVkIHJlc3VsdCB3aWxsIGNvbnRhaW4gVU5JQ09ERSBjaGFyYWN0ZXJzLgoKICAjIGZyb20gbmV0d29yawogIG15ICRqc29uICAgICAgICA9IEpTT04tPm5ldy0+dXRmODsKICBteSAkanNvbl90ZXh0ICAgPSBDR0ktPm5ldy0+cGFyYW0oICdqc29uX2RhdGEnICk7CiAgbXkgJHBlcmxfc2NhbGFyID0gJGpzb24tPmRlY29kZSggJGpzb25fdGV4dCApOwogIAogICMgZnJvbSBmaWxlIGNvbnRlbnQKICBsb2NhbCAkLzsKICBvcGVuKCBteSAkZmgsICc8JywgJ2pzb24uZGF0YScgKTsKICAkanNvbl90ZXh0ICAgPSA8JGZoPjsKICAkcGVybF9zY2FsYXIgPSBkZWNvZGVfanNvbiggJGpzb25fdGV4dCApOwoKSWYgYW4gb3V0ZXIgZGF0YSBpcyBub3QgZW5jb2RlZCBpbiBVVEYtOCwgZmlyc3RseSB5b3Ugc2hvdWxkIEM8ZGVjb2RlPiBpdC4KCiAgdXNlIEVuY29kZTsKICBsb2NhbCAkLzsKICBvcGVuKCBteSAkZmgsICc8JywgJ2pzb24uZGF0YScgKTsKICBteSAkZW5jb2RpbmcgPSAnY3A5MzInOwogIG15ICR1bmljb2RlX2pzb25fdGV4dCA9IGRlY29kZSggJGVuY29kaW5nLCA8JGZoPiApOyAjIFVOSUNPREUKICAKICAjIG9yIHlvdSBjYW4gd3JpdGUgdGhlIGJlbG93IGNvZGUuCiAgIwogICMgb3BlbiggbXkgJGZoLCAiPDplbmNvZGluZygkZW5jb2RpbmcpIiwgJ2pzb24uZGF0YScgKTsKICAjICR1bmljb2RlX2pzb25fdGV4dCA9IDwkZmg+OwoKSW4gdGhpcyBjYXNlLCBDPCR1bmljb2RlX2pzb25fdGV4dD4gaXMgb2YgY291cnNlIFVOSUNPREUgc3RyaW5nLgpTbyB5b3UgQjxjYW5ub3Q+IHVzZSBDPGRlY29kZV9qc29uPiBub3IgQzxKU09OPiBtb2R1bGUgb2JqZWN0IHdpdGggQzx1dGY4PiBlbmFibGUuCkluc3RlYWQgb2YgdGhlbSwgeW91IHVzZSBDPEpTT04+IG1vZHVsZSBvYmplY3Qgd2l0aCBDPHV0Zjg+IGRpc2FibGUgb3IgQzxmcm9tX2pzb24+LgoKICAkcGVybF9zY2FsYXIgPSAkanNvbi0+dXRmOCgwKS0+ZGVjb2RlKCAkdW5pY29kZV9qc29uX3RleHQgKTsKICAjIG9yCiAgJHBlcmxfc2NhbGFyID0gZnJvbV9qc29uKCAkdW5pY29kZV9qc29uX3RleHQgKTsKCk9yIEM8ZW5jb2RlICd1dGY4Jz4gYW5kIEM8ZGVjb2RlX2pzb24+OgoKICAkcGVybF9zY2FsYXIgPSBkZWNvZGVfanNvbiggZW5jb2RlKCAndXRmOCcsICR1bmljb2RlX2pzb25fdGV4dCApICk7CiAgIyB0aGlzIHdheSBpcyBub3QgZWZmaWNpZW50LgoKQW5kIG5vdywgeW91IHdhbnQgdG8gY29udmVydCB5b3VyIEM8JHBlcmxfc2NhbGFyPiBpbnRvIEpTT04gZGF0YSBhbmQKc2VuZCBpdCB0byBhbiBvdXRlciB3b3JsZCAtIGEgbmV0d29yayBvciBhIGZpbGUgY29udGVudCwgYW5kIHNvIG9uLgoKWW91ciBkYXRhIHVzdWFsbHkgY29udGFpbnMgVU5JQ09ERSBzdHJpbmdzIGFuZCB5b3Ugd2FudCB0aGUgY29udmVydGVkIGRhdGEgdG8gYmUgZW5jb2RlZAppbiBVVEYtOCwgeW91IHNob3VsZCB1c2UgQzxlbmNvZGVfanNvbj4gb3IgQzxKU09OPiBtb2R1bGUgb2JqZWN0IHdpdGggQzx1dGY4PiBlbmFibGUuCgogIHByaW50IGVuY29kZV9qc29uKCAkcGVybF9zY2FsYXIgKTsgIyB0byBhIG5ldHdvcms/IGZpbGU/IG9yIGRpc3BsYXk/CiAgIyBvcgogIHByaW50ICRqc29uLT51dGY4LT5lbmNvZGUoICRwZXJsX3NjYWxhciApOwoKSWYgQzwkcGVybF9zY2FsYXI+IGRvZXMgbm90IGNvbnRhaW4gVU5JQ09ERSBidXQgQzwkZW5jb2Rpbmc+LWVuY29kZWQgc3RyaW5ncwpmb3Igc29tZSByZWFzb24sIHRoZW4gaXRzIGNoYXJhY3RlcnMgYXJlIHJlZ2FyZGVkIGFzIEI8bGF0aW4xPiBmb3IgcGVybAooYmVjYXVzZSBpdCBkb2VzIG5vdCBjb25jZXJuIHdpdGggeW91ciAkZW5jb2RpbmcpLgpZb3UgQjxjYW5ub3Q+IHVzZSBDPGVuY29kZV9qc29uPiBub3IgQzxKU09OPiBtb2R1bGUgb2JqZWN0IHdpdGggQzx1dGY4PiBlbmFibGUuCkluc3RlYWQgb2YgdGhlbSwgeW91IHVzZSBDPEpTT04+IG1vZHVsZSBvYmplY3Qgd2l0aCBDPHV0Zjg+IGRpc2FibGUgb3IgQzx0b19qc29uPi4KTm90ZSB0aGF0IHRoZSByZXN1bHRlZCB0ZXh0IGlzIGEgVU5JQ09ERSBzdHJpbmcgYnV0IG5vIHByb2JsZW0gdG8gcHJpbnQgaXQuCgogICMgJHBlcmxfc2NhbGFyIGNvbnRhaW5zICRlbmNvZGluZyBlbmNvZGVkIHN0cmluZyB2YWx1ZXMKICAkdW5pY29kZV9qc29uX3RleHQgPSAkanNvbi0+dXRmOCgwKS0+ZW5jb2RlKCAkcGVybF9zY2FsYXIgKTsKICAjIG9yIAogICR1bmljb2RlX2pzb25fdGV4dCA9IHRvX2pzb24oICRwZXJsX3NjYWxhciApOwogICMgJHVuaWNvZGVfanNvbl90ZXh0IGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgbGVzcyB0aGFuIDB4MTAwCiAgcHJpbnQgJHVuaWNvZGVfanNvbl90ZXh0OwoKT3IgQzxkZWNvZGUgJGVuY29kaW5nPiBhbGwgc3RyaW5nIHZhbHVlcyBhbmQgQzxlbmNvZGVfanNvbj46CgogICRwZXJsX3NjYWxhci0+eyBmb28gfSA9IGRlY29kZSggJGVuY29kaW5nLCAkcGVybF9zY2FsYXItPnsgZm9vIH0gKTsKICAjIC4uLiBkbyBpdCB0byBlYWNoIHN0cmluZyB2YWx1ZXMsIHRoZW4gZW5jb2RlX2pzb24KICAkanNvbl90ZXh0ID0gZW5jb2RlX2pzb24oICRwZXJsX3NjYWxhciApOwoKVGhpcyBtZXRob2QgaXMgYSBwcm9wZXIgd2F5IGJ1dCBwcm9iYWJseSBub3QgZWZmaWNpZW50LgoKU2VlIHRvIEw8RW5jb2RlPiwgTDxwZXJsdW5paW50cm8+LgoKCj1oZWFkMSBDT01NT04gT0JKRUNULU9SSUVOVEVEIElOVEVSRkFDRQoKPWhlYWQyIG5ldwoKICAgICRqc29uID0gbmV3IEpTT04KClJldHVybnMgYSBuZXcgQzxKU09OPiBvYmplY3QgaW5oZXJpdGVkIGZyb20gZWl0aGVyIEpTT046OlhTIG9yIEpTT046OlBQCnRoYXQgY2FuIGJlIHVzZWQgdG8gZGUvZW5jb2RlIEpTT04gc3RyaW5ncy4KCkFsbCBib29sZWFuIGZsYWdzIGRlc2NyaWJlZCBiZWxvdyBhcmUgYnkgZGVmYXVsdCBJPGRpc2FibGVkPi4KClRoZSBtdXRhdG9ycyBmb3IgZmxhZ3MgYWxsIHJldHVybiB0aGUgSlNPTiBvYmplY3QgYWdhaW4gYW5kIHRodXMgY2FsbHMgY2FuCmJlIGNoYWluZWQ6CgogICBteSAkanNvbiA9IEpTT04tPm5ldy0+dXRmOC0+c3BhY2VfYWZ0ZXItPmVuY29kZSh7YSA9PiBbMSwyXX0pCiAgID0+IHsiYSI6IFsxLCAyXX0KCj1oZWFkMiBhc2NpaQoKICAgICRqc29uID0gJGpzb24tPmFzY2lpKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2FzY2lpCgpJZiAkZW5hYmxlIGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBlbmNvZGUgbWV0aG9kIHdpbGwgbm90IGdlbmVyYXRlIGNoYXJhY3RlcnMgb3V0c2lkZQp0aGUgY29kZSByYW5nZSAwLi4xMjcuIEFueSBVbmljb2RlIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGF0IHJhbmdlIHdpbGwgYmUgZXNjYXBlZCB1c2luZyBlaXRoZXIKYSBzaW5nbGUgXHVYWFhYIG9yIGEgZG91YmxlIFx1SEhISFx1TExMTEwgZXNjYXBlIHNlcXVlbmNlLCBhcyBwZXIgUkZDNDYyNy4KCklmICRlbmFibGUgaXMgZmFsc2UsIHRoZW4gdGhlIGVuY29kZSBtZXRob2Qgd2lsbCBub3QgZXNjYXBlIFVuaWNvZGUgY2hhcmFjdGVycyB1bmxlc3MKcmVxdWlyZWQgYnkgdGhlIEpTT04gc3ludGF4IG9yIG90aGVyIGZsYWdzLiBUaGlzIHJlc3VsdHMgaW4gYSBmYXN0ZXIgYW5kIG1vcmUgY29tcGFjdCBmb3JtYXQuCgpUaGlzIGZlYXR1cmUgZGVwZW5kcyBvbiB0aGUgdXNlZCBQZXJsIHZlcnNpb24gYW5kIGVudmlyb25tZW50LgoKU2VlIHRvIEw8SlNPTjo6UFAvVU5JQ09ERSBIQU5ETElORyBPTiBQRVJMUz4gaWYgdGhlIGJhY2tlbmQgaXMgUFAuCgogIEpTT04tPm5ldy0+YXNjaWkoMSktPmVuY29kZShbY2hyIDB4MTA0MDFdKQogID0+IFsiXHVkODAxXHVkYzAxIl0KCj1oZWFkMiBsYXRpbjEKCiAgICAkanNvbiA9ICRqc29uLT5sYXRpbjEoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfbGF0aW4xCgpJZiAkZW5hYmxlIGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBlbmNvZGUgbWV0aG9kIHdpbGwgZW5jb2RlIHRoZSByZXN1bHRpbmcgSlNPTgp0ZXh0IGFzIGxhdGluMSAob3IgaXNvLTg4NTktMSksIGVzY2FwaW5nIGFueSBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGNvZGUgcmFuZ2UgMC4uMjU1LgoKSWYgJGVuYWJsZSBpcyBmYWxzZSwgdGhlbiB0aGUgZW5jb2RlIG1ldGhvZCB3aWxsIG5vdCBlc2NhcGUgVW5pY29kZSBjaGFyYWN0ZXJzCnVubGVzcyByZXF1aXJlZCBieSB0aGUgSlNPTiBzeW50YXggb3Igb3RoZXIgZmxhZ3MuCgogIEpTT04tPm5ldy0+bGF0aW4xLT5lbmNvZGUgKFsiXHh7ODl9XHh7YWJjfSJdCiAgPT4gWyJceHs4OX1cXHUwYWJjIl0gICAgIyAocGVybCBzeW50YXgsIFUrYWJjIGVzY2FwZWQsIFUrODkgbm90KQoKPWhlYWQyIHV0ZjgKCiAgICAkanNvbiA9ICRqc29uLT51dGY4KFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X3V0ZjgKCklmICRlbmFibGUgaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gdGhlIGVuY29kZSBtZXRob2Qgd2lsbCBlbmNvZGUgdGhlIEpTT04gcmVzdWx0CmludG8gVVRGLTgsIGFzIHJlcXVpcmVkIGJ5IG1hbnkgcHJvdG9jb2xzLCB3aGlsZSB0aGUgZGVjb2RlIG1ldGhvZCBleHBlY3RzIHRvIGJlIGhhbmRsZWQKYW4gVVRGLTgtZW5jb2RlZCBzdHJpbmcuIFBsZWFzZSBub3RlIHRoYXQgVVRGLTgtZW5jb2RlZCBzdHJpbmdzIGRvIG5vdCBjb250YWluIGFueQpjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIHJhbmdlIDAuLjI1NSwgdGhleSBhcmUgdGh1cyB1c2VmdWwgZm9yIGJ5dGV3aXNlL2JpbmFyeSBJL08uCgpJbiBmdXR1cmUgdmVyc2lvbnMsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1pZ2h0IGVuYWJsZSBhdXRvZGV0ZWN0aW9uIG9mIHRoZSBVVEYtMTYgYW5kIFVURi0zMgplbmNvZGluZyBmYW1pbGllcywgYXMgZGVzY3JpYmVkIGluIFJGQzQ2MjcuCgpJZiAkZW5hYmxlIGlzIGZhbHNlLCB0aGVuIHRoZSBlbmNvZGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBKU09OIHN0cmluZyBhcyBhIChub24tZW5jb2RlZCkKVW5pY29kZSBzdHJpbmcsIHdoaWxlIGRlY29kZSBleHBlY3RzIHRodXMgYSBVbmljb2RlIHN0cmluZy4gQW55IGRlY29kaW5nIG9yIGVuY29kaW5nCihlLmcuIHRvIFVURi04IG9yIFVURi0xNikgbmVlZHMgdG8gYmUgZG9uZSB5b3Vyc2VsZiwgZS5nLiB1c2luZyB0aGUgRW5jb2RlIG1vZHVsZS4KCgpFeGFtcGxlLCBvdXRwdXQgVVRGLTE2QkUtZW5jb2RlZCBKU09OOgoKICB1c2UgRW5jb2RlOwogICRqc29udGV4dCA9IGVuY29kZSAiVVRGLTE2QkUiLCBKU09OOjpYUy0+bmV3LT5lbmNvZGUgKCRvYmplY3QpOwoKRXhhbXBsZSwgZGVjb2RlIFVURi0zMkxFLWVuY29kZWQgSlNPTjoKCiAgdXNlIEVuY29kZTsKICAkb2JqZWN0ID0gSlNPTjo6WFMtPm5ldy0+ZGVjb2RlIChkZWNvZGUgIlVURi0zMkxFIiwgJGpzb250ZXh0KTsKClNlZSB0byBMPEpTT046OlBQL1VOSUNPREUgSEFORExJTkcgT04gUEVSTFM+IGlmIHRoZSBiYWNrZW5kIGlzIFBQLgoKCj1oZWFkMiBwcmV0dHkKCiAgICAkanNvbiA9ICRqc29uLT5wcmV0dHkoWyRlbmFibGVdKQoKVGhpcyBlbmFibGVzIChvciBkaXNhYmxlcykgYWxsIG9mIHRoZSBDPGluZGVudD4sIEM8c3BhY2VfYmVmb3JlPiBhbmQKQzxzcGFjZV9hZnRlcj4gKGFuZCBpbiB0aGUgZnV0dXJlIHBvc3NpYmx5IG1vcmUpIGZsYWdzIGluIG9uZSBjYWxsIHRvCmdlbmVyYXRlIHRoZSBtb3N0IHJlYWRhYmxlIChvciBtb3N0IGNvbXBhY3QpIGZvcm0gcG9zc2libGUuCgpFcXVpdmFsZW50IHRvOgoKICAgJGpzb24tPmluZGVudC0+c3BhY2VfYmVmb3JlLT5zcGFjZV9hZnRlcgoKVGhlIGluZGVudCBzcGFjZSBsZW5ndGggaXMgdGhyZWUgYW5kIEpTT046OlhTIGNhbm5vdCBjaGFuZ2UgdGhlIGluZGVudApzcGFjZSBsZW5ndGguCgo9aGVhZDIgaW5kZW50CgogICAgJGpzb24gPSAkanNvbi0+aW5kZW50KFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2luZGVudAoKSWYgQzwkZW5hYmxlPiBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiB0aGUgQzxlbmNvZGU+IG1ldGhvZCB3aWxsIHVzZSBhIG11bHRpbGluZQpmb3JtYXQgYXMgb3V0cHV0LCBwdXR0aW5nIGV2ZXJ5IGFycmF5IG1lbWJlciBvciBvYmplY3QvaGFzaCBrZXktdmFsdWUgcGFpcgppbnRvIGl0cyBvd24gbGluZSwgaWRlbnRpbmcgdGhlbSBwcm9wZXJseS4KCklmIEM8JGVuYWJsZT4gaXMgZmFsc2UsIG5vIG5ld2xpbmVzIG9yIGluZGVudGluZyB3aWxsIGJlIHByb2R1Y2VkLCBhbmQgdGhlCnJlc3VsdGluZyBKU09OIHRleHQgaXMgZ3VhcmVudGVlZCBub3QgdG8gY29udGFpbiBhbnkgQzxuZXdsaW5lcz4uCgpUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCB3aGVuIGRlY29kaW5nIEpTT04gdGV4dHMuCgpUaGUgaW5kZW50IHNwYWNlIGxlbmd0aCBpcyB0aHJlZS4KV2l0aCBKU09OOjpQUCwgeW91IGNhbiBhbHNvIGFjY2VzcyBDPGluZGVudF9sZW5ndGg+IHRvIGNoYW5nZSBpbmRlbnQgc3BhY2UgbGVuZ3RoLgoKCj1oZWFkMiBzcGFjZV9iZWZvcmUKCiAgICAkanNvbiA9ICRqc29uLT5zcGFjZV9iZWZvcmUoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfc3BhY2VfYmVmb3JlCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgYWRkIGFuIGV4dHJhCm9wdGlvbmFsIHNwYWNlIGJlZm9yZSB0aGUgQzw6PiBzZXBhcmF0aW5nIGtleXMgZnJvbSB2YWx1ZXMgaW4gSlNPTiBvYmplY3RzLgoKSWYgQzwkZW5hYmxlPiBpcyBmYWxzZSwgdGhlbiB0aGUgQzxlbmNvZGU+IG1ldGhvZCB3aWxsIG5vdCBhZGQgYW55IGV4dHJhCnNwYWNlIGF0IHRob3NlIHBsYWNlcy4KClRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0IHdoZW4gZGVjb2RpbmcgSlNPTiB0ZXh0cy4KCkV4YW1wbGUsIHNwYWNlX2JlZm9yZSBlbmFibGVkLCBzcGFjZV9hZnRlciBhbmQgaW5kZW50IGRpc2FibGVkOgoKICAgeyJrZXkiIDoidmFsdWUifQoKCj1oZWFkMiBzcGFjZV9hZnRlcgoKICAgICRqc29uID0gJGpzb24tPnNwYWNlX2FmdGVyKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X3NwYWNlX2FmdGVyCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgYWRkIGFuIGV4dHJhCm9wdGlvbmFsIHNwYWNlIGFmdGVyIHRoZSBDPDo+IHNlcGFyYXRpbmcga2V5cyBmcm9tIHZhbHVlcyBpbiBKU09OIG9iamVjdHMKYW5kIGV4dHJhIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIEM8LD4gc2VwYXJhdGluZyBrZXktdmFsdWUgcGFpcnMgYW5kIGFycmF5Cm1lbWJlcnMuCgpJZiBDPCRlbmFibGU+IGlzIGZhbHNlLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgbm90IGFkZCBhbnkgZXh0cmEKc3BhY2UgYXQgdGhvc2UgcGxhY2VzLgoKVGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3Qgd2hlbiBkZWNvZGluZyBKU09OIHRleHRzLgoKRXhhbXBsZSwgc3BhY2VfYmVmb3JlIGFuZCBpbmRlbnQgZGlzYWJsZWQsIHNwYWNlX2FmdGVyIGVuYWJsZWQ6CgogICB7ImtleSI6ICJ2YWx1ZSJ9CgoKPWhlYWQyIHJlbGF4ZWQKCiAgICAkanNvbiA9ICRqc29uLT5yZWxheGVkKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X3JlbGF4ZWQKCklmIEM8JGVuYWJsZT4gaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gQzxkZWNvZGU+IHdpbGwgYWNjZXB0IHNvbWUKZXh0ZW5zaW9ucyB0byBub3JtYWwgSlNPTiBzeW50YXggKHNlZSBiZWxvdykuIEM8ZW5jb2RlPiB3aWxsIG5vdCBiZQphZmZlY3RlZCBpbiBhbnl3YXkuIEk8QmUgYXdhcmUgdGhhdCB0aGlzIG9wdGlvbiBtYWtlcyB5b3UgYWNjZXB0IGludmFsaWQKSlNPTiB0ZXh0cyBhcyBpZiB0aGV5IHdlcmUgdmFsaWQhPi4gSSBzdWdnZXN0IG9ubHkgdG8gdXNlIHRoaXMgb3B0aW9uIHRvCnBhcnNlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZpbGVzIHdyaXR0ZW4gYnkgaHVtYW5zIChjb25maWd1cmF0aW9uIGZpbGVzLApyZXNvdXJjZSBmaWxlcyBldGMuKQoKSWYgQzwkZW5hYmxlPiBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGVuIEM8ZGVjb2RlPiB3aWxsIG9ubHkgYWNjZXB0CnZhbGlkIEpTT04gdGV4dHMuCgpDdXJyZW50bHkgYWNjZXB0ZWQgZXh0ZW5zaW9ucyBhcmU6Cgo9b3ZlciA0Cgo9aXRlbSAqIGxpc3QgaXRlbXMgY2FuIGhhdmUgYW4gZW5kLWNvbW1hCgpKU09OIEk8c2VwYXJhdGVzPiBhcnJheSBlbGVtZW50cyBhbmQga2V5LXZhbHVlIHBhaXJzIHdpdGggY29tbWFzLiBUaGlzCmNhbiBiZSBhbm5veWluZyBpZiB5b3Ugd3JpdGUgSlNPTiB0ZXh0cyBtYW51YWxseSBhbmQgd2FudCB0byBiZSBhYmxlIHRvCnF1aWNrbHkgYXBwZW5kIGVsZW1lbnRzLCBzbyB0aGlzIGV4dGVuc2lvbiBhY2NlcHRzIGNvbW1hIGF0IHRoZSBlbmQgb2YKc3VjaCBpdGVtcyBub3QganVzdCBiZXR3ZWVuIHRoZW06CgogICBbCiAgICAgIDEsCiAgICAgIDIsIDwtIHRoaXMgY29tbWEgbm90IG5vcm1hbGx5IGFsbG93ZWQKICAgXQogICB7CiAgICAgICJrMSI6ICJ2MSIsCiAgICAgICJrMiI6ICJ2MiIsIDwtIHRoaXMgY29tbWEgbm90IG5vcm1hbGx5IGFsbG93ZWQKICAgfQoKPWl0ZW0gKiBzaGVsbC1zdHlsZSAnIyctY29tbWVudHMKCldoZW5ldmVyIEpTT04gYWxsb3dzIHdoaXRlc3BhY2UsIHNoZWxsLXN0eWxlIGNvbW1lbnRzIGFyZSBhZGRpdGlvbmFsbHkKYWxsb3dlZC4gVGhleSBhcmUgdGVybWluYXRlZCBieSB0aGUgZmlyc3QgY2FycmlhZ2UtcmV0dXJuIG9yIGxpbmUtZmVlZApjaGFyYWN0ZXIsIGFmdGVyIHdoaWNoIG1vcmUgd2hpdGUtc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSBhbGxvd2VkLgoKICBbCiAgICAgMSwgIyB0aGlzIGNvbW1lbnQgbm90IGFsbG93ZWQgaW4gSlNPTgogICAgICAgICMgbmVpdGhlciB0aGlzIG9uZS4uLgogIF0KCj1iYWNrCgoKPWhlYWQyIGNhbm9uaWNhbAoKICAgICRqc29uID0gJGpzb24tPmNhbm9uaWNhbChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9jYW5vbmljYWwKCklmIEM8JGVuYWJsZT4gaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gdGhlIEM8ZW5jb2RlPiBtZXRob2Qgd2lsbCBvdXRwdXQgSlNPTiBvYmplY3RzCmJ5IHNvcnRpbmcgdGhlaXIga2V5cy4gVGhpcyBpcyBhZGRpbmcgYSBjb21wYXJhdGl2ZWx5IGhpZ2ggb3ZlcmhlYWQuCgpJZiBDPCRlbmFibGU+IGlzIGZhbHNlLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgb3V0cHV0IGtleS12YWx1ZQpwYWlycyBpbiB0aGUgb3JkZXIgUGVybCBzdG9yZXMgdGhlbSAod2hpY2ggd2lsbCBsaWtlbHkgY2hhbmdlIGJldHdlZW4gcnVucwpvZiB0aGUgc2FtZSBzY3JpcHQpLgoKVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBzYW1lIGRhdGEgc3RydWN0dXJlIHRvIGJlIGVuY29kZWQgYXMKdGhlIHNhbWUgSlNPTiB0ZXh0IChnaXZlbiB0aGUgc2FtZSBvdmVyYWxsIHNldHRpbmdzKS4gSWYgaXQgaXMgZGlzYWJsZWQsCnRoZSBzYW1lIGhhc2ggbWlnaHQgYmUgZW5jb2RlZCBkaWZmZXJlbnRseSBldmVuIGlmIGNvbnRhaW5zIHRoZSBzYW1lIGRhdGEsCmFzIGtleS12YWx1ZSBwYWlycyBoYXZlIG5vIGluaGVyZW50IG9yZGVyaW5nIGluIFBlcmwuCgpUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCB3aGVuIGRlY29kaW5nIEpTT04gdGV4dHMuCgo9aGVhZDIgYWxsb3dfbm9ucmVmCgogICAgJGpzb24gPSAkanNvbi0+YWxsb3dfbm9ucmVmKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2FsbG93X25vbnJlZgoKSWYgQzwkZW5hYmxlPiBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiB0aGUgQzxlbmNvZGU+IG1ldGhvZCBjYW4gY29udmVydCBhCm5vbi1yZWZlcmVuY2UgaW50byBpdHMgY29ycmVzcG9uZGluZyBzdHJpbmcsIG51bWJlciBvciBudWxsIEpTT04gdmFsdWUsCndoaWNoIGlzIGFuIGV4dGVuc2lvbiB0byBSRkM0NjI3LiBMaWtld2lzZSwgQzxkZWNvZGU+IHdpbGwgYWNjZXB0IHRob3NlIEpTT04KdmFsdWVzIGluc3RlYWQgb2YgY3JvYWtpbmcuCgpJZiBDPCRlbmFibGU+IGlzIGZhbHNlLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgY3JvYWsgaWYgaXQgaXNuJ3QKcGFzc2VkIGFuIGFycmF5cmVmIG9yIGhhc2hyZWYsIGFzIEpTT04gdGV4dHMgbXVzdCBlaXRoZXIgYmUgYW4gb2JqZWN0Cm9yIGFycmF5LiBMaWtld2lzZSwgQzxkZWNvZGU+IHdpbGwgY3JvYWsgaWYgZ2l2ZW4gc29tZXRoaW5nIHRoYXQgaXMgbm90IGEKSlNPTiBvYmplY3Qgb3IgYXJyYXkuCgogICBKU09OLT5uZXctPmFsbG93X25vbnJlZi0+ZW5jb2RlICgiSGVsbG8sIFdvcmxkISIpCiAgID0+ICJIZWxsbywgV29ybGQhIgoKPWhlYWQyIGFsbG93X3Vua25vd24KCiAgICAkanNvbiA9ICRqc29uLT5hbGxvd191bmtub3duIChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9hbGxvd191bmtub3duCgpJZiAkZW5hYmxlIGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuICJlbmNvZGUiIHdpbGwgKm5vdCogdGhyb3cgYW4KZXhjZXB0aW9uIHdoZW4gaXQgZW5jb3VudGVycyB2YWx1ZXMgaXQgY2Fubm90IHJlcHJlc2VudCBpbiBKU09OIChmb3IKZXhhbXBsZSwgZmlsZWhhbmRsZXMpIGJ1dCBpbnN0ZWFkIHdpbGwgZW5jb2RlIGEgSlNPTiAibnVsbCIgdmFsdWUuCk5vdGUgdGhhdCBibGVzc2VkIG9iamVjdHMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIGFuZCBhcmUgaGFuZGxlZApzZXBhcmF0ZWx5IGJ5IGM8YWxsb3dfbm9ucmVmPi4KCklmICRlbmFibGUgaXMgZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlbiAiZW5jb2RlIiB3aWxsIHRocm93IGFuCmV4Y2VwdGlvbiB3aGVuIGl0IGVuY291bnRlcnMgYW55dGhpbmcgaXQgY2Fubm90IGVuY29kZSBhcyBKU09OLgoKVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0ICJkZWNvZGUiIGluIGFueSB3YXksIGFuZCBpdCBpcwpyZWNvbW1lbmRlZCB0byBsZWF2ZSBpdCBvZmYgdW5sZXNzIHlvdSBrbm93IHlvdXIgY29tbXVuaWNhdGlvbnMKcGFydG5lci4KCj1oZWFkMiBhbGxvd19ibGVzc2VkCgogICAgJGpzb24gPSAkanNvbi0+YWxsb3dfYmxlc3NlZChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9hbGxvd19ibGVzc2VkCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBDPGVuY29kZT4gbWV0aG9kIHdpbGwgbm90CmJhcmYgd2hlbiBpdCBlbmNvdW50ZXJzIGEgYmxlc3NlZCByZWZlcmVuY2UuIEluc3RlYWQsIHRoZSB2YWx1ZSBvZiB0aGUKQjxjb252ZXJ0X2JsZXNzZWQ+IG9wdGlvbiB3aWxsIGRlY2lkZSB3aGV0aGVyIEM8bnVsbD4gKEM8Y29udmVydF9ibGVzc2VkPgpkaXNhYmxlZCBvciBubyBDPFRPX0pTT04+IG1ldGhvZCBmb3VuZCkgb3IgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUKb2JqZWN0IChDPGNvbnZlcnRfYmxlc3NlZD4gZW5hYmxlZCBhbmQgQzxUT19KU09OPiBtZXRob2QgZm91bmQpIGlzIGJlaW5nCmVuY29kZWQuIEhhcyBubyBlZmZlY3Qgb24gQzxkZWNvZGU+LgoKSWYgQzwkZW5hYmxlPiBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGVuIEM8ZW5jb2RlPiB3aWxsIHRocm93IGFuCmV4Y2VwdGlvbiB3aGVuIGl0IGVuY291bnRlcnMgYSBibGVzc2VkIG9iamVjdC4KCgo9aGVhZDIgY29udmVydF9ibGVzc2VkCgogICAgJGpzb24gPSAkanNvbi0+Y29udmVydF9ibGVzc2VkKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2NvbnZlcnRfYmxlc3NlZAoKSWYgQzwkZW5hYmxlPiBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiBDPGVuY29kZT4sIHVwb24gZW5jb3VudGVyaW5nIGEKYmxlc3NlZCBvYmplY3QsIHdpbGwgY2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIEM8VE9fSlNPTj4gbWV0aG9kCm9uIHRoZSBvYmplY3QncyBjbGFzcy4gSWYgZm91bmQsIGl0IHdpbGwgYmUgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0CmFuZCB0aGUgcmVzdWx0aW5nIHNjYWxhciB3aWxsIGJlIGVuY29kZWQgaW5zdGVhZCBvZiB0aGUgb2JqZWN0LiBJZiBubwpDPFRPX0pTT04+IG1ldGhvZCBpcyBmb3VuZCwgdGhlIHZhbHVlIG9mIEM8YWxsb3dfYmxlc3NlZD4gd2lsbCBkZWNpZGUgd2hhdAp0byBkby4KClRoZSBDPFRPX0pTT04+IG1ldGhvZCBtYXkgc2FmZWx5IGNhbGwgZGllIGlmIGl0IHdhbnRzLiBJZiBDPFRPX0pTT04+CnJldHVybnMgb3RoZXIgYmxlc3NlZCBvYmplY3RzLCB0aG9zZSB3aWxsIGJlIGhhbmRsZWQgaW4gdGhlIHNhbWUKd2F5LiBDPFRPX0pTT04+IG11c3QgdGFrZSBjYXJlIG9mIG5vdCBjYXVzaW5nIGFuIGVuZGxlc3MgcmVjdXJzaW9uIGN5Y2xlCig9PSBjcmFzaCkgaW4gdGhpcyBjYXNlLiBUaGUgbmFtZSBvZiBDPFRPX0pTT04+IHdhcyBjaG9zZW4gYmVjYXVzZSBvdGhlcgptZXRob2RzIGNhbGxlZCBieSB0aGUgUGVybCBjb3JlICg9PSBub3QgYnkgdGhlIHVzZXIgb2YgdGhlIG9iamVjdCkgYXJlCnVzdWFsbHkgaW4gdXBwZXIgY2FzZSBsZXR0ZXJzIGFuZCB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggdGhlIEM8dG9fanNvbj4KZnVuY3Rpb24gb3IgbWV0aG9kLgoKVGhpcyBzZXR0aW5nIGRvZXMgbm90IHlldCBpbmZsdWVuY2UgQzxkZWNvZGU+IGluIGFueSB3YXkuCgpJZiBDPCRlbmFibGU+IGlzIGZhbHNlLCB0aGVuIHRoZSBDPGFsbG93X2JsZXNzZWQ+IHNldHRpbmcgd2lsbCBkZWNpZGUgd2hhdAp0byBkbyB3aGVuIGEgYmxlc3NlZCBvYmplY3QgaXMgZm91bmQuCgo9b3ZlcgoKPWl0ZW0gY29udmVydF9ibGVzc2VkX3VuaXZlcnNhbGx5IG1vZGUKCklmIHVzZSBDPEpTT04+IHdpdGggQzwtY29udmVydF9ibGVzc2VkX3VuaXZlcnNhbGx5PiwgdGhlIEM8VU5JVkVSU0FMOjpUT19KU09OPgpzdWJyb3V0aW5lIGlzIGRlZmluZWQgYXMgdGhlIGJlbG93IGNvZGU6CgogICAqVU5JVkVSU0FMOjpUT19KU09OID0gc3ViIHsKICAgICAgIG15ICRiX29iaiA9IEI6OnN2cmVmXzJvYmplY3QoICRfWzBdICk7CiAgICAgICByZXR1cm4gICAgJGJfb2JqLT5pc2EoJ0I6OkhWJykgPyB7ICV7ICRfWzBdIH0gfQogICAgICAgICAgICAgICA6ICRiX29iai0+aXNhKCdCOjpBVicpID8gWyBAeyAkX1swXSB9IF0KICAgICAgICAgICAgICAgOiB1bmRlZgogICAgICAgICAgICAgICA7CiAgIH0KClRoaXMgd2lsbCBjYXVzZSB0aGF0IEM8ZW5jb2RlPiBtZXRob2QgY29udmVydHMgc2ltcGxlIGJsZXNzZWQgb2JqZWN0cyBpbnRvCkpTT04gb2JqZWN0cyBhcyBub24tYmxlc3NlZCBvYmplY3QuCgogICBKU09OIC1jb252ZXJ0X2JsZXNzZWRfdW5pdmVyc2FsbHk7CiAgICRqc29uLT5hbGxvd19ibGVzc2VkLT5jb252ZXJ0X2JsZXNzZWQtPmVuY29kZSggJGJsZXNzZWRfb2JqZWN0ICkKClRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCgo9YmFjawoKPWhlYWQyIGZpbHRlcl9qc29uX29iamVjdAoKICAgICRqc29uID0gJGpzb24tPmZpbHRlcl9qc29uX29iamVjdChbJGNvZGVyZWZdKQoKV2hlbiBDPCRjb2RlcmVmPiBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgY2FsbGVkIGZyb20gQzxkZWNvZGU+IGVhY2gKdGltZSBpdCBkZWNvZGVzIGEgSlNPTiBvYmplY3QuIFRoZSBvbmx5IGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgY29kZXJlZgppcyBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHktY3JlYXRlZCBoYXNoLiBJZiB0aGUgY29kZSByZWZlcmVuY2VzIHJldHVybnMKYSBzaW5nbGUgc2NhbGFyICh3aGljaCBuZWVkIG5vdCBiZSBhIHJlZmVyZW5jZSksIHRoaXMgdmFsdWUKKGkuZS4gYSBjb3B5IG9mIHRoYXQgc2NhbGFyIHRvIGF2b2lkIGFsaWFzaW5nKSBpcyBpbnNlcnRlZCBpbnRvIHRoZQpkZXNlcmlhbGlzZWQgZGF0YSBzdHJ1Y3R1cmUuIElmIGl0IHJldHVybnMgYW4gZW1wdHkgbGlzdAooTk9URTogSTxub3Q+IEM8dW5kZWY+LCB3aGljaCBpcyBhIHZhbGlkIHNjYWxhciksIHRoZSBvcmlnaW5hbCBkZXNlcmlhbGlzZWQKaGFzaCB3aWxsIGJlIGluc2VydGVkLiBUaGlzIHNldHRpbmcgY2FuIHNsb3cgZG93biBkZWNvZGluZyBjb25zaWRlcmFibHkuCgpXaGVuIEM8JGNvZGVyZWY+IGlzIG9taXR0ZWQgb3IgdW5kZWZpbmVkLCBhbnkgZXhpc3RpbmcgY2FsbGJhY2sgd2lsbApiZSByZW1vdmVkIGFuZCBDPGRlY29kZT4gd2lsbCBub3QgY2hhbmdlIHRoZSBkZXNlcmlhbGlzZWQgaGFzaCBpbiBhbnkKd2F5LgoKRXhhbXBsZSwgY29udmVydCBhbGwgSlNPTiBvYmplY3RzIGludG8gdGhlIGludGVnZXIgNToKCiAgIG15ICRqcyA9IEpTT04tPm5ldy0+ZmlsdGVyX2pzb25fb2JqZWN0IChzdWIgeyA1IH0pOwogICAjIHJldHVybnMgWzVdCiAgICRqcy0+ZGVjb2RlICgnW3t9XScpOyAjIHRoZSBnaXZlbiBzdWJyb3V0aW5lIHRha2VzIGEgaGFzaCByZWZlcmVuY2UuCiAgICMgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2UgYWxsb3dfbm9ucmVmIGlzIG5vdCBlbmFibGVkCiAgICMgc28gYSBsb25lIDUgaXMgbm90IGFsbG93ZWQuCiAgICRqcy0+ZGVjb2RlICgneyJhIjoxLCAiYiI6Mn0nKTsKCgo9aGVhZDIgZmlsdGVyX2pzb25fc2luZ2xlX2tleV9vYmplY3QKCiAgICAkanNvbiA9ICRqc29uLT5maWx0ZXJfanNvbl9zaW5nbGVfa2V5X29iamVjdCgka2V5IFs9PiAkY29kZXJlZl0pCgpXb3JrcyByZW1vdGVseSBzaW1pbGFyIHRvIEM8ZmlsdGVyX2pzb25fb2JqZWN0PiwgYnV0IGlzIG9ubHkgY2FsbGVkIGZvcgpKU09OIG9iamVjdHMgaGF2aW5nIGEgc2luZ2xlIGtleSBuYW1lZCBDPCRrZXk+LgoKVGhpcyBDPCRjb2RlcmVmPiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBvbmUgc3BlY2lmaWVkIHZpYQpDPGZpbHRlcl9qc29uX29iamVjdD4sIGlmIGFueS4gSXQgZ2V0cyBwYXNzZWQgdGhlIHNpbmdsZSB2YWx1ZSBpbiB0aGUgSlNPTgpvYmplY3QuIElmIGl0IHJldHVybnMgYSBzaW5nbGUgdmFsdWUsIGl0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YQpzdHJ1Y3R1cmUuIElmIGl0IHJldHVybnMgbm90aGluZyAobm90IGV2ZW4gQzx1bmRlZj4gYnV0IHRoZSBlbXB0eSBsaXN0KSwKdGhlIGNhbGxiYWNrIGZyb20gQzxmaWx0ZXJfanNvbl9vYmplY3Q+IHdpbGwgYmUgY2FsbGVkIG5leHQsIGFzIGlmIG5vCnNpbmdsZS1rZXkgY2FsbGJhY2sgd2VyZSBzcGVjaWZpZWQuCgpJZiBDPCRjb2RlcmVmPiBpcyBvbWl0dGVkIG9yIHVuZGVmaW5lZCwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgd2lsbCBiZQpkaXNhYmxlZC4gVGhlcmUgY2FuIG9ubHkgZXZlciBiZSBvbmUgY2FsbGJhY2sgZm9yIGEgZ2l2ZW4ga2V5LgoKQXMgdGhpcyBjYWxsYmFjayBnZXRzIGNhbGxlZCBsZXNzIG9mdGVuIHRoZW4gdGhlIEM8ZmlsdGVyX2pzb25fb2JqZWN0PgpvbmUsIGRlY29kaW5nIHNwZWVkIHdpbGwgbm90IHVzdWFsbHkgc3VmZmVyIGFzIG11Y2guIFRoZXJlZm9yZSwgc2luZ2xlLWtleQpvYmplY3RzIG1ha2UgZXhjZWxsZW50IHRhcmdldHMgdG8gc2VyaWFsaXNlIFBlcmwgb2JqZWN0cyBpbnRvLCBlc3BlY2lhbGx5CmFzIHNpbmdsZS1rZXkgSlNPTiBvYmplY3RzIGFyZSBhcyBjbG9zZSB0byB0aGUgdHlwZS10YWdnZWQgdmFsdWUgY29uY2VwdAphcyBKU09OIGdldHMgKGl0J3MgYmFzaWNhbGx5IGFuIElEL1ZBTFVFIHR1cGxlKS4gT2YgY291cnNlLCBKU09OIGRvZXMgbm90CnN1cHBvcnQgdGhpcyBpbiBhbnkgd2F5LCBzbyB5b3UgbmVlZCB0byBtYWtlIHN1cmUgeW91ciBkYXRhIG5ldmVyIGxvb2tzCmxpa2UgYSBzZXJpYWxpc2VkIFBlcmwgaGFzaC4KClR5cGljYWwgbmFtZXMgZm9yIHRoZSBzaW5nbGUgb2JqZWN0IGtleSBhcmUgQzxfX2NsYXNzX3doYXRldmVyX18+LCBvcgpDPCRfX2RvbGxhcnNfYXJlX3JhcmVseV91c2VkX18kPiBvciBDPH11Z2x5X2JyYWNlX3BsYWNlbWVudD4sIG9yIGV2ZW4KdGhpbmdzIGxpa2UgQzxfX2NsYXNzX21kNXN1bShjbGFzc25hbWUpX18+LCB0byByZWR1Y2UgdGhlIHJpc2sgb2YgY2xhc2hpbmcKd2l0aCByZWFsIGhhc2hlcy4KCkV4YW1wbGUsIGRlY29kZSBKU09OIG9iamVjdHMgb2YgdGhlIGZvcm0gQzw8IHsgIl9fd2lkZ2V0X18iID0+IDxpZD4gfSA+PgppbnRvIHRoZSBjb3JyZXNwb25kaW5nIEM8PCAkV0lER0VUezxpZD59ID4+IG9iamVjdDoKCiAgICMgcmV0dXJuIHdoYXRldmVyIGlzIGluICRXSURHRVR7NX06CiAgIEpTT04KICAgICAgLT5uZXcKICAgICAgLT5maWx0ZXJfanNvbl9zaW5nbGVfa2V5X29iamVjdCAoX193aWRnZXRfXyA9PiBzdWIgewogICAgICAgICAgICAkV0lER0VUeyAkX1swXSB9CiAgICAgICAgIH0pCiAgICAgIC0+ZGVjb2RlICgneyJfX3dpZGdldF9fIjogNScpCgogICAjIHRoaXMgY2FuIGJlIHVzZWQgd2l0aCBhIFRPX0pTT04gbWV0aG9kIGluIHNvbWUgIndpZGdldCIgY2xhc3MKICAgIyBmb3Igc2VyaWFsaXNhdGlvbiB0byBqc29uOgogICBzdWIgV2lkZ2V0QmFzZTo6VE9fSlNPTiB7CiAgICAgIG15ICgkc2VsZikgPSBAXzsKCiAgICAgIHVubGVzcyAoJHNlbGYtPntpZH0pIHsKICAgICAgICAgJHNlbGYtPntpZH0gPSAuLmdldC4uc29tZS4uaWQuLjsKICAgICAgICAgJFdJREdFVHskc2VsZi0+e2lkfX0gPSAkc2VsZjsKICAgICAgfQoKICAgICAgeyBfX3dpZGdldF9fID0+ICRzZWxmLT57aWR9IH0KICAgfQoKCj1oZWFkMiBzaHJpbmsKCiAgICAkanNvbiA9ICRqc29uLT5zaHJpbmsoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfc2hyaW5rCgpXaXRoIEpTT046OlhTLCB0aGlzIGZsYWcgcmVzaXplcyBzdHJpbmdzIGdlbmVyYXRlZCBieSBlaXRoZXIKQzxlbmNvZGU+IG9yIEM8ZGVjb2RlPiB0byB0aGVpciBtaW5pbXVtIHNpemUgcG9zc2libGUuIFRoaXMgY2FuIHNhdmUKbWVtb3J5IHdoZW4geW91ciBKU09OIHRleHRzIGFyZSBlaXRoZXIgdmVyeSB2ZXJ5IGxvbmcgb3IgeW91IGhhdmUgbWFueQpzaG9ydCBzdHJpbmdzLiBJdCB3aWxsIGFsc28gdHJ5IHRvIGRvd25ncmFkZSBhbnkgc3RyaW5ncyB0byBvY3RldC1mb3JtCmlmIHBvc3NpYmxlOiBwZXJsIHN0b3JlcyBzdHJpbmdzIGludGVybmFsbHkgZWl0aGVyIGluIGFuIGVuY29kaW5nIGNhbGxlZApVVEYtWCBvciBpbiBvY3RldC1mb3JtLiBUaGUgbGF0dGVyIGNhbm5vdCBzdG9yZSBldmVyeXRoaW5nIGJ1dCB1c2VzIGxlc3MKc3BhY2UgaW4gZ2VuZXJhbCAoYW5kIHNvbWUgYnVnZ3kgUGVybCBvciBDIGNvZGUgbWlnaHQgZXZlbiByZWx5IG9uIHRoYXQKaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYmVpbmcgdXNlZCkuCgpXaXRoIEpTT046OlBQLCBpdCBpcyBub29wIGFib3V0IHJlc2l6aW5nIHN0cmluZ3MgYnV0IHRyaWVzCkM8dXRmODo6ZG93bmdyYWRlPiB0byB0aGUgcmV0dXJuZWQgc3RyaW5nIGJ5IEM8ZW5jb2RlPi4gU2VlIHRvIEw8dXRmOD4uCgpTZWUgdG8gTDxKU09OOjpYUy9PQkpFQ1QtT1JJRU5URUQgSU5URVJGQUNFPiBhbmQgTDxKU09OOjpQUC9NRVRIT0RTPi4KCj1oZWFkMiBtYXhfZGVwdGgKCiAgICAkanNvbiA9ICRqc29uLT5tYXhfZGVwdGgoWyRtYXhpbXVtX25lc3RpbmdfZGVwdGhdKQogICAgCiAgICAkbWF4X2RlcHRoID0gJGpzb24tPmdldF9tYXhfZGVwdGgKClNldHMgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCAoZGVmYXVsdCBDPDUxMj4pIGFjY2VwdGVkIHdoaWxlIGVuY29kaW5nCm9yIGRlY29kaW5nLiBJZiBhIGhpZ2hlciBuZXN0aW5nIGxldmVsIGlzIGRldGVjdGVkIGluIEpTT04gdGV4dCBvciBhIFBlcmwKZGF0YSBzdHJ1Y3R1cmUsIHRoZW4gdGhlIGVuY29kZXIgYW5kIGRlY29kZXIgd2lsbCBzdG9wIGFuZCBjcm9hayBhdCB0aGF0CnBvaW50LgoKTmVzdGluZyBsZXZlbCBpcyBkZWZpbmVkIGJ5IG51bWJlciBvZiBoYXNoLSBvciBhcnJheXJlZnMgdGhhdCB0aGUgZW5jb2RlcgpuZWVkcyB0byB0cmF2ZXJzZSB0byByZWFjaCBhIGdpdmVuIHBvaW50IG9yIHRoZSBudW1iZXIgb2YgQzx7PiBvciBDPFs+CmNoYXJhY3RlcnMgd2l0aG91dCB0aGVpciBtYXRjaGluZyBjbG9zaW5nIHBhcmVudGhlc2lzIGNyb3NzZWQgdG8gcmVhY2ggYQpnaXZlbiBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcuCgpJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGhpZ2hlc3QgcG9zc2libGUgc2V0dGluZyB3aWxsIGJlIHVzZWQsIHdoaWNoCmlzIHJhcmVseSB1c2VmdWwuCgpOb3RlIHRoYXQgbmVzdGluZyBpcyBpbXBsZW1lbnRlZCBieSByZWN1cnNpb24gaW4gQy4gVGhlIGRlZmF1bHQgdmFsdWUgaGFzCmJlZW4gY2hvc2VuIHRvIGJlIGFzIGxhcmdlIGFzIHR5cGljYWwgb3BlcmF0aW5nIHN5c3RlbXMgYWxsb3cgd2l0aG91dApjcmFzaGluZy4gKEpTT046OlhTKQoKV2l0aCBKU09OOjpQUCBhcyB0aGUgYmFja2VuZCwgd2hlbiBhIGxhcmdlIHZhbHVlICgxMDAgb3IgbW9yZSkgd2FzIHNldCBhbmQKaXQgZGUvZW5jb2RlcyBhIGRlZXAgbmVzdGVkIG9iamVjdC90ZXh0LCBpdCBtYXkgcmFpc2UgYSB3YXJuaW5nCidEZWVwIHJlY3Vyc2lvbiBvbiBzdWJyb3V0aW4nIGF0IHRoZSBwZXJsIHJ1bnRpbWUgcGhhc2UuCgpTZWUgTDxKU09OOjpYUy9TRUNVUklUWSBDT05TSURFUkFUSU9OUz4gZm9yIG1vcmUgaW5mbyBvbiB3aHkgdGhpcyBpcyB1c2VmdWwuCgo9aGVhZDIgbWF4X3NpemUKCiAgICAkanNvbiA9ICRqc29uLT5tYXhfc2l6ZShbJG1heGltdW1fc3RyaW5nX3NpemVdKQogICAgCiAgICAkbWF4X3NpemUgPSAkanNvbi0+Z2V0X21heF9zaXplCgpTZXQgdGhlIG1heGltdW0gbGVuZ3RoIGEgSlNPTiB0ZXh0IG1heSBoYXZlIChpbiBieXRlcykgd2hlcmUgZGVjb2RpbmcgaXMKYmVpbmcgYXR0ZW1wdGVkLiBUaGUgZGVmYXVsdCBpcyBDPDA+LCBtZWFuaW5nIG5vIGxpbWl0LiBXaGVuIEM8ZGVjb2RlPgppcyBjYWxsZWQgb24gYSBzdHJpbmcgdGhhdCBpcyBsb25nZXIgdGhlbiB0aGlzIG1hbnkgYnl0ZXMsIGl0IHdpbGwgbm90CmF0dGVtcHQgdG8gZGVjb2RlIHRoZSBzdHJpbmcgYnV0IHRocm93IGFuIGV4Y2VwdGlvbi4gVGhpcyBzZXR0aW5nIGhhcyBubwplZmZlY3Qgb24gQzxlbmNvZGU+ICh5ZXQpLgoKSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBsaW1pdCBjaGVjayB3aWxsIGJlIGRlYWN0aXZhdGVkIChzYW1lIGFzIHdoZW4KQzwwPiBpcyBzcGVjaWZpZWQpLgoKU2VlIEw8SlNPTjo6WFMvU0VDVVJJVFkgQ09OU0lERVJBVElPTlM+LCBiZWxvdywgZm9yIG1vcmUgaW5mbyBvbiB3aHkgdGhpcyBpcyB1c2VmdWwuCgo9aGVhZDIgZW5jb2RlCgogICAgJGpzb25fdGV4dCA9ICRqc29uLT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKQ29udmVydHMgdGhlIGdpdmVuIFBlcmwgZGF0YSBzdHJ1Y3R1cmUgKGEgc2ltcGxlIHNjYWxhciBvciBhIHJlZmVyZW5jZQp0byBhIGhhc2ggb3IgYXJyYXkpIHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBTaW1wbGUgc2NhbGFycyB3aWxsIGJlCmNvbnZlcnRlZCBpbnRvIEpTT04gc3RyaW5nIG9yIG51bWJlciBzZXF1ZW5jZXMsIHdoaWxlIHJlZmVyZW5jZXMgdG8gYXJyYXlzCmJlY29tZSBKU09OIGFycmF5cyBhbmQgcmVmZXJlbmNlcyB0byBoYXNoZXMgYmVjb21lIEpTT04gb2JqZWN0cy4gVW5kZWZpbmVkClBlcmwgdmFsdWVzIChlLmcuIEM8dW5kZWY+KSBiZWNvbWUgSlNPTiBDPG51bGw+IHZhbHVlcy4KUmVmZXJlbmNlcyB0byB0aGUgaW50ZWdlcnMgQzwwPiBhbmQgQzwxPiBhcmUgY29udmVydGVkIGludG8gQzx0cnVlPiBhbmQgQzxmYWxzZT4uCgo9aGVhZDIgZGVjb2RlCgogICAgJHBlcmxfc2NhbGFyID0gJGpzb24tPmRlY29kZSgkanNvbl90ZXh0KQoKVGhlIG9wcG9zaXRlIG9mIEM8ZW5jb2RlPjogZXhwZWN0cyBhIEpTT04gdGV4dCBhbmQgdHJpZXMgdG8gcGFyc2UgaXQsCnJldHVybmluZyB0aGUgcmVzdWx0aW5nIHNpbXBsZSBzY2FsYXIgb3IgcmVmZXJlbmNlLiBDcm9ha3Mgb24gZXJyb3IuCgpKU09OIG51bWJlcnMgYW5kIHN0cmluZ3MgYmVjb21lIHNpbXBsZSBQZXJsIHNjYWxhcnMuIEpTT04gYXJyYXlzIGJlY29tZQpQZXJsIGFycmF5cmVmcyBhbmQgSlNPTiBvYmplY3RzIGJlY29tZSBQZXJsIGhhc2hyZWZzLiBDPHRydWU+IGJlY29tZXMKQzwxPiAoQzxKU09OOjp0cnVlPiksIEM8ZmFsc2U+IGJlY29tZXMgQzwwPiAoQzxKU09OOjpmYWxzZT4pIGFuZApDPG51bGw+IGJlY29tZXMgQzx1bmRlZj4uCgo9aGVhZDIgZGVjb2RlX3ByZWZpeAoKICAgICgkcGVybF9zY2FsYXIsICRjaGFyYWN0ZXJzKSA9ICRqc29uLT5kZWNvZGVfcHJlZml4KCRqc29uX3RleHQpCgpUaGlzIHdvcmtzIGxpa2UgdGhlIEM8ZGVjb2RlPiBtZXRob2QsIGJ1dCBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uCndoZW4gdGhlcmUgaXMgdHJhaWxpbmcgZ2FyYmFnZSBhZnRlciB0aGUgZmlyc3QgSlNPTiBvYmplY3QsIGl0IHdpbGwKc2lsZW50bHkgc3RvcCBwYXJzaW5nIHRoZXJlIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkCnNvIGZhci4KCiAgIEpTT04tPm5ldy0+ZGVjb2RlX3ByZWZpeCAoIlsxXSB0aGUgdGFpbCIpCiAgID0+IChbXSwgMykKClNlZSB0byBMPEpTT046OlhTL09CSkVDVC1PUklFTlRFRCBJTlRFUkZBQ0U+Cgo9aGVhZDIgcHJvcGVydHkKCiAgICAkYm9vbGVhbiA9ICRqc29uLT5wcm9wZXJ0eSgkcHJvcGVydHlfbmFtZSkKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGFib3V0IGFib3ZlIHNvbWUgcHJvcGVydGllcy4KClRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBhcmUgQzxhc2NpaT4sIEM8bGF0aW4xPiwgQzx1dGY4PiwKQzxpbmRlbnQ+LEM8c3BhY2VfYmVmb3JlPiwgQzxzcGFjZV9hZnRlcj4sIEM8cmVsYXhlZD4sIEM8Y2Fub25pY2FsPiwKQzxhbGxvd19ub25yZWY+LCBDPGFsbG93X3Vua25vd24+LCBDPGFsbG93X2JsZXNzZWQ+LCBDPGNvbnZlcnRfYmxlc3NlZD4sCkM8c2hyaW5rPiwgQzxtYXhfZGVwdGg+IGFuZCBDPG1heF9zaXplPi4KCiAgICRib29sZWFuID0gJGpzb24tPnByb3BlcnR5KCd1dGY4Jyk7CiAgICA9PiAwCiAgICRqc29uLT51dGY4OwogICAkYm9vbGVhbiA9ICRqc29uLT5wcm9wZXJ0eSgndXRmOCcpOwogICAgPT4gMQoKU2V0cyB0aGUgcHJvcGVydHkgd2l0aCBhIGdpdmVuIGJvb2xlYW4gdmFsdWUuCgogICAgJGpzb24gPSAkanNvbi0+cHJvcGVydHkoJHByb3BlcnR5X25hbWUgPT4gJGJvb2xlYW4pOwoKV2l0aCBubyBhcmd1bW50LCBpdCByZXR1cm5zIGFsbCB0aGUgYWJvdmUgcHJvcGVydGllcyBhcyBhIGhhc2ggcmVmZXJlbmNlLgoKICAgICRmbGFnX2hhc2hyZWYgPSAkanNvbi0+cHJvcGVydHkoKTsKCj1oZWFkMSBJTkNSRU1FTlRBTCBQQVJTSU5HCgpNb3N0IG9mIHRoaXMgc2VjdGlvbiBhcmUgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIEw8SlNPTjo6WFMvSU5DUkVNRU5UQUwgUEFSU0lORz4uCgpJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyB0aGUgbmVlZCBmb3IgaW5jcmVtZW50YWwgcGFyc2luZyBvZiBKU09OIHRleHRzLgpUaGlzIG1vZHVsZSBkb2VzIGFsbG93IHlvdSB0byBwYXJzZSBhIEpTT04gc3RyZWFtIGluY3JlbWVudGFsbHkuCkl0IGRvZXMgc28gYnkgYWNjdW11bGF0aW5nIHRleHQgdW50aWwgaXQgaGFzIGEgZnVsbCBKU09OIG9iamVjdCwgd2hpY2gKaXQgdGhlbiBjYW4gZGVjb2RlLiBUaGlzIHByb2Nlc3MgaXMgc2ltaWxhciB0byB1c2luZyBDPGRlY29kZV9wcmVmaXg+CnRvIHNlZSBpZiBhIGZ1bGwgSlNPTiBvYmplY3QgaXMgYXZhaWxhYmxlLCBidXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudAooYW5kIGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRoIGEgbWluaW11bSBvZiBtZXRob2QgY2FsbHMpLgoKVGhlIGJhY2tlbmQgbW9kdWxlIHdpbGwgb25seSBhdHRlbXB0IHRvIHBhcnNlIHRoZSBKU09OIHRleHQgb25jZSBpdCBpcyBzdXJlIGl0CmhhcyBlbm91Z2ggdGV4dCB0byBnZXQgYSBkZWNpc2l2ZSByZXN1bHQsIHVzaW5nIGEgdmVyeSBzaW1wbGUgYnV0CnRydWx5IGluY3JlbWVudGFsIHBhcnNlci4gVGhpcyBtZWFucyB0aGF0IGl0IHNvbWV0aW1lcyB3b24ndCBzdG9wIGFzCmVhcmx5IGFzIHRoZSBmdWxsIHBhcnNlciwgZm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgZGV0ZWN0IHBhcmVudGhlc2UKbWlzbWF0Y2hlcy4gVGhlIG9ubHkgdGhpbmcgaXQgZ3VhcmFudGVlcyBpcyB0aGF0IGl0IHN0YXJ0cyBkZWNvZGluZyBhcwpzb29uIGFzIGEgc3ludGFjdGljYWxseSB2YWxpZCBKU09OIHRleHQgaGFzIGJlZW4gc2Vlbi4gVGhpcyBtZWFucyB5b3UgbmVlZAp0byBzZXQgcmVzb3VyY2UgbGltaXRzIChlLmcuIEM8bWF4X3NpemU+KSB0byBlbnN1cmUgdGhlIHBhcnNlciB3aWxsIHN0b3AKcGFyc2luZyBpbiB0aGUgcHJlc2VuY2UgaWYgc3ludGF4IGVycm9ycy4KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsZW1lbnQgdGhpcyBpbmNyZW1lbnRhbCBwYXJzZXIuCgo9aGVhZDIgaW5jcl9wYXJzZQoKICAgICRqc29uLT5pbmNyX3BhcnNlKCBbJHN0cmluZ10gKSAjIHZvaWQgY29udGV4dAogICAgCiAgICAkb2JqX29yX3VuZGVmID0gJGpzb24tPmluY3JfcGFyc2UoIFskc3RyaW5nXSApICMgc2NhbGFyIGNvbnRleHQKICAgIAogICAgQG9ial9vcl9lbXB0eSA9ICRqc29uLT5pbmNyX3BhcnNlKCBbJHN0cmluZ10gKSAjIGxpc3QgY29udGV4dAoKVGhpcyBpcyB0aGUgY2VudHJhbCBwYXJzaW5nIGZ1bmN0aW9uLiBJdCBjYW4gYm90aCBhcHBlbmQgbmV3IHRleHQgYW5kCmV4dHJhY3Qgb2JqZWN0cyBmcm9tIHRoZSBzdHJlYW0gYWNjdW11bGF0ZWQgc28gZmFyIChib3RoIG9mIHRoZXNlCmZ1bmN0aW9ucyBhcmUgb3B0aW9uYWwpLgoKSWYgQzwkc3RyaW5nPiBpcyBnaXZlbiwgdGhlbiB0aGlzIHN0cmluZyBpcyBhcHBlbmRlZCB0byB0aGUgYWxyZWFkeQpleGlzdGluZyBKU09OIGZyYWdtZW50IHN0b3JlZCBpbiB0aGUgQzwkanNvbj4gb2JqZWN0LgoKQWZ0ZXIgdGhhdCwgaWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB2b2lkIGNvbnRleHQsIGl0IHdpbGwgc2ltcGx5CnJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nIGZ1cnRoZXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIG1vcmUgdGV4dAppbiBhcyBtYW55IGNodW5rcyBhcyB5b3Ugd2FudC4KCklmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0LCB0aGVuIGl0IHdpbGwgdHJ5IHRvIGV4dHJhY3QKZXhhY3RseSBJPG9uZT4gSlNPTiBvYmplY3QuIElmIHRoYXQgaXMgc3VjY2Vzc2Z1bCwgaXQgd2lsbCByZXR1cm4gdGhpcwpvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBDPHVuZGVmPi4gSWYgdGhlcmUgaXMgYSBwYXJzZSBlcnJvciwKdGhpcyBtZXRob2Qgd2lsbCBjcm9hayBqdXN0IGFzIEM8ZGVjb2RlPiB3b3VsZCBkbyAob25lIGNhbiB0aGVuIHVzZQpDPGluY3Jfc2tpcD4gdG8gc2tpcCB0aGUgZXJyb3Jub3VzIHBhcnQpLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgb2YKdXNpbmcgdGhlIG1ldGhvZC4KCkFuZCBmaW5hbGx5LCBpbiBsaXN0IGNvbnRleHQsIGl0IHdpbGwgdHJ5IHRvIGV4dHJhY3QgYXMgbWFueSBvYmplY3RzCmZyb20gdGhlIHN0cmVhbSBhcyBpdCBjYW4gZmluZCBhbmQgcmV0dXJuIHRoZW0sIG9yIHRoZSBlbXB0eSBsaXN0Cm90aGVyd2lzZS4gRm9yIHRoaXMgdG8gd29yaywgdGhlcmUgbXVzdCBiZSBubyBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIEpTT04Kb2JqZWN0cyBvciBhcnJheXMsIGluc3RlYWQgdGhleSBtdXN0IGJlIGNvbmNhdGVuYXRlZCBiYWNrLXRvLWJhY2suIElmCmFuIGVycm9yIG9jY3VycywgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGFzIGluIHRoZSBzY2FsYXIgY29udGV4dApjYXNlLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCBhbnkgcHJldmlvdXNseS1wYXJzZWQgSlNPTiB0ZXh0cyB3aWxsIGJlCmxvc3QuCgpFeGFtcGxlOiBQYXJzZSBzb21lIEpTT04gYXJyYXlzL29iamVjdHMgaW4gYSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybiB0aGVtLgoKICAgIG15IEBvYmpzID0gSlNPTi0+bmV3LT5pbmNyX3BhcnNlICgiWzVdWzddWzEsMl0iKTsKCj1oZWFkMiBpbmNyX3RleHQKCiAgICAkbHZhbHVlX3N0cmluZyA9ICRqc29uLT5pbmNyX3RleHQKClRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnRseSBzdG9yZWQgSlNPTiBmcmFnbWVudCBhcyBhbiBsdmFsdWUsIHRoYXQKaXMsIHlvdSBjYW4gbWFuaXB1bGF0ZSBpdC4gVGhpcyBJPG9ubHk+IHdvcmtzIHdoZW4gYSBwcmVjZWRpbmcgY2FsbCB0bwpDPGluY3JfcGFyc2U+IGluIEk8c2NhbGFyIGNvbnRleHQ+IHN1Y2Nlc3NmdWxseSByZXR1cm5lZCBhbiBvYmplY3QuIFVuZGVyCmFsbCBvdGhlciBjaXJjdW1zdGFuY2VzIHlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gKEkgbWVhbiBpdC4KYWx0aG91Z2ggaW4gc2ltcGxlIHRlc3RzIGl0IG1pZ2h0IGFjdHVhbGx5IHdvcmssIGl0IEk8d2lsbD4gZmFpbCB1bmRlcgpyZWFsIHdvcmxkIGNvbmRpdGlvbnMpLiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgY2FuIGFsc28gY2FsbCB0aGlzCm1ldGhvZCBiZWZvcmUgaGF2aW5nIHBhcnNlZCBhbnl0aGluZy4KClRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGluIHR3byBjYXNlczogYSkgZmluZGluZyB0aGUgdHJhaWxpbmcgdGV4dCBhZnRlciBhCkpTT04gb2JqZWN0IG9yIGIpIHBhcnNpbmcgbXVsdGlwbGUgSlNPTiBvYmplY3RzIHNlcGFyYXRlZCBieSBub24tSlNPTiB0ZXh0CihzdWNoIGFzIGNvbW1hcykuCgogICAgJGpzb24tPmluY3JfdGV4dCA9fiBzL1xzKixccyovLzsKCkluIFBlcmwgNS4wMDUsIEM8bHZhbHVlPiBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZS4KWW91IG11c3Qgd3JpdGUgY29kZXMgbGlrZSB0aGUgYmVsb3c6CgogICAgJHN0cmluZyA9ICRqc29uLT5pbmNyX3RleHQ7CiAgICAkc3RyaW5nID1+IHMvXHMqLFxzKi8vOwogICAgJGpzb24tPmluY3JfdGV4dCggJHN0cmluZyApOwoKPWhlYWQyIGluY3Jfc2tpcAoKICAgICRqc29uLT5pbmNyX3NraXAKClRoaXMgd2lsbCByZXNldCB0aGUgc3RhdGUgb2YgdGhlIGluY3JlbWVudGFsIHBhcnNlciBhbmQgd2lsbCByZW1vdmUgdGhlCnBhcnNlZCB0ZXh0IGZyb20gdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgQzxpbmNyX3BhcnNlPgpkaWVkLCBpbiB3aGljaCBjYXNlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGluY3JlbWVudGFsIHBhcnNlciBzdGF0ZSBpcyBsZWZ0CnVuY2hhbmdlZCwgdG8gc2tpcCB0aGUgdGV4dCBwYXJzZWQgc28gZmFyIGFuZCB0byByZXNldCB0aGUgcGFyc2Ugc3RhdGUuCgo9aGVhZDIgaW5jcl9yZXNldAoKICAgICRqc29uLT5pbmNyX3Jlc2V0CgpUaGlzIGNvbXBsZXRlbHkgcmVzZXRzIHRoZSBpbmNyZW1lbnRhbCBwYXJzZXIsIHRoYXQgaXMsIGFmdGVyIHRoaXMgY2FsbCwKaXQgd2lsbCBiZSBhcyBpZiB0aGUgcGFyc2VyIGhhZCBuZXZlciBwYXJzZWQgYW55dGhpbmcuCgpUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCBvdCByZXBlYXRlZGx5IHBhcnNlIEpTT04gb2JqZWN0cyBhbmQgd2FudCB0bwppZ25vcmUgYW55IHRyYWlsaW5nIGRhdGEsIHdoaWNoIG1lYW5zIHlvdSBoYXZlIHRvIHJlc2V0IHRoZSBwYXJzZXIgYWZ0ZXIKZWFjaCBzdWNjZXNzZnVsIGRlY29kZS4KClNlZSB0byBMPEpTT046OlhTL0lOQ1JFTUVOVEFMIFBBUlNJTkc+IGZvciBleGFtcGxlcy4KCgo9aGVhZDEgSlNPTjo6UFAgU1VQUE9SVCBNRVRIT0RTCgpUaGUgYmVsb3cgbWV0aG9kcyBhcmUgSlNPTjo6UFAgb3duIG1ldGhvZHMsIHNvIHdoZW4gQzxKU09OPiB3b3Jrcwp3aXRoIEpTT046OlBQIChpLmUuIHRoZSBjcmVhdGVkIG9iamVjdCBpcyBhIEpTT046OlBQIG9iamVjdCksIGF2YWlsYWJsZS4KU2VlIHRvIEw8SlNPTjo6UFAvSlNPTjo6UFAgT1dOIE1FVEhPRFM+IGluIGRldGFpbC4KCklmIHlvdSB1c2UgQzxKU09OPiB3aXRoIGFkZGl0b25hbCBDPC1zdXBwb3J0X2J5X3BwPiwgc29tZSBtZXRob2RzCmFyZSBhdmFpbGFibGUgZXZlbiB3aXRoIEpTT046OlhTLiBTZWUgdG8gTDxVU0UgUFAgRkVBVFVSRVMgRVZFTiBUSE9VR0ggWFMgQkFDS0VORD4uCgogICBCRUlORyB7ICRFTlZ7UEVSTF9KU09OX0JBQ0tFTkR9ID0gJ0pTT046OlhTJyB9CiAgIAogICB1c2UgSlNPTiAtc3VwcG9ydF9ieV9wcDsKICAgCiAgIG15ICRqc29uID0gbmV3IEpTT047CiAgICRqc29uLT5hbGxvd19ub25yZWYtPmVzY2FwZV9zbGFzaC0+ZW5jb2RlKCIvIik7CgogICAjIGZ1bmN0aW9uYWwgaW50ZXJmYWNlcyB0b28uCiAgIHByaW50IHRvX2pzb24oWyIvIl0sIHtlc2NhcGVfc2xhc2ggPT4gMX0pOwogICBwcmludCBmcm9tX2pzb24oJ1siZm9vIl0nLCB7dXRmOCA9PiAxfSk7CgpJZiB5b3UgZG8gbm90IHdhbnQgdG8gYWxsIGZ1bmN0aW9ucyBidXQgQzwtc3VwcG9ydF9ieV9wcD4sCnVzZSBDPC1ub19leHBvcnQ+LgoKICAgdXNlIEpTT04gLXN1cHBvcnRfYnlfcHAsIC1ub19leHBvcnQ7CiAgICMgZnVuY3Rpb25hbCBpbnRlcmZhY2VzIGFyZSBub3QgZXhwb3J0ZWQuCgo9aGVhZDIgYWxsb3dfc2luZ2xlcXVvdGUKCiAgICAkanNvbiA9ICRqc29uLT5hbGxvd19zaW5nbGVxdW90ZShbJGVuYWJsZV0pCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZGVjb2RlPiB3aWxsIGFjY2VwdAphbnkgSlNPTiBzdHJpbmdzIHF1b3RlZCBieSBzaW5nbGUgcXVvdGF0aW9ucyB0aGF0IGFyZSBpbnZhbGlkIEpTT04KZm9ybWF0LgoKICAgICRqc29uLT5hbGxvd19zaW5nbGVxdW90ZS0+ZGVjb2RlKHsiZm9vIjonYmFyJ30pOwogICAgJGpzb24tPmFsbG93X3NpbmdsZXF1b3RlLT5kZWNvZGUoeydmb28nOiJiYXIifSk7CiAgICAkanNvbi0+YWxsb3dfc2luZ2xlcXVvdGUtPmRlY29kZSh7J2Zvbyc6J2Jhcid9KTsKCkFzIHNhbWUgYXMgdGhlIEM8cmVsYXhlZD4gb3B0aW9uLCB0aGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBwYXJzZQphcHBsaWNhdGlvbi1zcGVjaWZpYyBmaWxlcyB3cml0dGVuIGJ5IGh1bWFucy4KCj1oZWFkMiBhbGxvd19iYXJla2V5CgogICAgJGpzb24gPSAkanNvbi0+YWxsb3dfYmFyZWtleShbJGVuYWJsZV0pCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZGVjb2RlPiB3aWxsIGFjY2VwdApiYXJlIGtleXMgb2YgSlNPTiBvYmplY3QgdGhhdCBhcmUgaW52YWxpZCBKU09OIGZvcm1hdC4KCkFzIHNhbWUgYXMgdGhlIEM8cmVsYXhlZD4gb3B0aW9uLCB0aGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBwYXJzZQphcHBsaWNhdGlvbi1zcGVjaWZpYyBmaWxlcyB3cml0dGVuIGJ5IGh1bWFucy4KCiAgICAkanNvbi0+YWxsb3dfYmFyZWtleS0+ZGVjb2RlKCd7Zm9vOiJiYXIifScpOwoKPWhlYWQyIGFsbG93X2JpZ251bQoKICAgICRqc29uID0gJGpzb24tPmFsbG93X2JpZ251bShbJGVuYWJsZV0pCgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZGVjb2RlPiB3aWxsIGNvbnZlcnQKdGhlIGJpZyBpbnRlZ2VyIFBlcmwgY2Fubm90IGhhbmRsZSBhcyBpbnRlZ2VyIGludG8gYSBMPE1hdGg6OkJpZ0ludD4Kb2JqZWN0IGFuZCBjb252ZXJ0IGEgZmxvYXRpbmcgbnVtYmVyIChhbnkpIGludG8gYSBMPE1hdGg6OkJpZ0Zsb2F0Pi4KCk9uIHRoZSBjb250YXJ5LCBDPGVuY29kZT4gY29udmVydHMgQzxNYXRoOjpCaWdJbnQ+IG9iamVjdHMgYW5kIEM8TWF0aDo6QmlnRmxvYXQ+Cm9iamVjdHMgaW50byBKU09OIG51bWJlcnMgd2l0aCBDPGFsbG93X2JsZXNzZWQ+IGVuYWJsZS4KCiAgICRqc29uLT5hbGxvd19ub25yZWYtPmFsbG93X2JsZXNzZWQtPmFsbG93X2JpZ251bTsKICAgJGJpZ2Zsb2F0ID0gJGpzb24tPmRlY29kZSgnMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnKTsKICAgcHJpbnQgJGpzb24tPmVuY29kZSgkYmlnZmxvYXQpOwogICAjID0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCgpTZWUgdG8gTDxNQVBQSU5HPiBhYm9vdXQgdGhlIGNvbnZlcnNpb24gb2YgSlNPTiBudW1iZXIuCgo9aGVhZDIgbG9vc2UKCiAgICAkanNvbiA9ICRqc29uLT5sb29zZShbJGVuYWJsZV0pCgpUaGUgdW5lc2NhcGVkIFtceDAwLVx4MWZceDIyXHgyZlx4NWNdIHN0cmluZ3MgYXJlIGludmFsaWQgaW4gSlNPTiBzdHJpbmdzCmFuZCB0aGUgbW9kdWxlIGRvZXNuJ3QgYWxsb3cgdG8gQzxkZWNvZGU+IHRvIHRoZXNlIChleGNlcHQgZm9yIFx4MmYpLgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZGVjb2RlPiAgd2lsbCBhY2NlcHQgdGhlc2UKdW5lc2NhcGVkIHN0cmluZ3MuCgogICAgJGpzb24tPmxvb3NlLT5kZWNvZGUocXF8WyJhYmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYiXXwpOwoKU2VlIHRvIEw8SlNPTjo6UFAvSlNPTjo6UFAgT1dOIE1FVEhPRFM+LgoKPWhlYWQyIGVzY2FwZV9zbGFzaAoKICAgICRqc29uID0gJGpzb24tPmVzY2FwZV9zbGFzaChbJGVuYWJsZV0pCgpBY2NvcmRpbmcgdG8gSlNPTiBHcmFtbWFyLCBJPHNsYXNoPiAoVSswMDJGKSBpcyBlc2NhcGVkLiBCdXQgYnkgZGVmYXVsdApKU09OIGJhY2tlbmQgbW9kdWxlcyBlbmNvZGUgc3RyaW5ncyB3aXRob3V0IGVzY2FwaW5nIHNsYXNoLgoKSWYgQzwkZW5hYmxlPiBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiBDPGVuY29kZT4gd2lsbCBlc2NhcGUgc2xhc2hlcy4KCj1oZWFkMiBpbmRlbnRfbGVuZ3RoCgogICAgJGpzb24gPSAkanNvbi0+aW5kZW50X2xlbmd0aCgkbGVuZ3RoKQoKV2l0aCBKU09OOjpYUywgVGhlIGluZGVudCBzcGFjZSBsZW5ndGggaXMgMyBhbmQgY2Fubm90IGJlIGNoYW5nZWQuCldpdGggSlNPTjo6UFAsIGl0IHNldHMgdGhlIGluZGVudCBzcGFjZSBsZW5ndGggd2l0aCB0aGUgZ2l2ZW4gJGxlbmd0aC4KVGhlIGRlZmF1bHQgaXMgMy4gVGhlIGFjY2VwdGFibGUgcmFuZ2UgaXMgMCB0byAxNS4KCj1oZWFkMiBzb3J0X2J5CgogICAgJGpzb24gPSAkanNvbi0+c29ydF9ieSgkZnVuY3Rpb25fbmFtZSkKICAgICRqc29uID0gJGpzb24tPnNvcnRfYnkoJHN1YnJvdXRpbmVfcmVmKQoKSWYgJGZ1bmN0aW9uX25hbWUgb3IgJHN1YnJvdXRpbmVfcmVmIGFyZSBzZXQsIGl0cyBzb3J0IHJvdXRpbmUgYXJlIHVzZWQuCgogICAkanMgPSAkcGMtPnNvcnRfYnkoc3ViIHsgJEpTT046OlBQOjphIGNtcCAkSlNPTjo6UFA6OmIgfSktPmVuY29kZSgkb2JqKTsKICAgIyBpcygkanMsIHF8eyJhIjoxLCJiIjoyLCJjIjozLCJkIjo0LCJlIjo1LCJmIjo2LCJnIjo3LCJoIjo4LCJpIjo5fXwpOwoKICAgJGpzID0gJHBjLT5zb3J0X2J5KCdvd25fc29ydCcpLT5lbmNvZGUoJG9iaik7CiAgICMgaXMoJGpzLCBxfHsiYSI6MSwiYiI6MiwiYyI6MywiZCI6NCwiZSI6NSwiZiI6NiwiZyI6NywiaCI6OCwiaSI6OX18KTsKCiAgIHN1YiBKU09OOjpQUDo6b3duX3NvcnQgeyAkSlNPTjo6UFA6OmEgY21wICRKU09OOjpQUDo6YiB9CgpBcyB0aGUgc29ydGluZyByb3V0aW5lIHJ1bnMgaW4gdGhlIEpTT046OlBQIHNjb3BlLCB0aGUgZ2l2ZW4Kc3Vicm91dGluZSBuYW1lIGFuZCB0aGUgc3BlY2lhbCB2YXJpYWJsZXMgQzwkYT4sIEM8JGI+IHdpbGwgYmVnaW4Kd2l0aCAnSlNPTjo6UFA6OicuCgpJZiAkaW50ZWdlciBpcyBzZXQsIHRoZW4gdGhlIGVmZmVjdCBpcyBzYW1lIGFzIEM8Y2Fub25pY2FsPiBvbi4KClNlZSB0byBMPEpTT046OlBQL0pTT046OlBQIE9XTiBNRVRIT0RTPi4KCj1oZWFkMSBNQVBQSU5HCgpUaGlzIHNlY3Rpb24gaXMgY29waWVkIGZyb20gSlNPTjo6WFMgYW5kIG1vZGlmaWVkIHRvIEM8SlNPTj4uCkpTT046OlhTIGFuZCBKU09OOjpQUCBtYXBwaW5nIG1lY2hhbmlzbXMgYXJlIGFsbW9zdCBlcXVpdmFsZW50LgoKU2VlIHRvIEw8SlNPTjo6WFMvTUFQUElORz4uCgo9aGVhZDIgSlNPTiAtPiBQRVJMCgo9b3ZlciA0Cgo9aXRlbSBvYmplY3QKCkEgSlNPTiBvYmplY3QgYmVjb21lcyBhIHJlZmVyZW5jZSB0byBhIGhhc2ggaW4gUGVybC4gTm8gb3JkZXJpbmcgb2Ygb2JqZWN0CmtleXMgaXMgcHJlc2VydmVkIChKU09OIGRvZXMgbm90IHByZXNlcnZlciBvYmplY3Qga2V5IG9yZGVyaW5nIGl0c2VsZikuCgo9aXRlbSBhcnJheQoKQSBKU09OIGFycmF5IGJlY29tZXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgaW4gUGVybC4KCj1pdGVtIHN0cmluZwoKQSBKU09OIHN0cmluZyBiZWNvbWVzIGEgc3RyaW5nIHNjYWxhciBpbiBQZXJsIC0gVW5pY29kZSBjb2RlcG9pbnRzIGluIEpTT04KYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIGNvZGVwb2ludHMgaW4gdGhlIFBlcmwgc3RyaW5nLCBzbyBubyBtYW51YWwKZGVjb2RpbmcgaXMgbmVjZXNzYXJ5LgoKPWl0ZW0gbnVtYmVyCgpBIEpTT04gbnVtYmVyIGJlY29tZXMgZWl0aGVyIGFuIGludGVnZXIsIG51bWVyaWMgKGZsb2F0aW5nIHBvaW50KSBvcgpzdHJpbmcgc2NhbGFyIGluIHBlcmwsIGRlcGVuZGluZyBvbiBpdHMgcmFuZ2UgYW5kIGFueSBmcmFjdGlvbmFsIHBhcnRzLiBPbgp0aGUgUGVybCBsZXZlbCwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRob3NlIGFzIFBlcmwgaGFuZGxlcyBhbGwKdGhlIGNvbnZlcnNpb24gZGV0YWlscywgYnV0IGFuIGludGVnZXIgbWF5IHRha2Ugc2xpZ2h0bHkgbGVzcyBtZW1vcnkgYW5kCm1pZ2h0IHJlcHJlc2VudCBtb3JlIHZhbHVlcyBleGFjdGx5IHRoYW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KCklmIHRoZSBudW1iZXIgY29uc2lzdHMgb2YgZGlnaXRzIG9ubHksIEM8SlNPTj4gd2lsbCB0cnkgdG8gcmVwcmVzZW50Cml0IGFzIGFuIGludGVnZXIgdmFsdWUuIElmIHRoYXQgZmFpbHMsIGl0IHdpbGwgdHJ5IHRvIHJlcHJlc2VudCBpdCBhcwphIG51bWVyaWMgKGZsb2F0aW5nIHBvaW50KSB2YWx1ZSBpZiB0aGF0IGlzIHBvc3NpYmxlIHdpdGhvdXQgbG9zcyBvZgpwcmVjaXNpb24uIE90aGVyd2lzZSBpdCB3aWxsIHByZXNlcnZlIHRoZSBudW1iZXIgYXMgYSBzdHJpbmcgdmFsdWUgKGluCndoaWNoIGNhc2UgeW91IGxvc2Ugcm91bmR0cmlwcGluZyBhYmlsaXR5LCBhcyB0aGUgSlNPTiBudW1iZXIgd2lsbCBiZQpyZS1lbmNvZGVkIHRvYSBKU09OIHN0cmluZykuCgpOdW1iZXJzIGNvbnRhaW5pbmcgYSBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIHBhcnQgd2lsbCBhbHdheXMgYmUKcmVwcmVzZW50ZWQgYXMgbnVtZXJpYyAoZmxvYXRpbmcgcG9pbnQpIHZhbHVlcywgcG9zc2libHkgYXQgYSBsb3NzIG9mCnByZWNpc2lvbiAoaW4gd2hpY2ggY2FzZSB5b3UgbWlnaHQgbG9zZSBwZXJmZWN0IHJvdW5kdHJpcHBpbmcgYWJpbGl0eSwgYnV0CnRoZSBKU09OIG51bWJlciB3aWxsIHN0aWxsIGJlIHJlLWVuY29kZWQgYXMgYSBKU09OIG51bWJlcikuCgpOb3RlIHRoYXQgcHJlY2lzaW9uIGlzIG5vdCBhY2N1cmFjeSAtIGJpbmFyeSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgY2Fubm90CnJlcHJlc2VudCBtb3N0IGRlY2ltYWwgZnJhY3Rpb25zIGV4YWN0bHksIGFuZCB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhbmQgdG8KZmxvYXRpbmcgcG9pbnQsIEM8SlNPTj4gb25seSBndWFyYW50ZWVzIHByZWNpc2lvbiB1cCB0byBidXQgbm90IGluY2x1ZGluZwp0aGUgbGVhdHMgc2lnbmlmaWNhbnQgYml0LgoKSWYgdGhlIGJhY2tlbmQgaXMgSlNPTjo6UFAgYW5kIEM8YWxsb3dfYmlnbnVtPiBpcyBlbmFibGUsIHRoZSBiaWcgaW50ZWdlcnMgCmFuZCB0aGUgbnVtZXJpYyBjYW4gYmUgb3B0aW9uYWxseSBjb252ZXJ0ZWQgaW50byBMPE1hdGg6OkJpZ0ludD4gYW5kCkw8TWF0aDo6QmlnRmxvYXQ+IG9iamVjdHMuCgo9aXRlbSB0cnVlLCBmYWxzZQoKVGhlc2UgSlNPTiBhdG9tcyBiZWNvbWUgQzxKU09OOjp0cnVlPiBhbmQgQzxKU09OOjpmYWxzZT4sCnJlc3BlY3RpdmVseS4gVGhleSBhcmUgb3ZlcmxvYWRlZCB0byBhY3QgYWxtb3N0IGV4YWN0bHkgbGlrZSB0aGUgbnVtYmVycwpDPDE+IGFuZCBDPDA+LiBZb3UgY2FuIGNoZWNrIHdldGhlciBhIHNjYWxhciBpcyBhIEpTT04gYm9vbGVhbiBieSB1c2luZwp0aGUgQzxKU09OOjppc19ib29sPiBmdW5jdGlvbi4KCklmIEM8SlNPTjo6dHJ1ZT4gYW5kIEM8SlNPTjo6ZmFsc2U+IGFyZSB1c2VkIGFzIHN0cmluZ3Mgb3IgY29tcGFyZWQgYXMgc3RyaW5ncywKdGhleSByZXByZXNlbnQgYXMgQzx0cnVlPiBhbmQgQzxmYWxzZT4gcmVzcGVjdGl2ZWx5LgoKICAgcHJpbnQgSlNPTjo6dHJ1ZSAuICJcbiI7CiAgICA9PiB0cnVlCiAgIHByaW50IEpTT046OnRydWUgKyAxOwogICAgPT4gMQoKICAgb2soSlNPTjo6dHJ1ZSBlcSAndHJ1ZScpOwogICBvayhKU09OOjp0cnVlIGVxICAnMScpOwogICBvayhKU09OOjp0cnVlID09IDEpOwoKQzxKU09OPiB3aWxsIGluc3RhbGwgdGhlc2UgbWlzc2luZyBvdmVybG9hZGluZyBmZWF0dXJlcyB0byB0aGUgYmFja2VuZCBtb2R1bGVzLgoKCj1pdGVtIG51bGwKCkEgSlNPTiBudWxsIGF0b20gYmVjb21lcyBDPHVuZGVmPiBpbiBQZXJsLgoKQzxKU09OOjpudWxsPiByZXR1cm5zIEM8dW5kZGVmPi4KCj1iYWNrCgoKPWhlYWQyIFBFUkwgLT4gSlNPTgoKVGhlIG1hcHBpbmcgZnJvbSBQZXJsIHRvIEpTT04gaXMgc2xpZ2h0bHkgbW9yZSBkaWZmaWN1bHQsIGFzIFBlcmwgaXMgYQp0cnVseSB0eXBlbGVzcyBsYW5ndWFnZSwgc28gd2UgY2FuIG9ubHkgZ3Vlc3Mgd2hpY2ggSlNPTiB0eXBlIGlzIG1lYW50IGJ5CmEgUGVybCB2YWx1ZS4KCj1vdmVyIDQKCj1pdGVtIGhhc2ggcmVmZXJlbmNlcwoKUGVybCBoYXNoIHJlZmVyZW5jZXMgYmVjb21lIEpTT04gb2JqZWN0cy4gQXMgdGhlcmUgaXMgbm8gaW5oZXJlbnQgb3JkZXJpbmcKaW4gaGFzaCBrZXlzIChvciBKU09OIG9iamVjdHMpLCB0aGV5IHdpbGwgdXN1YWxseSBiZSBlbmNvZGVkIGluIGEKcHNldWRvLXJhbmRvbSBvcmRlciB0aGF0IGNhbiBjaGFuZ2UgYmV0d2VlbiBydW5zIG9mIHRoZSBzYW1lIHByb2dyYW0gYnV0CnN0YXlzIGdlbmVyYWxseSB0aGUgc2FtZSB3aXRoaW4gYSBzaW5nbGUgcnVuIG9mIGEgcHJvZ3JhbS4gQzxKU09OPgpvcHRpb25hbGx5IHNvcnQgdGhlIGhhc2gga2V5cyAoZGV0ZXJtaW5lZCBieSB0aGUgSTxjYW5vbmljYWw+IGZsYWcpLCBzbwp0aGUgc2FtZSBkYXRhc3RydWN0dXJlIHdpbGwgc2VyaWFsaXNlIHRvIHRoZSBzYW1lIEpTT04gdGV4dCAoZ2l2ZW4gc2FtZQpzZXR0aW5ncyBhbmQgdmVyc2lvbiBvZiBKU09OOjpYUyksIGJ1dCB0aGlzIGluY3VycyBhIHJ1bnRpbWUgb3ZlcmhlYWQKYW5kIGlzIG9ubHkgcmFyZWx5IHVzZWZ1bCwgZS5nLiB3aGVuIHlvdSB3YW50IHRvIGNvbXBhcmUgc29tZSBKU09OIHRleHQKYWdhaW5zdCBhbm90aGVyIGZvciBlcXVhbGl0eS4KCkluIGZ1dHVyZSwgdGhlIG9yZGVyZWQgb2JqZWN0IGZlYXR1cmUgd2lsbCBiZSBhZGRlZCB0byBKU09OOjpQUCB1c2luZyBDPHRpZT4gbWVjaGFuaXNtLgoKCj1pdGVtIGFycmF5IHJlZmVyZW5jZXMKClBlcmwgYXJyYXkgcmVmZXJlbmNlcyBiZWNvbWUgSlNPTiBhcnJheXMuCgo9aXRlbSBvdGhlciByZWZlcmVuY2VzCgpPdGhlciB1bmJsZXNzZWQgcmVmZXJlbmNlcyBhcmUgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIGFuZCB3aWxsIGNhdXNlIGFuCmV4Y2VwdGlvbiB0byBiZSB0aHJvd24sIGV4Y2VwdCBmb3IgcmVmZXJlbmNlcyB0byB0aGUgaW50ZWdlcnMgQzwwPiBhbmQKQzwxPiwgd2hpY2ggZ2V0IHR1cm5lZCBpbnRvIEM8ZmFsc2U+IGFuZCBDPHRydWU+IGF0b21zIGluIEpTT04uIFlvdSBjYW4KYWxzbyB1c2UgQzxKU09OOjpmYWxzZT4gYW5kIEM8SlNPTjo6dHJ1ZT4gdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KCiAgIHRvX2pzb24gW1wwLEpTT046OnRydWVdICAgICAgIyB5aWVsZHMgW2ZhbHNlLHRydWVdCgo9aXRlbSBKU09OOjp0cnVlLCBKU09OOjpmYWxzZSwgSlNPTjo6bnVsbAoKVGhlc2Ugc3BlY2lhbCB2YWx1ZXMgYmVjb21lIEpTT04gdHJ1ZSBhbmQgSlNPTiBmYWxzZSB2YWx1ZXMsCnJlc3BlY3RpdmVseS4gWW91IGNhbiBhbHNvIHVzZSBDPFwxPiBhbmQgQzxcMD4gZGlyZWN0bHkgaWYgeW91IHdhbnQuCgpKU09OOjpudWxsIHJldHVybnMgQzx1bmRlZj4uCgo9aXRlbSBibGVzc2VkIG9iamVjdHMKCkJsZXNzZWQgb2JqZWN0cyBhcmUgbm90IGRpcmVjdGx5IHJlcHJlc2VudGFibGUgaW4gSlNPTi4gU2VlIHRoZQpDPGFsbG93X2JsZXNzZWQ+IGFuZCBDPGNvbnZlcnRfYmxlc3NlZD4gbWV0aG9kcyBvbiB2YXJpb3VzIG9wdGlvbnMgb24KaG93IHRvIGRlYWwgd2l0aCB0aGlzOiBiYXNpY2FsbHksIHlvdSBjYW4gY2hvb3NlIGJldHdlZW4gdGhyb3dpbmcgYW4KZXhjZXB0aW9uLCBlbmNvZGluZyB0aGUgcmVmZXJlbmNlIGFzIGlmIGl0IHdlcmVuJ3QgYmxlc3NlZCwgb3IgcHJvdmlkZQp5b3VyIG93biBzZXJpYWxpc2VyIG1ldGhvZC4KCldpdGggQzxjb252ZXJ0X2JsZXNzZWRfdW5pdmVyc2FsbHk+IG1vZGUsICBDPGVuY29kZT4gY29udmVydHMgYmxlc3NlZApoYXNoIHJlZmVyZW5jZXMgb3IgYmxlc3NlZCBhcnJheSByZWZlcmVuY2VzIChjb250YWlucyBvdGhlciBibGVzc2VkIHJlZmVyZW5jZXMpCmludG8gSlNPTiBtZW1iZXJzIGFuZCBhcnJheXMuCgogICB1c2UgSlNPTiAtY29udmVydF9ibGVzc2VkX3VuaXZlcnNhbGx5OwogICBKU09OLT5uZXctPmFsbG93X2JsZXNzZWQtPmNvbnZlcnRfYmxlc3NlZC0+ZW5jb2RlKCAkYmxlc3NlZF9vYmplY3QgKTsKClNlZSB0byBMPGNvbnZlcnRfYmxlc3NlZD4uCgo9aXRlbSBzaW1wbGUgc2NhbGFycwoKU2ltcGxlIFBlcmwgc2NhbGFycyAoYW55IHNjYWxhciB0aGF0IGlzIG5vdCBhIHJlZmVyZW5jZSkgYXJlIHRoZSBtb3N0CmRpZmZpY3VsdCBvYmplY3RzIHRvIGVuY29kZTogSlNPTjo6WFMgYW5kIEpTT046OlBQIHdpbGwgZW5jb2RlIHVuZGVmaW5lZCBzY2FsYXJzIGFzCkpTT04gQzxudWxsPiB2YWx1ZXMsIHNjYWxhcnMgdGhhdCBoYXZlIGxhc3QgYmVlbiB1c2VkIGluIGEgc3RyaW5nIGNvbnRleHQKYmVmb3JlIGVuY29kaW5nIGFzIEpTT04gc3RyaW5ncywgYW5kIGFueXRoaW5nIGVsc2UgYXMgbnVtYmVyIHZhbHVlOgoKICAgIyBkdW1wIGFzIG51bWJlcgogICBlbmNvZGVfanNvbiBbMl0gICAgICAgICAgICAgICAgICAgICAgIyB5aWVsZHMgWzJdCiAgIGVuY29kZV9qc29uIFstMy4wZTE3XSAgICAgICAgICAgICAgICAjIHlpZWxkcyBbLTNlKzE3XQogICBteSAkdmFsdWUgPSA1OyBlbmNvZGVfanNvbiBbJHZhbHVlXSAgIyB5aWVsZHMgWzVdCgogICAjIHVzZWQgYXMgc3RyaW5nLCBzbyBkdW1wIGFzIHN0cmluZwogICBwcmludCAkdmFsdWU7CiAgIGVuY29kZV9qc29uIFskdmFsdWVdICAgICAgICAgICAgICAgICAjIHlpZWxkcyBbIjUiXQoKICAgIyB1bmRlZiBiZWNvbWVzIG51bGwKICAgZW5jb2RlX2pzb24gW3VuZGVmXSAgICAgICAgICAgICAgICAgICMgeWllbGRzIFtudWxsXQoKWW91IGNhbiBmb3JjZSB0aGUgdHlwZSB0byBiZSBhIHN0cmluZyBieSBzdHJpbmdpZnlpbmcgaXQ6CgogICBteSAkeCA9IDMuMTsgIyBzb21lIHZhcmlhYmxlIGNvbnRhaW5pbmcgYSBudW1iZXIKICAgIiR4IjsgICAgICAgICMgc3RyaW5naWZpZWQKICAgJHggLj0gIiI7ICAgICMgYW5vdGhlciwgbW9yZSBhd2t3YXJkIHdheSB0byBzdHJpbmdpZnkKICAgcHJpbnQgJHg7ICAgICMgcGVybCBkb2VzIGl0IGZvciB5b3UsIHRvbywgcXVpdGUgb2Z0ZW4KCllvdSBjYW4gZm9yY2UgdGhlIHR5cGUgdG8gYmUgYSBudW1iZXIgYnkgbnVtaWZ5aW5nIGl0OgoKICAgbXkgJHggPSAiMyI7ICMgc29tZSB2YXJpYWJsZSBjb250YWluaW5nIGEgc3RyaW5nCiAgICR4ICs9IDA7ICAgICAjIG51bWlmeSBpdCwgZW5zdXJpbmcgaXQgd2lsbCBiZSBkdW1wZWQgYXMgYSBudW1iZXIKICAgJHggKj0gMTsgICAgICMgc2FtZSB0aGluZywgdGhlIGNob2lzZSBpcyB5b3Vycy4KCllvdSBjYW4gbm90IGN1cnJlbnRseSBmb3JjZSB0aGUgdHlwZSBpbiBvdGhlciwgbGVzcyBvYnNjdXJlLCB3YXlzLgoKTm90ZSB0aGF0IG51bWVyaWNhbCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdW5kZXIgUGVybCAoc28KYmluYXJ5IHRvIGRlY2ltYWwgY29udmVyc2lvbiBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIGluIFBlcmwsIHdoaWNoCmNhbiBkaWZmZXIgdG8gb3RoZXIgbGFuZ3VhZ2VzKS4gQWxzbywgeW91ciBwZXJsIGludGVycHJldGVyIG1pZ2h0IGV4cG9zZQpleHRlbnNpb25zIHRvIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9mIHlvdXIgcGxhdGZvcm0sIHN1Y2ggYXMKaW5maW5pdGllcyBvciBOYU4ncyAtIHRoZXNlIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OLCBhbmQgaXQgaXMgYW4KZXJyb3IgdG8gcGFzcyB0aG9zZSBpbi4KCj1pdGVtIEJpZyBOdW1iZXIKCklmIHRoZSBiYWNrZW5kIGlzIEpTT046OlBQIGFuZCBDPGFsbG93X2JpZ251bT4gaXMgZW5hYmxlLCAKQzxlbmNvZGU+IGNvbnZlcnRzIEM8TWF0aDo6QmlnSW50PiBvYmplY3RzIGFuZCBDPE1hdGg6OkJpZ0Zsb2F0PgpvYmplY3RzIGludG8gSlNPTiBudW1iZXJzLgoKCj1iYWNrCgo9aGVhZDEgSlNPTiBhbmQgRUNNQXNjcmlwdAoKU2VlIHRvIEw8SlNPTjo6WFMvSlNPTiBhbmQgRUNNQXNjcmlwdD4uCgo9aGVhZDEgSlNPTiBhbmQgWUFNTAoKSlNPTiBpcyBub3QgYSBzdWJzZXQgb2YgWUFNTC4KU2VlIHRvIEw8SlNPTjo6WFMvSlNPTiBhbmQgWUFNTD4uCgoKPWhlYWQxIEJBQ0tFTkQgTU9EVUxFIERFQ0lTSU9OCgpXaGVuIHlvdSB1c2UgQzxKU09OPiwgQzxKU09OPiB0cmllcyB0byBDPHVzZT4gSlNPTjo6WFMuIElmIHRoaXMgY2FsbCBmYWlsZWQsIGl0IHdpbGwKQzx1c2VzPiBKU09OOjpQUC4gVGhlIHJlcXVpcmVkIEpTT046OlhTIHZlcnNpb24gaXMgSTwyLjI+IG9yIGxhdGVyLgoKVGhlIEM8SlNPTj4gY29uc3RydWN0b3IgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGluaGVyaXRlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZHVsZSwKYW5kIEpTT046OlhTIG9iamVjdCBpcyBhIGJsZXNzZWQgc2NhbGVyIHJlZmVyZW5jZSB3aGlsZSBKU09OOjpQUCBpcyBhIGJsZXNzZWQgaGFzaApyZWZlcmVuY2UuCgpTbywgeW91ciBwcm9ncmFtIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSBiYWNrZW5kIG1vZHVsZSwgZXNwZWNpYWxseQpyZXR1cm5lZCBvYmplY3RzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCgogbXkgJGpzb24gPSBKU09OLT5uZXc7ICMgWFMgb3IgUFA/CiAkanNvbi0+e3N0YXNofSA9ICd0aGlzIGlzIHhzIG9iamVjdCc7ICMgdGhpcyBjb2RlIG1heSByYWlzZSBhbiBlcnJvciEKClRvIGNoZWNrIHRoZSBiYWNrZW5kIG1vZHVsZSwgdGhlcmUgYXJlIHNvbWUgbWV0aG9kcyAtIEM8YmFja2VuZD4sIEM8aXNfcHA+IGFuZCBDPGlzX3hzPi4KCiAgSlNPTi0+YmFja2VuZDsgIyAnSlNPTjo6WFMnIG9yICdKU09OOjpQUCcKICAKICBKU09OLT5iYWNrZW5kLT5pc19wcDogIyAwIG9yIDEKICAKICBKU09OLT5iYWNrZW5kLT5pc194czogIyAxIG9yIDAKICAKICAkanNvbi0+aXNfeHM7ICMgMSBvciAwCiAgCiAgJGpzb24tPmlzX3BwOyAjIDAgb3IgMQoKCklmIHlvdSBzZXQgYW4gZW52aW9ybm1lbnQgdmFyaWFibGUgQzxQRVJMX0pTT05fQkFDS0VORD4sIFRoZSBjYWxsaW5nIGFjdGlvbiB3aWxsIGJlIGNoYW5nZWQuCgo9b3ZlcgoKPWl0ZW0gUEVSTF9KU09OX0JBQ0tFTkQgPSAwIG9yIFBFUkxfSlNPTl9CQUNLRU5EID0gJ0pTT046OlBQJwoKQWx3YXlzIHVzZSBKU09OOjpQUAoKPWl0ZW0gUEVSTF9KU09OX0JBQ0tFTkQgPT0gMSBvciBQRVJMX0pTT05fQkFDS0VORCA9ICdKU09OOjpYUyxKU09OOjpQUCcKCihUaGUgZGVmYXVsdCkgVXNlIGNvbXBpbGVkIEpTT046OlhTIGlmIGl0IGlzIHByb3Blcmx5IGNvbXBpbGVkICYgaW5zdGFsbGVkLApvdGhlcndpc2UgdXNlIEpTT046OlBQLgoKPWl0ZW0gUEVSTF9KU09OX0JBQ0tFTkQgPT0gMiBvciBQRVJMX0pTT05fQkFDS0VORCA9ICdKU09OOjpYUycKCkFsd2F5cyB1c2UgY29tcGlsZWQgSlNPTjo6WFMsIGRpZSBpZiBpdCBpc24ndCBwcm9wZXJseSBjb21waWxlZCAmIGluc3RhbGxlZC4KCj1iYWNrCgpUaGVzZSBpZGVhcyBjb21lIGZyb20gTDxEQkk6OlB1cmVQZXJsPiBtZWNoYW5pc20uCgpleGFtcGxlOgoKIEJFR0lOIHsgJEVOVntQRVJMX0pTT05fQkFDS0VORH0gPSAnSlNPTjo6UFAnIH0KIHVzZSBKU09OOyAjIGFsd2F5cyB1c2VzIEpTT046OlBQCgpJbiBmdXR1cmUsIGl0IG1heSBiZSBhYmxlIHRvIHNwZWNpZnkgYW5vdGhlciBtb2R1bGUuCgo9aGVhZDEgVVNFIFBQIEZFQVRVUkVTIEVWRU4gVEhPVUdIIFhTIEJBQ0tFTkQKCk1hbnkgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHdpdGggZWl0aGVyIEpTT046OlhTIG9yIEpTT046OlBQIGFuZAp3aGVuIHRoZSBiYWNrZW5kIG1vZHVsZSBpcyBKU09OOjpYUywgaWYgYW55IEpTT046OlBQIHNwZWNpZmljIChpLmUuIEpTT046OlhTIHVuc3Bwb3J0ZWQpCm1ldGhvZCBpcyBjYWxsZWQsIGl0IHdpbGwgQzx3YXJuPiBhbmQgYmUgbm9vcC4KCkJ1dCBJZiB5b3UgQzx1c2U+IEM8SlNPTj4gcGFzc2luZyB0aGUgb3B0aW9uYWwgc3RyaW5nIEM8LXN1cHBvcnRfYnlfcHA+LAppdCBtYWtlcyBhIHBhcnQgb2YgdGhvc2UgdW51cHBvcnRlZCBtZXRob2RzIGF2YWlsYWJsZS4KVGhpcyBmZWF0dXJlIGlzIGFjaGlldmVkIGJ5IHVzaW5nIEpTT046OlBQIGluIEM8ZGUvZW5jb2RlPi4KCiAgIEJFR0lOIHsgJEVOVntQRVJMX0pTT05fQkFDS0VORH0gPSAyIH0gIyB3aXRoIEpTT046OlhTCiAgIHVzZSBKU09OIC1zdXBwb3J0X2J5X3BwOwogICBteSAkanNvbiA9IG5ldyBKU09OOwogICAkanNvbi0+YWxsb3dfbm9ucmVmLT5lc2NhcGVfc2xhc2gtPmVuY29kZSgiLyIpOwoKQXQgdGhpcyB0aW1lLCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGEgQzxKU09OOjpCYWNrZW5kOjpYUzo6U3VwcG9ydGFibGU+Cm9iamVjdCAocmUtYmxlc3NlZCBYUyBvYmplY3QpLCBhbmQgIGJ5IGNoZWNraW5nIEpTT046OlhTIHVuc3VwcG9ydGVkIGZsYWdzCmluIGRlL2VuY29kaW5nLCBjYW4gc3VwcG9ydCBzb21lIHVuc3VwcG9ydGVkIG1ldGhvZHMgLSBDPGxvb3NlPiwgQzxhbGxvd19iaWdudW0+LApDPGFsbG93X2JhcmVrZXk+LCBDPGFsbG93X3NpbmdsZXF1b3RlPiwgQzxlc2NhcGVfc2xhc2g+IGFuZCBDPGluZGVudF9sZW5ndGg+LgoKV2hlbiBhbnkgdW5zdXBwb3J0ZWQgbWV0aG9kcyBhcmUgbm90IGVuYWJsZSwgQzxYUyBkZS9lbmNvZGU+IHdpbGwgYmUKdXNlZCBhcyBpcy4gVGhlIHN3aXRjaCBpcyBhY2hpZXZlZCBieSBjaGFuZ2luZyB0aGUgc3ltYm9saWMgdGFibGVzLgoKQzwtc3VwcG9ydF9ieV9wcD4gaXMgZWZmZWN0aXZlIG9ubHkgd2hlbiB0aGUgYmFja2VuZCBtb2R1bGUgaXMgSlNPTjo6WFMKYW5kIGl0IG1ha2VzIHRoZSBkZS9lbmNvZGluZyBzcGVlZCBkb3duIGEgYml0LgoKU2VlIHRvIEw8SlNPTjo6UFAgU1VQUE9SVCBNRVRIT0RTPi4KCj1oZWFkMSBJTkNPTVBBVElCTEUgQ0hBTkdFUyBUTyBPTEQgVkVSU0lPTgoKVGhlcmUgYXJlIGJpZyBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiBuZXcgdmVyc2lvbiAoMi4wMCkgYW5kIG9sZCAoMS54eCkuCklmIHlvdSB1c2Ugb2xkIEM8SlNPTj4gMS54eCBpbiB5b3VyIGNvZGUsIHBsZWFzZSBjaGVjayBpdC4KClNlZSB0byBMPFRyYW5zaXRpb24gd2F5cyBmcm9tIDEueHggdG8gMi54eC4+Cgo9b3ZlcgoKPWl0ZW0ganNvblRvT2JqIGFuZCBvYmpUb0pzb24gYXJlIG9ic29sZXRlZC4KCk5vbiBQZXJsLXN0eWxlIG5hbWUgQzxqc29uVG9PYmo+IGFuZCBDPG9ialRvSnNvbj4gYXJlIG9ic29sZXRlZAooYnV0IG5vdCB5ZXQgZGVsZXRlZCBmcm9tIHRoZSBzb3VyY2UpLgpJZiB5b3UgdXNlIHRoZXNlIGZ1bmN0aW9ucyBpbiB5b3VyIGNvZGUsIHBsZWFzZSByZXBsYWNlIHRoZW0Kd2l0aCBDPGZyb21fanNvbj4gYW5kIEM8dG9fanNvbj4uCgoKPWl0ZW0gR2xvYmFsIHZhcmlhYmxlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KCkM8SlNPTj4gY2xhc3MgdmFyaWFibGVzIC0gQzwkSlNPTjo6QVVUT0NPTlZFUlQ+LCBDPCRKU09OOjpCYXJlS2V5PiwgZXRjLi4uCi0gYXJlIG5vdCBhdmFpbGFibGUgYW55IGxvbmdlci4KSW5zdGVhZCwgdmFyaW91cyBmZWF0dXJlcyBjYW4gYmUgdXNlZCB0aHJvdWdoIG9iamVjdCBtZXRob2RzLgoKCj1pdGVtIFBhY2thZ2UgSlNPTjo6Q29udmVydGVyIGFuZCBKU09OOjpQYXJzZXIgYXJlIGRlbGV0ZWQuCgpOb3cgQzxKU09OPiBidW5kbGVzIHdpdGggSlNPTjo6UFAgd2hpY2ggY2FuIGhhbmRsZSBKU09OIG1vcmUgcHJvcGVybHkgdGhhbiB0aGVtLgoKPWl0ZW0gUGFja2FnZSBKU09OOjpOb3RTdHJpbmcgaXMgZGVsZXRlZC4KClRoZXJlIHdhcyBDPEpTT046Ok5vdFN0cmluZz4gY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBKU09OIHZhbHVlIEM8dHJ1ZT4sIEM8ZmFsc2U+LCBDPG51bGw+CmFuZCBudW1iZXJzLiBJdCB3YXMgZGVsZXRlZCBhbmQgcmVwbGFjZWQgYnkgQzxKU09OOjpCb29sZWFuPi4KCkM8SlNPTjo6Qm9vbGVhbj4gcmVwcmVzZW50cyBDPHRydWU+IGFuZCBDPGZhbHNlPi4KCkM8SlNPTjo6Qm9vbGVhbj4gZG9lcyBub3QgcmVwcmVzZW50IEM8bnVsbD4uCgpDPEpTT046Om51bGw+IHJldHVybnMgQzx1bmRlZj4uCgpDPEpTT04+IG1ha2VzIEw8SlNPTjo6WFM6OkJvb2xlYW4+IGFuZCBMPEpTT046OlBQOjpCb29sZWFuPiBpcy1hIHJlbGF0aW9uCnRvIEw8SlNPTjo6Qm9vbGVhbj4uCgo9aXRlbSBmdW5jdGlvbiBKU09OOjpOdW1iZXIgaXMgb2Jzb2xldGVkLgoKQzxKU09OOjpOdW1iZXI+IGlzIG5vdyBuZWVkbGVzcyBiZWNhdXNlIEpTT046OlhTIGFuZCBKU09OOjpQUCBoYXZlCnJvdW5kLXRyaXAgaW50ZWdyaXR5LgoKPWl0ZW0gSlNPTlJQQyBtb2R1bGVzIGFyZSBkZWxldGVkLgoKUGVybCBpbXBsZW1lbnRhdGlvbiBvZiBKU09OLVJQQyBwcm90b2NvbCAtIEM8SlNPTlJQQyA+LCBDPEpTT05SUEM6OlRyYW5zcG9ydDo6SFRUUD4KYW5kIEM8QXBhY2hlOjpKU09OUlBDID4gYXJlIGRlbGV0ZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCkluc3RlYWQgb2YgdGhlbSwgdGhlcmUgaXMgTDxKU09OOjpSUEM+IHdoaWNoIHN1cHBvcnRzIEpTT04tUlBDIHByb3RvY29sIHZlcnNpb24gMS4xLgoKPWJhY2sKCj1oZWFkMiBUcmFuc2l0aW9uIHdheXMgZnJvbSAxLnh4IHRvIDIueHguCgpZb3Ugc2hvdWxkIHNldCBDPHN1cG9ydF9ieV9wcD4gbW9kZSBmaXJzdGx5LCBiZWNhdXNlCml0IGlzIGFsd2F5cyBzdWNjZXNzZnVsIGZvciB0aGUgYmVsb3cgY29kZXMgZXZlbiB3aXRoIEpTT046OlhTLgoKICAgIHVzZSBKU09OIC1zdXBwb3J0X2J5X3BwOwoKPW92ZXIKCj1pdGVtIEV4cG9ydGVkIGpzb25Ub09iaiAoc2ltcGxlKQoKICBmcm9tX2pzb24oJGpzb25fdGV4dCk7Cgo9aXRlbSBFeHBvcnRlZCBvYmpUb0pzb24gKHNpbXBsZSkKCiAgdG9fanNvbigkcGVybF9zY2FsYXIpOwoKPWl0ZW0gRXhwb3J0ZWQganNvblRvT2JqIChhZHZhbmNlZCkKCiAgJGZsYWdzID0ge2FsbG93X2JhcmVrZXkgPT4gMSwgYWxsb3dfc2luZ2xlcXVvdGUgPT4gMX07CiAgZnJvbV9qc29uKCRqc29uX3RleHQsICRmbGFncyk7CgplcXVpdmFsZW50IHRvOgoKICAkSlNPTjo6QmFyZUtleSA9IDE7CiAgJEpTT046OlF1b3RBcG9zID0gMTsKICBqc29uVG9PYmooJGpzb25fdGV4dCk7Cgo9aXRlbSBFeHBvcnRlZCBvYmpUb0pzb24gKGFkdmFuY2VkKQoKICAkZmxhZ3MgPSB7YWxsb3dfYmxlc3NlZCA9PiAxLCBhbGxvd19iYXJla2V5ID0+IDF9OwogIHRvX2pzb24oJHBlcmxfc2NhbGFyLCAkZmxhZ3MpOwoKZXF1aXZhbGVudCB0bzoKCiAgJEpTT046OkJhcmVLZXkgPSAxOwogIG9ialRvSnNvbigkcGVybF9zY2FsYXIpOwoKPWl0ZW0ganNvblRvT2JqIGFzIG9iamVjdCBtZXRob2QKCiAgJGpzb24tPmRlY29kZSgkanNvbl90ZXh0KTsKCj1pdGVtIG9ialRvSnNvbiBhcyBvYmplY3QgbWV0aG9kCgogICRqc29uLT5lbmNvZGUoJHBlcmxfc2NhbGFyKTsKCj1pdGVtIG5ldyBtZXRob2Qgd2l0aCBwYXJhbWV0ZXJzCgpUaGUgQzxuZXc+IG1ldGhvZCBpbiAyLnggdGFrZXMgYW55IHBhcmFtZXRlcnMgbm8gbG9uZ2VyLgpZb3UgY2FuIHNldCBwYXJhbWV0ZXJzIGluc3RlYWQ7CgogICAkanNvbiA9IEpTT04tPm5ldy0+cHJldHR5OwoKPWl0ZW0gJEpTT046OlByZXR0eSwgJEpTT046OkluZGVudCwgJEpTT046OkRlbGltaXRlcgoKSWYgQzxpbmRlbnQ+IGlzIGVuYWJsZSwgdGhhdCBtZW5hcyBDPCRKU09OOjpQcmV0dHk+IGZsYWcgc2V0LiBBbmQKQzwkSlNPTjo6RGVsaW1pdGVyPiB3YXMgc3Vic3RpdHV0ZWQgYnkgQzxzcGFjZV9iZWZvcmU+IGFuZCBDPHNwYWNlX2FmdGVyPi4KSW4gY29uY2x1c2lvbjoKCiAgICRqc29uLT5pbmRlbnQtPnNwYWNlX2JlZm9yZS0+c3BhY2VfYWZ0ZXI7CgpFcXVpdmFsZW50IHRvOgoKICAkanNvbi0+cHJldHR5OwoKVG8gY2hhbmdlIGluZGVudCBsZW5ndGgsIHVzZSBDPGluZGVudF9sZW5ndGg+LgoKKE9ubHkgd2l0aCBKU09OOjpQUCwgaWYgQzwtc3VwcG9ydF9ieV9wcD4gaXMgbm90IHVzZWQuKQoKICAkanNvbi0+cHJldHR5LT5pbmRlbnRfbGVuZ3RoKDIpLT5lbmNvZGUoJHBlcmxfc2NhbGFyKTsKCj1pdGVtICRKU09OOjpCYXJlS2V5CgooT25seSB3aXRoIEpTT046OlBQLCBpZiBDPC1zdXBwb3J0X2J5X3BwPiBpcyBub3QgdXNlZC4pCgogICRqc29uLT5hbGxvd19iYXJla2V5LT5kZWNvZGUoJGpzb25fdGV4dCkKCj1pdGVtICRKU09OOjpDb252Qmxlc3NlZAoKdXNlIEM8LWNvbnZlcnRfYmxlc3NlZF91bml2ZXJzYWxseT4uIFNlZSB0byBMPGNvbnZlcnRfYmxlc3NlZD4uCgo9aXRlbSAkSlNPTjo6UXVvdEFwb3MKCihPbmx5IHdpdGggSlNPTjo6UFAsIGlmIEM8LXN1cHBvcnRfYnlfcHA+IGlzIG5vdCB1c2VkLikKCiAgJGpzb24tPmFsbG93X3NpbmdsZXF1b3RlLT5kZWNvZGUoJGpzb25fdGV4dCkKCj1pdGVtICRKU09OOjpTaW5nbGVRdW90ZQoKRGlzYWJsZS4gQzxKU09OPiBkb2VzIG5vdCBtYWtlIHN1Y2ggYSBpbnZhbGlkIEpTT04gc3RyaW5nIGFueSBsb25nZXIuCgo9aXRlbSAkSlNPTjo6S2V5U29ydAoKICAkanNvbi0+Y2Fub25pY2FsLT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKVGhpcyBpcyB0aGUgYXNjaWkgc29ydC4KCklmIHlvdSB3YW50IHRvIHVzZSB3aXRoIHlvdXIgb3duIHNvcnQgcm91dGluZSwgY2hlY2sgdGhlIEM8c29ydF9ieT4gbWV0aG9kLgoKKE9ubHkgd2l0aCBKU09OOjpQUCwgZXZlbiBpZiBDPC1zdXBwb3J0X2J5X3BwPiBpcyB1c2VkIGN1cnJlbnRseS4pCgogICRqc29uLT5zb3J0X2J5KCRzb3J0X3JvdXRpbmVfcmVmKS0+ZW5jb2RlKCRwZXJsX3NjYWxhcikKIAogICRqc29uLT5zb3J0X2J5KHN1YiB7ICRKU09OOjpQUDo6YSA8PT4gJEpTT046OlBQOjpiIH0pLT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKQ2FuJ3QgYWNjZXNzIEM8JGE+IGFuZCBDPCRiPiBidXQgQzwkSlNPTjo6UFA6OmE+IGFuZCBDPCRKU09OOjpQUDo6Yj4uCgo9aXRlbSAkSlNPTjo6U2tpcEludmFsaWQKCiAgJGpzb24tPmFsbG93X3Vua25vd24KCj1pdGVtICRKU09OOjpBVVRPQ09OVkVSVAoKTmVlZGxlc3MuIEM8SlNPTj4gYmFja2VuZCBtb2R1bGVzIGhhdmUgdGhlIHJvdW5kLXRyaXAgaW50ZWdyaXR5LgoKPWl0ZW0gJEpTT046OlVURjgKCk5lZWRsZXNzIGJlY2F1c2UgQzxKU09OPiAoSlNPTjo6WFMvSlNPTjo6UFApIHNldHMKdGhlIFVURjggZmxhZyBvbiBwcm9wZXJseS4KCiAgICAjIFdpdGggVVRGOC1mbGFnZ2VkIHN0cmluZ3MKCiAgICAkanNvbi0+YWxsb3dfbm9ucmVmOwogICAgJHN0ciA9IGNocigxMDAwKTsgIyBVVEY4LWZsYWdnZWQKCiAgICAkanNvbl90ZXh0ICA9ICRqc29uLT51dGY4KDApLT5lbmNvZGUoJHN0cik7CiAgICB1dGY4Ojppc191dGY4KCRqc29uX3RleHQpOwogICAgIyB0cnVlCiAgICAkanNvbl90ZXh0ICA9ICRqc29uLT51dGY4KDEpLT5lbmNvZGUoJHN0cik7CiAgICB1dGY4Ojppc191dGY4KCRqc29uX3RleHQpOwogICAgIyBmYWxzZQoKICAgICRzdHIgPSAnIicgLiBjaHIoMTAwMCkgLiAnIic7ICMgVVRGOC1mbGFnZ2VkCgogICAgJHBlcmxfc2NhbGFyICA9ICRqc29uLT51dGY4KDApLT5kZWNvZGUoJHN0cik7CiAgICB1dGY4Ojppc191dGY4KCRwZXJsX3NjYWxhcik7CiAgICAjIHRydWUKICAgICRwZXJsX3NjYWxhciAgPSAkanNvbi0+dXRmOCgxKS0+ZGVjb2RlKCRzdHIpOwogICAgIyBkaWVkIGJlY2F1c2Ugb2YgJ1dpZGUgY2hhcmFjdGVyIGluIHN1YnJvdXRpbmUnCgpTZWUgdG8gTDxKU09OOjpYUy9BIEZFVyBOT1RFUyBPTiBVTklDT0RFIEFORCBQRVJMPi4KCj1pdGVtICRKU09OOjpVbk1hcHBpbmcKCkRpc2FibGUuIFNlZSB0byBMPE1BUFBJTkc+LgoKPWl0ZW0gJEpTT046OlNlbGZDb252ZXJ0CgpUaGlzIG9wdGlvbiB3YXMgZGVsZXRlZC4KSW5zdGVhZCBvZiBpdCwgaWYgYSBnaXZpZW4gYmxlc3NlZCBvYmplY3QgaGFzIHRoZSBDPFRPX0pTT04+IG1ldGhvZCwKQzxUT19KU09OPiB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggQzxjb252ZXJ0X2JsZXNzZWQ+LgoKICAkanNvbi0+Y29udmVydF9ibGVzc2VkLT5lbmNvZGUoJGJsZWVzZWRfaGFzaHJlZl9vcl9hcnJheXJlZikKICAjIGlmIG5lZWQsIGNhbGwgYWxsb3dfYmxlc3NlZAoKTm90ZSB0aGF0IGl0IHdhcyBDPHRvSnNvbj4gaW4gb2xkIHZlcnNpb24sIGJ1dCBub3cgbm90IEM8dG9Kc29uPiBidXQgQzxUT19KU09OPi4KCj1iYWNrCgo9aGVhZDEgVE9ETwoKPW92ZXIKCj1pdGVtIGV4YW1wbGUgcHJvZ3JhbXMKCj1iYWNrCgo9aGVhZDEgVEhSRUFEUwoKTm8gdGVzdCB3aXRoIEpTT046OlBQLiBJZiB3aXRoIEpTT046OlhTLCBTZWUgdG8gTDxKU09OOjpYUy9USFJFQURTPi4KCgo9aGVhZDEgQlVHUwoKUGxlYXNlIHJlcG9ydCBidWdzIHJlbGV2YW50IHRvIEM8SlNPTj4gdG8gRTxsdD5tYWthbWFrYVthdF1jcGFuLm9yZ0U8Z3Q+LgoKCj1oZWFkMSBTRUUgQUxTTwoKTW9zdCBvZiB0aGUgZG9jdW1lbnQgaXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIEpTT046OlhTIGRvYy4KCkw8SlNPTjo6WFM+LCBMPEpTT046OlBQPgoKQzxSRkM0NjI3PihMPGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0PikKCj1oZWFkMSBBVVRIT1IKCk1ha2FtYWthIEhhbm55YWhhcmFtaXR1LCBFPGx0Pm1ha2FtYWthW2F0XWNwYW4ub3JnRTxndD4KCkpTT046OlhTIHdhcyB3cml0dGVuIGJ5ICBNYXJjIExlaG1hbm4gPHNjaG1vcnBbYXRdc2NobW9ycC5kZT4KClRoZSByZWxlc2Ugb2YgdGhpcyBuZXcgdmVyc2lvbiBvd2VzIHRvIHRoZSBjb3VydGVzeSBvZiBNYXJjIExlaG1hbm4uCgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKQ29weXJpZ2h0IDIwMDUtMjAxMCBieSBNYWthbWFrYSBIYW5ueWFoYXJhbWl0dQoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIAoKPWN1dAoK
cGFja2FnZSBKU09OOjpQUDsKCiMgSlNPTi0yLjAKCnVzZSA1LjAwNTsKdXNlIHN0cmljdDsKdXNlIGJhc2UgcXcoRXhwb3J0ZXIpOwp1c2Ugb3ZlcmxvYWQ7Cgp1c2UgQ2FycCAoKTsKdXNlIEIgKCk7CiN1c2UgRGV2ZWw6OlBlZWs7CgokSlNPTjo6UFA6OlZFUlNJT04gPSAnMi4yNzAwMyc7CgpASlNPTjo6UFA6OkVYUE9SVCA9IHF3KGVuY29kZV9qc29uIGRlY29kZV9qc29uIGZyb21fanNvbiB0b19qc29uKTsKCiMgaW5zdGVhZCBvZiBoYXNoLWFjY2VzcywgaSB0cmllZCBpbmRleC1hY2Nlc3MgZm9yIHNwZWVkLgojIGJ1dCB0aGlzIG1ldGhvZCBpcyBub3QgZmFzdGVyIHRoYW4gd2hhdCBpIGV4cGVjdGVkLiBzbyBpdCB3aWxsIGJlIGNoYW5nZWQuCgp1c2UgY29uc3RhbnQgUF9BU0NJSSAgICAgICAgICAgICAgICA9PiAwOwp1c2UgY29uc3RhbnQgUF9MQVRJTjEgICAgICAgICAgICAgICA9PiAxOwp1c2UgY29uc3RhbnQgUF9VVEY4ICAgICAgICAgICAgICAgICA9PiAyOwp1c2UgY29uc3RhbnQgUF9JTkRFTlQgICAgICAgICAgICAgICA9PiAzOwp1c2UgY29uc3RhbnQgUF9DQU5PTklDQUwgICAgICAgICAgICA9PiA0Owp1c2UgY29uc3RhbnQgUF9TUEFDRV9CRUZPUkUgICAgICAgICA9PiA1Owp1c2UgY29uc3RhbnQgUF9TUEFDRV9BRlRFUiAgICAgICAgICA9PiA2Owp1c2UgY29uc3RhbnQgUF9BTExPV19OT05SRUYgICAgICAgICA9PiA3Owp1c2UgY29uc3RhbnQgUF9TSFJJTksgICAgICAgICAgICAgICA9PiA4Owp1c2UgY29uc3RhbnQgUF9BTExPV19CTEVTU0VEICAgICAgICA9PiA5Owp1c2UgY29uc3RhbnQgUF9DT05WRVJUX0JMRVNTRUQgICAgICA9PiAxMDsKdXNlIGNvbnN0YW50IFBfUkVMQVhFRCAgICAgICAgICAgICAgPT4gMTE7Cgp1c2UgY29uc3RhbnQgUF9MT09TRSAgICAgICAgICAgICAgICA9PiAxMjsKdXNlIGNvbnN0YW50IFBfQUxMT1dfQklHTlVNICAgICAgICAgPT4gMTM7CnVzZSBjb25zdGFudCBQX0FMTE9XX0JBUkVLRVkgICAgICAgID0+IDE0Owp1c2UgY29uc3RhbnQgUF9BTExPV19TSU5HTEVRVU9URSAgICA9PiAxNTsKdXNlIGNvbnN0YW50IFBfRVNDQVBFX1NMQVNIICAgICAgICAgPT4gMTY7CnVzZSBjb25zdGFudCBQX0FTX05PTkJMRVNTRUQgICAgICAgID0+IDE3OwoKdXNlIGNvbnN0YW50IFBfQUxMT1dfVU5LTk9XTiAgICAgICAgPT4gMTg7CgpCRUdJTiB7CiAgICBteSBAeHNfY29tcGF0aV9iaXRfcHJvcGVydGllcyA9IHF3KAogICAgICAgICAgICBsYXRpbjEgYXNjaWkgdXRmOCBpbmRlbnQgY2Fub25pY2FsIHNwYWNlX2JlZm9yZSBzcGFjZV9hZnRlciBhbGxvd19ub25yZWYgc2hyaW5rCiAgICAgICAgICAgIGFsbG93X2JsZXNzZWQgY29udmVydF9ibGVzc2VkIHJlbGF4ZWQgYWxsb3dfdW5rbm93bgogICAgKTsKICAgIG15IEBwcF9iaXRfcHJvcGVydGllcyA9IHF3KAogICAgICAgICAgICBhbGxvd19zaW5nbGVxdW90ZSBhbGxvd19iaWdudW0gbG9vc2UKICAgICAgICAgICAgYWxsb3dfYmFyZWtleSBlc2NhcGVfc2xhc2ggYXNfbm9uYmxlc3NlZAogICAgKTsKCiAgICAjIFBlcmwgdmVyc2lvbiBjaGVjaywgVW5pY29kZSBoYW5kbGluZyBpcyBlbmFibGU/CiAgICAjIEhlbHBlciBtb2R1bGUgc2V0cyBASlNPTjo6UFA6Ol9wcm9wZXJ0aWVzLgoKICAgIG15ICRoZWxwZXIgPSAkXSA+PSA1LjAwOCA/ICdKU09OOjpQUDU4JwogICAgICAgICAgICAgICA6ICRdID49IDUuMDA2ID8gJ0pTT046OlBQNTYnCiAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAnSlNPTjo6UFA1MDA1JwogICAgICAgICAgICAgICA7CgogICAgZXZhbCBxcXwgcmVxdWlyZSAkaGVscGVyIHw7CiAgICBpZiAoJEApIHsgQ2FycDo6Y3JvYWsgJEA7IH0KCiAgICBmb3IgbXkgJG5hbWUgKEB4c19jb21wYXRpX2JpdF9wcm9wZXJ0aWVzLCBAcHBfYml0X3Byb3BlcnRpZXMpIHsKICAgICAgICBteSAkZmxhZ19uYW1lID0gJ1BfJyAuIHVjKCRuYW1lKTsKCiAgICAgICAgZXZhbCBxcS8KICAgICAgICAgICAgc3ViICRuYW1lIHsKICAgICAgICAgICAgICAgIG15IFwkZW5hYmxlID0gZGVmaW5lZCBcJF9bMV0gPyBcJF9bMV0gOiAxOwoKICAgICAgICAgICAgICAgIGlmIChcJGVuYWJsZSkgewogICAgICAgICAgICAgICAgICAgIFwkX1swXS0+e1BST1BTfS0+WyRmbGFnX25hbWVdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFwkX1swXS0+e1BST1BTfS0+WyRmbGFnX25hbWVdID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBcJF9bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN1YiBnZXRfJG5hbWUgewogICAgICAgICAgICAgICAgXCRfWzBdLT57UFJPUFN9LT5bJGZsYWdfbmFtZV0gPyAxIDogJyc7CiAgICAgICAgICAgIH0KICAgICAgICAvOwogICAgfQoKfQoKCgojIEZ1bmN0aW9ucwoKbXkgJWVuY29kZV9hbGxvd19tZXRob2QKICAgICA9IG1hcCB7KCRfID0+IDEpfSBxdy91dGY4IHByZXR0eSBhbGxvd19ub25yZWYgbGF0aW4xIHNlbGZfZW5jb2RlIGVzY2FwZV9zbGFzaAogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2JsZXNzZWQgY29udmVydF9ibGVzc2VkIGluZGVudCBpbmRlbnRfbGVuZ3RoIGFsbG93X2JpZ251bQogICAgICAgICAgICAgICAgICAgICAgICAgIGFzX25vbmJsZXNzZWQKICAgICAgICAgICAgICAgICAgICAgICAgLzsKbXkgJWRlY29kZV9hbGxvd19tZXRob2QKICAgICA9IG1hcCB7KCRfID0+IDEpfSBxdy91dGY4IGFsbG93X25vbnJlZiBsb29zZSBhbGxvd19zaW5nbGVxdW90ZSBhbGxvd19iaWdudW0KICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19iYXJla2V5IG1heF9zaXplIHJlbGF4ZWQvOwoKCm15ICRKU09OOyAjIGNhY2hlCgpzdWIgZW5jb2RlX2pzb24gKCQpIHsgIyBlbmNvZGUKICAgICgkSlNPTiB8fD0gX19QQUNLQUdFX18tPm5ldy0+dXRmOCktPmVuY29kZShAXyk7Cn0KCgpzdWIgZGVjb2RlX2pzb24geyAjIGRlY29kZQogICAgKCRKU09OIHx8PSBfX1BBQ0tBR0VfXy0+bmV3LT51dGY4KS0+ZGVjb2RlKEBfKTsKfQoKIyBPYnNvbGV0ZWQKCnN1YiB0b19qc29uKCQpIHsKICAgQ2FycDo6Y3JvYWsgKCJKU09OOjpQUDo6dG9fanNvbiBoYXMgYmVlbiByZW5hbWVkIHRvIGVuY29kZV9qc29uLiIpOwp9CgoKc3ViIGZyb21fanNvbigkKSB7CiAgIENhcnA6OmNyb2FrICgiSlNPTjo6UFA6OmZyb21fanNvbiBoYXMgYmVlbiByZW5hbWVkIHRvIGRlY29kZV9qc29uLiIpOwp9CgoKIyBNZXRob2RzCgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gewogICAgICAgIG1heF9kZXB0aCAgID0+IDUxMiwKICAgICAgICBtYXhfc2l6ZSAgICA9PiAwLAogICAgICAgIGluZGVudCAgICAgID0+IDAsCiAgICAgICAgRkxBR1MgICAgICAgPT4gMCwKICAgICAgICBmYWxsYmFjayAgICAgID0+IHN1YiB7IGVuY29kZV9lcnJvcignSW52YWxpZCB2YWx1ZS4gSlNPTiBjYW4gb25seSByZWZlcmVuY2UuJykgfSwKICAgICAgICBpbmRlbnRfbGVuZ3RoID0+IDMsCiAgICB9OwoKICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7Cn0KCgpzdWIgZW5jb2RlIHsKICAgIHJldHVybiAkX1swXS0+UFBfZW5jb2RlX2pzb24oJF9bMV0pOwp9CgoKc3ViIGRlY29kZSB7CiAgICByZXR1cm4gJF9bMF0tPlBQX2RlY29kZV9qc29uKCRfWzFdLCAweDAwMDAwMDAwKTsKfQoKCnN1YiBkZWNvZGVfcHJlZml4IHsKICAgIHJldHVybiAkX1swXS0+UFBfZGVjb2RlX2pzb24oJF9bMV0sIDB4MDAwMDAwMDEpOwp9CgoKIyBhY2Nlc3NvcgoKCiMgcHJldHR5IHByaW50aW5nCgpzdWIgcHJldHR5IHsKICAgIG15ICgkc2VsZiwgJHYpID0gQF87CiAgICBteSAkZW5hYmxlID0gZGVmaW5lZCAkdiA/ICR2IDogMTsKCiAgICBpZiAoJGVuYWJsZSkgeyAjIGluZGVudF9sZW5ndGgoMykgZm9yIEpTT046OlhTIGNvbXBhdGliaWxpdHkKICAgICAgICAkc2VsZi0+aW5kZW50KDEpLT5pbmRlbnRfbGVuZ3RoKDMpLT5zcGFjZV9iZWZvcmUoMSktPnNwYWNlX2FmdGVyKDEpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHNlbGYtPmluZGVudCgwKS0+c3BhY2VfYmVmb3JlKDApLT5zcGFjZV9hZnRlcigwKTsKICAgIH0KCiAgICAkc2VsZjsKfQoKIyBldGMKCnN1YiBtYXhfZGVwdGggewogICAgbXkgJG1heCAgPSBkZWZpbmVkICRfWzFdID8gJF9bMV0gOiAweDgwMDAwMDAwOwogICAgJF9bMF0tPnttYXhfZGVwdGh9ID0gJG1heDsKICAgICRfWzBdOwp9CgoKc3ViIGdldF9tYXhfZGVwdGggeyAkX1swXS0+e21heF9kZXB0aH07IH0KCgpzdWIgbWF4X3NpemUgewogICAgbXkgJG1heCAgPSBkZWZpbmVkICRfWzFdID8gJF9bMV0gOiAwOwogICAgJF9bMF0tPnttYXhfc2l6ZX0gPSAkbWF4OwogICAgJF9bMF07Cn0KCgpzdWIgZ2V0X21heF9zaXplIHsgJF9bMF0tPnttYXhfc2l6ZX07IH0KCgpzdWIgZmlsdGVyX2pzb25fb2JqZWN0IHsKICAgICRfWzBdLT57Y2Jfb2JqZWN0fSA9IGRlZmluZWQgJF9bMV0gPyAkX1sxXSA6IDA7CiAgICAkX1swXS0+e0ZfSE9PS30gPSAoJF9bMF0tPntjYl9vYmplY3R9IG9yICRfWzBdLT57Y2Jfc2tfb2JqZWN0fSkgPyAxIDogMDsKICAgICRfWzBdOwp9CgpzdWIgZmlsdGVyX2pzb25fc2luZ2xlX2tleV9vYmplY3QgewogICAgaWYgKEBfID4gMSkgewogICAgICAgICRfWzBdLT57Y2Jfc2tfb2JqZWN0fS0+eyRfWzFdfSA9ICRfWzJdOwogICAgfQogICAgJF9bMF0tPntGX0hPT0t9ID0gKCRfWzBdLT57Y2Jfb2JqZWN0fSBvciAkX1swXS0+e2NiX3NrX29iamVjdH0pID8gMSA6IDA7CiAgICAkX1swXTsKfQoKc3ViIGluZGVudF9sZW5ndGggewogICAgaWYgKCFkZWZpbmVkICRfWzFdIG9yICRfWzFdID4gMTUgb3IgJF9bMV0gPCAwKSB7CiAgICAgICAgQ2FycDo6Y2FycCAiVGhlIGFjY2VwdGFibGUgcmFuZ2Ugb2YgaW5kZW50X2xlbmd0aCgpIGlzIDAgdG8gMTUuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRfWzBdLT57aW5kZW50X2xlbmd0aH0gPSAkX1sxXTsKICAgIH0KICAgICRfWzBdOwp9CgpzdWIgZ2V0X2luZGVudF9sZW5ndGggewogICAgJF9bMF0tPntpbmRlbnRfbGVuZ3RofTsKfQoKc3ViIHNvcnRfYnkgewogICAgJF9bMF0tPntzb3J0X2J5fSA9IGRlZmluZWQgJF9bMV0gPyAkX1sxXSA6IDE7CiAgICAkX1swXTsKfQoKc3ViIGFsbG93X2JpZ2ludCB7CiAgICBDYXJwOjpjYXJwKCJhbGxvd19iaWdpbnQoKSBpcyBvYnNvbGV0ZWQuIHVzZSBhbGxvd19iaWdudW0oKSBpbnN0ZWQuIik7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMjIwojIyMgUGVybCA9PiBKU09OCiMjIwoKCnsgIyBDb252ZXJ0CgogICAgbXkgJG1heF9kZXB0aDsKICAgIG15ICRpbmRlbnQ7CiAgICBteSAkYXNjaWk7CiAgICBteSAkbGF0aW4xOwogICAgbXkgJHV0Zjg7CiAgICBteSAkc3BhY2VfYmVmb3JlOwogICAgbXkgJHNwYWNlX2FmdGVyOwogICAgbXkgJGNhbm9uaWNhbDsKICAgIG15ICRhbGxvd19ibGVzc2VkOwogICAgbXkgJGNvbnZlcnRfYmxlc3NlZDsKCiAgICBteSAkaW5kZW50X2xlbmd0aDsKICAgIG15ICRlc2NhcGVfc2xhc2g7CiAgICBteSAkYmlnbnVtOwogICAgbXkgJGFzX25vbmJsZXNzZWQ7CgogICAgbXkgJGRlcHRoOwogICAgbXkgJGluZGVudF9jb3VudDsKICAgIG15ICRrZXlzb3J0OwoKCiAgICBzdWIgUFBfZW5jb2RlX2pzb24gewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgbXkgJG9iaiAgPSBzaGlmdDsKCiAgICAgICAgJGluZGVudF9jb3VudCA9IDA7CiAgICAgICAgJGRlcHRoICAgICAgICA9IDA7CgogICAgICAgIG15ICRpZHggPSAkc2VsZi0+e1BST1BTfTsKCiAgICAgICAgKCRhc2NpaSwgJGxhdGluMSwgJHV0ZjgsICRpbmRlbnQsICRjYW5vbmljYWwsICRzcGFjZV9iZWZvcmUsICRzcGFjZV9hZnRlciwgJGFsbG93X2JsZXNzZWQsCiAgICAgICAgICAgICRjb252ZXJ0X2JsZXNzZWQsICRlc2NhcGVfc2xhc2gsICRiaWdudW0sICRhc19ub25ibGVzc2VkKQogICAgICAgICA9IEB7JGlkeH1bUF9BU0NJSSAuLiBQX1NQQUNFX0FGVEVSLCBQX0FMTE9XX0JMRVNTRUQsIFBfQ09OVkVSVF9CTEVTU0VELAogICAgICAgICAgICAgICAgICAgIFBfRVNDQVBFX1NMQVNILCBQX0FMTE9XX0JJR05VTSwgUF9BU19OT05CTEVTU0VEXTsKCiAgICAgICAgKCRtYXhfZGVwdGgsICRpbmRlbnRfbGVuZ3RoKSA9IEB7JHNlbGZ9e3F3L21heF9kZXB0aCBpbmRlbnRfbGVuZ3RoL307CgogICAgICAgICRrZXlzb3J0ID0gJGNhbm9uaWNhbCA/IHN1YiB7ICRhIGNtcCAkYiB9IDogdW5kZWY7CgogICAgICAgIGlmICgkc2VsZi0+e3NvcnRfYnl9KSB7CiAgICAgICAgICAgICRrZXlzb3J0ID0gcmVmKCRzZWxmLT57c29ydF9ieX0pIGVxICdDT0RFJyA/ICRzZWxmLT57c29ydF9ieX0KICAgICAgICAgICAgICAgICAgICAgOiAkc2VsZi0+e3NvcnRfYnl9ID1+IC9cRCsvICAgICAgID8gJHNlbGYtPntzb3J0X2J5fQogICAgICAgICAgICAgICAgICAgICA6IHN1YiB7ICRhIGNtcCAkYiB9OwogICAgICAgIH0KCiAgICAgICAgZW5jb2RlX2Vycm9yKCJoYXNoLSBvciBhcnJheXJlZiBleHBlY3RlZCAobm90IGEgc2ltcGxlIHNjYWxhciwgdXNlIGFsbG93X25vbnJlZiB0byBhbGxvdyB0aGlzKSIpCiAgICAgICAgICAgICBpZighcmVmICRvYmogYW5kICEkaWR4LT5bIFBfQUxMT1dfTk9OUkVGIF0pOwoKICAgICAgICBteSAkc3RyICA9ICRzZWxmLT5vYmplY3RfdG9fanNvbigkb2JqKTsKCiAgICAgICAgJHN0ciAuPSAiXG4iIGlmICggJGluZGVudCApOyAjIEpTT046OlhTIDIuMjYgY29tcGF0aWJsZQoKICAgICAgICB1bmxlc3MgKCRhc2NpaSBvciAkbGF0aW4xIG9yICR1dGY4KSB7CiAgICAgICAgICAgIHV0Zjg6OnVwZ3JhZGUoJHN0cik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGlkeC0+WyBQX1NIUklOSyBdKSB7CiAgICAgICAgICAgIHV0Zjg6OmRvd25ncmFkZSgkc3RyLCAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc3RyOwogICAgfQoKCiAgICBzdWIgb2JqZWN0X3RvX2pzb24gewogICAgICAgIG15ICgkc2VsZiwgJG9iaikgPSBAXzsKICAgICAgICBteSAkdHlwZSA9IHJlZigkb2JqKTsKCiAgICAgICAgaWYoJHR5cGUgZXEgJ0hBU0gnKXsKICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5oYXNoX3RvX2pzb24oJG9iaik7CiAgICAgICAgfQogICAgICAgIGVsc2lmKCR0eXBlIGVxICdBUlJBWScpewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmFycmF5X3RvX2pzb24oJG9iaik7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkdHlwZSkgeyAjIGJsZXNzZWQgb2JqZWN0PwogICAgICAgICAgICBpZiAoYmxlc3NlZCgkb2JqKSkgewoKICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+dmFsdWVfdG9fanNvbigkb2JqKSBpZiAoICRvYmotPmlzYSgnSlNPTjo6UFA6OkJvb2xlYW4nKSApOwoKICAgICAgICAgICAgICAgIGlmICggJGNvbnZlcnRfYmxlc3NlZCBhbmQgJG9iai0+Y2FuKCdUT19KU09OJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJHJlc3VsdCA9ICRvYmotPlRPX0pTT04oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJHJlc3VsdCBhbmQgb3ZlcmxvYWQ6Ok92ZXJsb2FkZWQoICRvYmogKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvdmVybG9hZDo6U3RyVmFsKCAkb2JqICkgZXEgJHJlc3VsdCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9lcnJvciggc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6OlRPX0pTT04gbWV0aG9kIHJldHVybmVkIHNhbWUgb2JqZWN0IGFzIHdhcyBwYXNzZWQgaW5zdGVhZCBvZiBhIG5ldyBvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkb2JqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+b2JqZWN0X3RvX2pzb24oICRyZXN1bHQgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gIiRvYmoiIGlmICggJGJpZ251bSBhbmQgX2lzX2JpZ251bSgkb2JqKSApOwogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5ibGVzc2VkX3RvX2pzb24oJG9iaikgaWYgKCRhbGxvd19ibGVzc2VkIGFuZCAkYXNfbm9uYmxlc3NlZCk7ICMgd2lsbCBiZSByZW1vdmVkLgoKICAgICAgICAgICAgICAgIGVuY29kZV9lcnJvciggc3ByaW50ZigiZW5jb3VudGVyZWQgb2JqZWN0ICclcycsIGJ1dCBuZWl0aGVyIGFsbG93X2JsZXNzZWQgIgogICAgICAgICAgICAgICAgICAgIC4gIm5vciBjb252ZXJ0X2JsZXNzZWQgc2V0dGluZ3MgYXJlIGVuYWJsZWQiLCAkb2JqKQogICAgICAgICAgICAgICAgKSB1bmxlc3MgKCRhbGxvd19ibGVzc2VkKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxmLT52YWx1ZV90b19qc29uKCRvYmopOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+dmFsdWVfdG9fanNvbigkb2JqKTsKICAgICAgICB9CiAgICB9CgoKICAgIHN1YiBoYXNoX3RvX2pzb24gewogICAgICAgIG15ICgkc2VsZiwgJG9iaikgPSBAXzsKICAgICAgICBteSAoJGssJHYpOwogICAgICAgIG15ICVyZXM7CgogICAgICAgIGVuY29kZV9lcnJvcigianNvbiB0ZXh0IG9yIHBlcmwgc3RydWN0dXJlIGV4Y2VlZHMgbWF4aW11bSBuZXN0aW5nIGxldmVsIChtYXhfZGVwdGggc2V0IHRvbyBsb3c/KSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrJGRlcHRoID4gJG1heF9kZXB0aCk7CgogICAgICAgIG15ICgkcHJlLCAkcG9zdCkgPSAkaW5kZW50ID8gJHNlbGYtPl91cF9pbmRlbnQoKSA6ICgnJywgJycpOwogICAgICAgIG15ICRkZWwgPSAoJHNwYWNlX2JlZm9yZSA/ICcgJyA6ICcnKSAuICc6JyAuICgkc3BhY2VfYWZ0ZXIgPyAnICcgOiAnJyk7CgogICAgICAgIGlmICggbXkgJHRpZV9jbGFzcyA9IHRpZWQgJSRvYmogKSB7CiAgICAgICAgICAgIGlmICggJHRpZV9jbGFzcy0+Y2FuKCdUSUVIQVNIJykgKSB7CiAgICAgICAgICAgICAgICAkdGllX2NsYXNzID1+IHMvPS4rJC8vOwogICAgICAgICAgICAgICAgdGllICVyZXMsICR0aWVfY2xhc3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSW4gdGhlIG9sZCBQZXJsIHZlcmlvbnMsIHRpZWQgaGFzaGVzIGluIGJvb2wgY29udGV4dCBkaWRuJ3Qgd29yay4KICAgICAgICAjIFNvLCB3ZSBjYW4ndCB1c2Ugc3VjaCBhIHdheSAoJXJlcyA/IGEgOiBiKQogICAgICAgIG15ICRoYXM7CgogICAgICAgIGZvciBteSAkayAoa2V5cyAlJG9iaikgewogICAgICAgICAgICBteSAkdiA9ICRvYmotPnska307CiAgICAgICAgICAgICRyZXN7JGt9ID0gJHNlbGYtPm9iamVjdF90b19qc29uKCR2KSB8fCAkc2VsZi0+dmFsdWVfdG9fanNvbigkdik7CiAgICAgICAgICAgICRoYXMgPSAxIHVubGVzcyAoICRoYXMgKTsKICAgICAgICB9CgogICAgICAgIC0tJGRlcHRoOwogICAgICAgICRzZWxmLT5fZG93bl9pbmRlbnQoKSBpZiAoJGluZGVudCk7CgogICAgICAgIHJldHVybiAneycgLiAoICRoYXMgPyAkcHJlIDogJycgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZW50CiAgICAgICAgICAgICAgICAgICAuICggJGhhcyA/IGpvaW4oIiwkcHJlIiwgbWFwIHsgdXRmODo6ZGVjb2RlKCRfKSBpZiAoJF0gPCA1LjAwOCk7ICAgICAgICAgIyBrZXkgZm9yIFBlcmwgNS42CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190b19qc29uKCRzZWxmLCAkXykgLiAkZGVsIC4gJHJlc3skX30gIyBrZXkgOiB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gX3NvcnQoICRzZWxmLCBcJXJlcyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAuICRwb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAuICd9JzsKICAgIH0KCgogICAgc3ViIGFycmF5X3RvX2pzb24gewogICAgICAgIG15ICgkc2VsZiwgJG9iaikgPSBAXzsKICAgICAgICBteSBAcmVzOwoKICAgICAgICBlbmNvZGVfZXJyb3IoImpzb24gdGV4dCBvciBwZXJsIHN0cnVjdHVyZSBleGNlZWRzIG1heGltdW0gbmVzdGluZyBsZXZlbCAobWF4X2RlcHRoIHNldCB0b28gbG93PykiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrKyRkZXB0aCA+ICRtYXhfZGVwdGgpOwoKICAgICAgICBteSAoJHByZSwgJHBvc3QpID0gJGluZGVudCA/ICRzZWxmLT5fdXBfaW5kZW50KCkgOiAoJycsICcnKTsKCiAgICAgICAgaWYgKG15ICR0aWVfY2xhc3MgPSB0aWVkIEAkb2JqKSB7CiAgICAgICAgICAgIGlmICggJHRpZV9jbGFzcy0+Y2FuKCdUSUVBUlJBWScpICkgewogICAgICAgICAgICAgICAgJHRpZV9jbGFzcyA9fiBzLz0uKyQvLzsKICAgICAgICAgICAgICAgIHRpZSBAcmVzLCAkdGllX2NsYXNzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJHYgKEAkb2JqKXsKICAgICAgICAgICAgcHVzaCBAcmVzLCAkc2VsZi0+b2JqZWN0X3RvX2pzb24oJHYpIHx8ICRzZWxmLT52YWx1ZV90b19qc29uKCR2KTsKICAgICAgICB9CgogICAgICAgIC0tJGRlcHRoOwogICAgICAgICRzZWxmLT5fZG93bl9pbmRlbnQoKSBpZiAoJGluZGVudCk7CgogICAgICAgIHJldHVybiAnWycgLiAoIEByZXMgPyAkcHJlIDogJycgKSAuICggQHJlcyA/IGpvaW4oICIsJHByZSIsIEByZXMgKSAuICRwb3N0IDogJycgKSAuICddJzsKICAgIH0KCgogICAgc3ViIHZhbHVlX3RvX2pzb24gewogICAgICAgIG15ICgkc2VsZiwgJHZhbHVlKSA9IEBfOwoKICAgICAgICByZXR1cm4gJ251bGwnIGlmKCFkZWZpbmVkICR2YWx1ZSk7CgogICAgICAgIG15ICRiX29iaiA9IEI6OnN2cmVmXzJvYmplY3QoXCR2YWx1ZSk7ICAjIGZvciByb3VuZCB0cmlwIHByb2JsZW0KICAgICAgICBteSAkZmxhZ3MgPSAkYl9vYmotPkZMQUdTOwoKICAgICAgICByZXR1cm4gJHZhbHVlICMgYXMgaXMgCiAgICAgICAgICAgIGlmICggKCAgICAkZmxhZ3MgJiBCOjpTVmZfSU9LIG9yICRmbGFncyAmIEI6OlNWcF9JT0sKICAgICAgICAgICAgICAgICAgIG9yICRmbGFncyAmIEI6OlNWZl9OT0sgb3IgJGZsYWdzICYgQjo6U1ZwX05PSwogICAgICAgICAgICAgICAgICkgYW5kICEoJGZsYWdzICYgQjo6U1ZmX1BPSyApCiAgICAgICAgICAgICk7ICMgU3ZUWVBFIGlzIElWIG9yIE5WPwoKICAgICAgICBteSAkdHlwZSA9IHJlZigkdmFsdWUpOwoKICAgICAgICBpZighJHR5cGUpewogICAgICAgICAgICByZXR1cm4gc3RyaW5nX3RvX2pzb24oJHNlbGYsICR2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2lmKCBibGVzc2VkKCR2YWx1ZSkgYW5kICAkdmFsdWUtPmlzYSgnSlNPTjo6UFA6OkJvb2xlYW4nKSApewogICAgICAgICAgICByZXR1cm4gJCR2YWx1ZSA9PSAxID8gJ3RydWUnIDogJ2ZhbHNlJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCR0eXBlKSB7CiAgICAgICAgICAgIGlmICgob3ZlcmxvYWQ6OlN0clZhbCgkdmFsdWUpID1+IC89KFx3KykvKVswXSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxmLT52YWx1ZV90b19qc29uKCIkdmFsdWUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0eXBlIGVxICdTQ0FMQVInIGFuZCBkZWZpbmVkICQkdmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAgICQkdmFsdWUgZXEgJzEnID8gJ3RydWUnCiAgICAgICAgICAgICAgICAgICAgICAgOiAkJHZhbHVlIGVxICcwJyA/ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICA6ICRzZWxmLT57UFJPUFN9LT5bIFBfQUxMT1dfVU5LTk9XTiBdID8gJ251bGwnCiAgICAgICAgICAgICAgICAgICAgICAgOiBlbmNvZGVfZXJyb3IoImNhbm5vdCBlbmNvZGUgcmVmZXJlbmNlIHRvIHNjYWxhciIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAgaWYgKCAkc2VsZi0+e1BST1BTfS0+WyBQX0FMTE9XX1VOS05PV04gXSApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCAkdHlwZSBlcSAnU0NBTEFSJyBvciAkdHlwZSBlcSAnUkVGJyApIHsKICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZXJyb3IoImNhbm5vdCBlbmNvZGUgcmVmZXJlbmNlIHRvIHNjYWxhciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZXJyb3IoImVuY291bnRlcmVkICR2YWx1ZSwgYnV0IEpTT04gY2FuIG9ubHkgcmVwcmVzZW50IHJlZmVyZW5jZXMgdG8gYXJyYXlzIG9yIGhhc2hlcyIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPntmYWxsYmFja30tPigkdmFsdWUpCiAgICAgICAgICAgICAgICAgaWYgKCRzZWxmLT57ZmFsbGJhY2t9IGFuZCByZWYoJHNlbGYtPntmYWxsYmFja30pIGVxICdDT0RFJyk7CiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7CiAgICAgICAgfQoKICAgIH0KCgogICAgbXkgJWVzYyA9ICgKICAgICAgICAiXG4iID0+ICdcbicsCiAgICAgICAgIlxyIiA9PiAnXHInLAogICAgICAgICJcdCIgPT4gJ1x0JywKICAgICAgICAiXGYiID0+ICdcZicsCiAgICAgICAgIlxiIiA9PiAnXGInLAogICAgICAgICJcIiIgPT4gJ1wiJywKICAgICAgICAiXFwiID0+ICdcXFxcJywKICAgICAgICAiXCciID0+ICdcXFwnJywKICAgICk7CgoKICAgIHN1YiBzdHJpbmdfdG9fanNvbiB7CiAgICAgICAgbXkgKCRzZWxmLCAkYXJnKSA9IEBfOwoKICAgICAgICAkYXJnID1+IHMvKFtceDIyXHg1Y1xuXHJcdFxmXGJdKS8kZXNjeyQxfS9nOwogICAgICAgICRhcmcgPX4gcy9cLy9cXFwvL2cgaWYgKCRlc2NhcGVfc2xhc2gpOwogICAgICAgICRhcmcgPX4gcy8oW1x4MDAtXHgwOFx4MGJceDBlLVx4MWZdKS8nXFx1MDAnIC4gdW5wYWNrKCdIMicsICQxKS9lZzsKCiAgICAgICAgaWYgKCRhc2NpaSkgewogICAgICAgICAgICAkYXJnID0gSlNPTl9QUF9lbmNvZGVfYXNjaWkoJGFyZyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxhdGluMSkgewogICAgICAgICAgICAkYXJnID0gSlNPTl9QUF9lbmNvZGVfbGF0aW4xKCRhcmcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR1dGY4KSB7CiAgICAgICAgICAgIHV0Zjg6OmVuY29kZSgkYXJnKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnIicgLiAkYXJnIC4gJyInOwogICAgfQoKCiAgICBzdWIgYmxlc3NlZF90b19qc29uIHsKICAgICAgICBteSAkYl9vYmogPSBCOjpzdnJlZl8yb2JqZWN0KCRfWzFdKTsKICAgICAgICBpZiAoJGJfb2JqLT5pc2EoJ0I6OkhWJykpIHsKICAgICAgICAgICAgcmV0dXJuICRfWzBdLT5oYXNoX3RvX2pzb24oJF9bMV0pOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJGJfb2JqLT5pc2EoJ0I6OkFWJykpIHsKICAgICAgICAgICAgcmV0dXJuICRfWzBdLT5hcnJheV90b19qc29uKCRfWzFdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7CiAgICAgICAgfQogICAgfQoKCiAgICBzdWIgZW5jb2RlX2Vycm9yIHsKICAgICAgICBteSAkZXJyb3IgID0gc2hpZnQ7CiAgICAgICAgQ2FycDo6Y3JvYWsgIiRlcnJvciI7CiAgICB9CgoKICAgIHN1YiBfc29ydCB7CiAgICAgICAgbXkgKCRzZWxmLCAkcmVzKSA9IEBfOwogICAgICAgIGRlZmluZWQgJGtleXNvcnQgPyAoc29ydCAka2V5c29ydCAoa2V5cyAlJHJlcykpIDoga2V5cyAlJHJlczsKICAgIH0KCgogICAgc3ViIF91cF9pbmRlbnQgewogICAgICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgICAgIG15ICRzcGFjZSA9ICcgJyB4ICRpbmRlbnRfbGVuZ3RoOwoKICAgICAgICBteSAoJHByZSwkcG9zdCkgPSAoJycsJycpOwoKICAgICAgICAkcG9zdCA9ICJcbiIgLiAkc3BhY2UgeCAkaW5kZW50X2NvdW50OwoKICAgICAgICAkaW5kZW50X2NvdW50Kys7CgogICAgICAgICRwcmUgPSAiXG4iIC4gJHNwYWNlIHggJGluZGVudF9jb3VudDsKCiAgICAgICAgcmV0dXJuICgkcHJlLCRwb3N0KTsKICAgIH0KCgogICAgc3ViIF9kb3duX2luZGVudCB7ICRpbmRlbnRfY291bnQtLTsgfQoKCiAgICBzdWIgUFBfZW5jb2RlX2JveCB7CiAgICAgICAgewogICAgICAgICAgICBkZXB0aCAgICAgICAgPT4gJGRlcHRoLAogICAgICAgICAgICBpbmRlbnRfY291bnQgPT4gJGluZGVudF9jb3VudCwKICAgICAgICB9OwogICAgfQoKfSAjIENvbnZlcnQKCgpzdWIgX2VuY29kZV9hc2NpaSB7CiAgICBqb2luKCcnLAogICAgICAgIG1hcCB7CiAgICAgICAgICAgICRfIDw9IDEyNyA/CiAgICAgICAgICAgICAgICBjaHIoJF8pIDoKICAgICAgICAgICAgJF8gPD0gNjU1MzUgPwogICAgICAgICAgICAgICAgc3ByaW50ZignXHUlMDR4JywgJF8pIDogc3ByaW50ZignXHUleFx1JXgnLCBfZW5jb2RlX3N1cnJvZ2F0ZXMoJF8pKTsKICAgICAgICB9IHVucGFjaygnVSonLCAkX1swXSkKICAgICk7Cn0KCgpzdWIgX2VuY29kZV9sYXRpbjEgewogICAgam9pbignJywKICAgICAgICBtYXAgewogICAgICAgICAgICAkXyA8PSAyNTUgPwogICAgICAgICAgICAgICAgY2hyKCRfKSA6CiAgICAgICAgICAgICRfIDw9IDY1NTM1ID8KICAgICAgICAgICAgICAgIHNwcmludGYoJ1x1JTA0eCcsICRfKSA6IHNwcmludGYoJ1x1JXhcdSV4JywgX2VuY29kZV9zdXJyb2dhdGVzKCRfKSk7CiAgICAgICAgfSB1bnBhY2soJ1UqJywgJF9bMF0pCiAgICApOwp9CgoKc3ViIF9lbmNvZGVfc3Vycm9nYXRlcyB7ICMgZnJvbSBwZXJsdW5pY29kZQogICAgbXkgJHVuaSA9ICRfWzBdIC0gMHgxMDAwMDsKICAgIHJldHVybiAoJHVuaSAvIDB4NDAwICsgMHhEODAwLCAkdW5pICUgMHg0MDAgKyAweERDMDApOwp9CgoKc3ViIF9pc19iaWdudW0gewogICAgJF9bMF0tPmlzYSgnTWF0aDo6QmlnSW50Jykgb3IgJF9bMF0tPmlzYSgnTWF0aDo6QmlnRmxvYXQnKTsKfQoKCgojCiMgSlNPTiA9PiBQZXJsCiMKCm15ICRtYXhfaW50c2l6ZTsKCkJFR0lOIHsKICAgIG15ICRjaGVja2ludCA9IDExMTE7CiAgICBmb3IgbXkgJGQgKDUuLjMwKSB7CiAgICAgICAgJGNoZWNraW50IC49IDE7CiAgICAgICAgbXkgJGludCAgID0gZXZhbCBxcXwgJGNoZWNraW50IHw7CiAgICAgICAgaWYgKCRpbnQgPX4gL1tlRV0vKSB7CiAgICAgICAgICAgICRtYXhfaW50c2l6ZSA9ICRkIC0gMTsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICB9Cn0KCnsgIyBQQVJTRSAKCiAgICBteSAlZXNjYXBlcyA9ICggIyAgYnkgSmVyZW15IE11aGxpY2ggPGptdWhsaWNoIFthdF0gYml0Zmxvb2Qub3JnPgogICAgICAgIGIgICAgPT4gIlx4OCIsCiAgICAgICAgdCAgICA9PiAiXHg5IiwKICAgICAgICBuICAgID0+ICJceEEiLAogICAgICAgIGYgICAgPT4gIlx4QyIsCiAgICAgICAgciAgICA9PiAiXHhEIiwKICAgICAgICAnXFwnID0+ICdcXCcsCiAgICAgICAgJyInICA9PiAnIicsCiAgICAgICAgJy8nICA9PiAnLycsCiAgICApOwoKICAgIG15ICR0ZXh0OyAjIGpzb24gZGF0YQogICAgbXkgJGF0OyAgICMgb2Zmc2V0CiAgICBteSAkY2g7ICAgIyAxY2hyYWN0ZXIKICAgIG15ICRsZW47ICAjIHRleHQgbGVuZ3RoIChjaGFuZ2VkIGFjY29yZGluZyB0byBVVEY4IG9yIE5PTiBVVEY4KQogICAgIyBJTlRFUk5BTAogICAgbXkgJGRlcHRoOyAgICAgICAgICAjIG5lc3QgY291bnRlcgogICAgbXkgJGVuY29kaW5nOyAgICAgICAjIGpzb24gdGV4dCBlbmNvZGluZwogICAgbXkgJGlzX3ZhbGlkX3V0Zjg7ICAjIHRlbXAgdmFyaWFibGUKICAgIG15ICR1dGY4X2xlbjsgICAgICAgIyB1dGY4IGJ5dGUgbGVuZ3RoCiAgICAjIEZMQUdTCiAgICBteSAkdXRmODsgICAgICAgICAgICMgbXVzdCBiZSB1dGY4CiAgICBteSAkbWF4X2RlcHRoOyAgICAgICMgbWF4IG5lc3QgbnVibWVyIG9mIG9iamVjdHMgYW5kIGFycmF5cwogICAgbXkgJG1heF9zaXplOwogICAgbXkgJHJlbGF4ZWQ7CiAgICBteSAkY2Jfb2JqZWN0OwogICAgbXkgJGNiX3NrX29iamVjdDsKCiAgICBteSAkRl9IT09LOwoKICAgIG15ICRhbGxvd19iaWdpbnQ7ICAgIyB1c2luZyBNYXRoOjpCaWdJbnQKICAgIG15ICRzaW5nbGVxdW90ZTsgICAgIyBsb29zZWx5IHF1b3RpbmcKICAgIG15ICRsb29zZTsgICAgICAgICAgIyAKICAgIG15ICRhbGxvd19iYXJla2V5OyAgIyBiYXJlS2V5CgogICAgIyAkb3B0IGZsYWcKICAgICMgMHgwMDAwMDAwMSAuLi4uIGRlY29kZV9wcmVmaXgKICAgICMgMHgxMDAwMDAwMCAuLi4uIGluY3JfcGFyc2UKCiAgICBzdWIgUFBfZGVjb2RlX2pzb24gewogICAgICAgIG15ICgkc2VsZiwgJG9wdCk7ICMgJG9wdCBpcyBhbiBlZmZlY3RpdmUgZmxhZyBkdXJpbmcgdGhpcyBkZWNvZGVfanNvbi4KCiAgICAgICAgKCRzZWxmLCAkdGV4dCwgJG9wdCkgPSBAXzsKCiAgICAgICAgKCRhdCwgJGNoLCAkZGVwdGgpID0gKDAsICcnLCAwKTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkdGV4dCBvciByZWYgJHRleHQgKSB7CiAgICAgICAgICAgIGRlY29kZV9lcnJvcigibWFsZm9ybWVkIEpTT04gc3RyaW5nLCBuZWl0aGVyIGFycmF5LCBvYmplY3QsIG51bWJlciwgc3RyaW5nIG9yIGF0b20iKTsKICAgICAgICB9CgogICAgICAgIG15ICRpZHggPSAkc2VsZi0+e1BST1BTfTsKCiAgICAgICAgKCR1dGY4LCAkcmVsYXhlZCwgJGxvb3NlLCAkYWxsb3dfYmlnaW50LCAkYWxsb3dfYmFyZWtleSwgJHNpbmdsZXF1b3RlKQogICAgICAgICAgICA9IEB7JGlkeH1bUF9VVEY4LCBQX1JFTEFYRUQsIFBfTE9PU0UgLi4gUF9BTExPV19TSU5HTEVRVU9URV07CgogICAgICAgIGlmICggJHV0ZjggKSB7CiAgICAgICAgICAgIHV0Zjg6OmRvd25ncmFkZSggJHRleHQsIDEgKSBvciBDYXJwOjpjcm9haygiV2lkZSBjaGFyYWN0ZXIgaW4gc3Vicm91dGluZSBlbnRyeSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdXRmODo6dXBncmFkZSggJHRleHQgKTsKICAgICAgICB9CgogICAgICAgICRsZW4gPSBsZW5ndGggJHRleHQ7CgogICAgICAgICgkbWF4X2RlcHRoLCAkbWF4X3NpemUsICRjYl9vYmplY3QsICRjYl9za19vYmplY3QsICRGX0hPT0spCiAgICAgICAgICAgICA9IEB7JHNlbGZ9e3F3L21heF9kZXB0aCAgbWF4X3NpemUgY2Jfb2JqZWN0IGNiX3NrX29iamVjdCBGX0hPT0svfTsKCiAgICAgICAgaWYgKCRtYXhfc2l6ZSA+IDEpIHsKICAgICAgICAgICAgdXNlIGJ5dGVzOwogICAgICAgICAgICBteSAkYnl0ZXMgPSBsZW5ndGggJHRleHQ7CiAgICAgICAgICAgIGRlY29kZV9lcnJvcigKICAgICAgICAgICAgICAgIHNwcmludGYoImF0dGVtcHRlZCBkZWNvZGUgb2YgSlNPTiB0ZXh0IG9mICVzIGJ5dGVzIHNpemUsIGJ1dCBtYXhfc2l6ZSBpcyBzZXQgdG8gJXMiCiAgICAgICAgICAgICAgICAgICAgLCAkYnl0ZXMsICRtYXhfc2l6ZSksIDEKICAgICAgICAgICAgKSBpZiAoJGJ5dGVzID4gJG1heF9zaXplKTsKICAgICAgICB9CgogICAgICAgICMgQ3VycmVudGx5IG5vIGVmZmVjdAogICAgICAgICMgc2hvdWxkIHVzZSByZWdleHAKICAgICAgICBteSBAb2N0ZXRzID0gdW5wYWNrKCdDNCcsICR0ZXh0KTsKICAgICAgICAkZW5jb2RpbmcgPSAgICggJG9jdGV0c1swXSBhbmQgICRvY3RldHNbMV0pID8gJ1VURi04JwogICAgICAgICAgICAgICAgICAgIDogKCEkb2N0ZXRzWzBdIGFuZCAgJG9jdGV0c1sxXSkgPyAnVVRGLTE2QkUnCiAgICAgICAgICAgICAgICAgICAgOiAoISRvY3RldHNbMF0gYW5kICEkb2N0ZXRzWzFdKSA/ICdVVEYtMzJCRScKICAgICAgICAgICAgICAgICAgICA6ICggJG9jdGV0c1syXSAgICAgICAgICAgICAgICApID8gJ1VURi0xNkxFJwogICAgICAgICAgICAgICAgICAgIDogKCEkb2N0ZXRzWzJdICAgICAgICAgICAgICAgICkgPyAnVVRGLTMyTEUnCiAgICAgICAgICAgICAgICAgICAgOiAndW5rbm93bic7CgogICAgICAgIHdoaXRlKCk7ICMgcmVtb3ZlIGhlYWQgd2hpdGUgc3BhY2UKCiAgICAgICAgbXkgJHZhbGlkX3N0YXJ0ID0gZGVmaW5lZCAkY2g7ICMgSXMgdGhlcmUgYSBmaXJzdCBjaGFyYWN0ZXIgZm9yIEpTT04gc3RydWN0dXJlPwoKICAgICAgICBteSAkcmVzdWx0ID0gdmFsdWUoKTsKCiAgICAgICAgcmV0dXJuIHVuZGVmIGlmICggISRyZXN1bHQgJiYgKCAkb3B0ICYgMHgxMDAwMDAwMCApICk7ICMgZm9yIGluY3JfcGFyc2UKCiAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgSlNPTiBzdHJpbmcsIG5laXRoZXIgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBzdHJpbmcgb3IgYXRvbSIpIHVubGVzcyAkdmFsaWRfc3RhcnQ7CgogICAgICAgIGlmICggISRpZHgtPlsgUF9BTExPV19OT05SRUYgXSBhbmQgIXJlZiAkcmVzdWx0ICkgewogICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKAogICAgICAgICAgICAgICAgJ0pTT04gdGV4dCBtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheSAoYnV0IGZvdW5kIG51bWJlciwgc3RyaW5nLCB0cnVlLCBmYWxzZSBvciBudWxsLCcKICAgICAgICAgICAgICAgICAgICAgICAuICcgdXNlIGFsbG93X25vbnJlZiB0byBhbGxvdyB0aGlzKScsIDEpOwogICAgICAgIH0KCiAgICAgICAgQ2FycDo6Y3JvYWsoJ3NvbWV0aGluZyB3cm9uZy4nKSBpZiAkbGVuIDwgJGF0OyAjIHdlIHdvbid0IGFycml2ZSBoZXJlLgoKICAgICAgICBteSAkY29uc3VtZWQgPSBkZWZpbmVkICRjaCA/ICRhdCAtIDEgOiAkYXQ7ICMgY29uc3VtZWQgSlNPTiB0ZXh0IGxlbmd0aAoKICAgICAgICB3aGl0ZSgpOyAjIHJlbW92ZSB0YWlsIHdoaXRlIHNwYWNlCgogICAgICAgIGlmICggJGNoICkgewogICAgICAgICAgICByZXR1cm4gKCAkcmVzdWx0LCAkY29uc3VtZWQgKSBpZiAoJG9wdCAmIDB4MDAwMDAwMDEpOyAjIGFsbCByaWdodCBpZiBkZWNvZGVfcHJlZml4CiAgICAgICAgICAgIGRlY29kZV9lcnJvcigiZ2FyYmFnZSBhZnRlciBKU09OIG9iamVjdCIpOwogICAgICAgIH0KCiAgICAgICAgKCAkb3B0ICYgMHgwMDAwMDAwMSApID8gKCAkcmVzdWx0LCAkY29uc3VtZWQgKSA6ICRyZXN1bHQ7CiAgICB9CgoKICAgIHN1YiBuZXh0X2NociB7CiAgICAgICAgcmV0dXJuICRjaCA9IHVuZGVmIGlmKCRhdCA+PSAkbGVuKTsKICAgICAgICAkY2ggPSBzdWJzdHIoJHRleHQsICRhdCsrLCAxKTsKICAgIH0KCgogICAgc3ViIHZhbHVlIHsKICAgICAgICB3aGl0ZSgpOwogICAgICAgIHJldHVybiAgICAgICAgICBpZighZGVmaW5lZCAkY2gpOwogICAgICAgIHJldHVybiBvYmplY3QoKSBpZigkY2ggZXEgJ3snKTsKICAgICAgICByZXR1cm4gYXJyYXkoKSAgaWYoJGNoIGVxICdbJyk7CiAgICAgICAgcmV0dXJuIHN0cmluZygpIGlmKCRjaCBlcSAnIicgb3IgKCRzaW5nbGVxdW90ZSBhbmQgJGNoIGVxICInIikpOwogICAgICAgIHJldHVybiBudW1iZXIoKSBpZigkY2ggPX4gL1swLTldLyBvciAkY2ggZXEgJy0nKTsKICAgICAgICByZXR1cm4gd29yZCgpOwogICAgfQoKICAgIHN1YiBzdHJpbmcgewogICAgICAgIG15ICgkaSwgJHMsICR0LCAkdSk7CiAgICAgICAgbXkgJHV0ZjE2OwogICAgICAgIG15ICRpc191dGY4OwoKICAgICAgICAoJGlzX3ZhbGlkX3V0ZjgsICR1dGY4X2xlbikgPSAoJycsIDApOwoKICAgICAgICAkcyA9ICcnOyAjIGJhc2ljYWxseSBVVEY4IGZsYWcgb24KCiAgICAgICAgaWYoJGNoIGVxICciJyBvciAoJHNpbmdsZXF1b3RlIGFuZCAkY2ggZXEgIiciKSl7CiAgICAgICAgICAgIG15ICRib3VuZENoYXIgPSAkY2ggaWYgKCRzaW5nbGVxdW90ZSk7CgogICAgICAgICAgICBPVVRFUjogd2hpbGUoIGRlZmluZWQobmV4dF9jaHIoKSkgKXsKCiAgICAgICAgICAgICAgICBpZigoISRzaW5nbGVxdW90ZSBhbmQgJGNoIGVxICciJykgb3IgKCRzaW5nbGVxdW90ZSBhbmQgJGNoIGVxICRib3VuZENoYXIpKXsKICAgICAgICAgICAgICAgICAgICBuZXh0X2NocigpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHV0ZjE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcigibWlzc2luZyBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciBpbiBzdXJyb2dhdGUgcGFpciIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdXRmODo6ZGVjb2RlKCRzKSBpZigkaXNfdXRmOCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmKCRjaCBlcSAnXFwnKXsKICAgICAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgICAgIGlmKGV4aXN0cyAkZXNjYXBlc3skY2h9KXsKICAgICAgICAgICAgICAgICAgICAgICAgJHMgLj0gJGVzY2FwZXN7JGNofTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYoJGNoIGVxICd1Jyl7ICMgVU5JQ09ERSBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgICAgICBteSAkdSA9ICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKDEuLjQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoID0gbmV4dF9jaHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgT1VURVIgaWYoJGNoICF+IC9bMC05YS1mQS1GXS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHUgLj0gJGNoOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIFUrRDgwMCAtIFUrREJGRgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHUgPX4gL15bZERdWzg5YWJBQl1bMC05YS1mQS1GXXsyfS8pIHsgIyBVVEYtMTYgaGlnaCBzdXJyb2dhdGU/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmMTYgPSAkdTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAjIFUrREMwMCAtIFUrREZGRgogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJHUgPX4gL15bZERdW2MtZkMtRl1bMC05YS1mQS1GXXsyfS8pIHsgIyBVVEYtMTYgbG93IHN1cnJvZ2F0ZT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyAoZGVmaW5lZCAkdXRmMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZXJyb3IoIm1pc3NpbmcgaGlnaCBzdXJyb2dhdGUgY2hhcmFjdGVyIGluIHN1cnJvZ2F0ZSBwYWlyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXNfdXRmOCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcyAuPSBKU09OX1BQX2RlY29kZV9zdXJyb2dhdGVzKCR1dGYxNiwgJHUpIHx8IG5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmMTYgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkICR1dGYxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcigic3Vycm9nYXRlIHBhaXIgZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggbXkgJGhleCA9IGhleCggJHUgKSApID4gMTI3ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpc191dGY4ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcyAuPSBKU09OX1BQX2RlY29kZV91bmljb2RlKCR1KSB8fCBuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHMgLj0gY2hyICRoZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJGxvb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXQgLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcignaWxsZWdhbCBiYWNrc2xhc2ggZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRzIC49ICRjaDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewoKICAgICAgICAgICAgICAgICAgICBpZiAoIG9yZCAkY2ggID4gMTI3ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICR1dGY4ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzKCAkY2ggPSBpc192YWxpZF91dGY4KCRjaCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0IC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgVVRGLTggY2hhcmFjdGVyIGluIEpTT04gc3RyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXQgKz0gJHV0ZjhfbGVuIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjg6OmVuY29kZSggJGNoICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRpc191dGY4ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghJGxvb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY2ggPX4gL1tceDAwLVx4MWZceDIyXHg1Y10vKSAgeyAjICcvJyBvawogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZXJyb3IoJ2ludmFsaWQgY2hhcmFjdGVyIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgSlNPTiBzdHJpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHMgLj0gJGNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZWNvZGVfZXJyb3IoInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyB3aGlsZSBwYXJzaW5nIEpTT04gc3RyaW5nIik7CiAgICB9CgoKICAgIHN1YiB3aGl0ZSB7CiAgICAgICAgd2hpbGUoIGRlZmluZWQgJGNoICApewogICAgICAgICAgICBpZigkY2ggbGUgJyAnKXsKICAgICAgICAgICAgICAgIG5leHRfY2hyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYoJGNoIGVxICcvJyl7CiAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgaWYoZGVmaW5lZCAkY2ggYW5kICRjaCBlcSAnLycpewogICAgICAgICAgICAgICAgICAgIDEgd2hpbGUoZGVmaW5lZChuZXh0X2NocigpKSBhbmQgJGNoIG5lICJcbiIgYW5kICRjaCBuZSAiXHIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmKGRlZmluZWQgJGNoIGFuZCAkY2ggZXEgJyonKXsKICAgICAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpewogICAgICAgICAgICAgICAgICAgICAgICBpZihkZWZpbmVkICRjaCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkY2ggZXEgJyonKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWZpbmVkKG5leHRfY2hyKCkpIGFuZCAkY2ggZXEgJy8nKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfY2hyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcigiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAkYXQtLTsKICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZXJyb3IoIm1hbGZvcm1lZCBKU09OIHN0cmluZywgbmVpdGhlciBhcnJheSwgb2JqZWN0LCBudW1iZXIsIHN0cmluZyBvciBhdG9tIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIGlmICgkcmVsYXhlZCBhbmQgJGNoIGVxICcjJykgeyAjIGNvcnJlY3RseT8KICAgICAgICAgICAgICAgICAgICBwb3MoJHRleHQpID0gJGF0OwogICAgICAgICAgICAgICAgICAgICR0ZXh0ID1+IC9cRyhbXlxuXSooPzpcclxufFxyfFxufCQpKS9nOwogICAgICAgICAgICAgICAgICAgICRhdCA9IHBvcygkdGV4dCk7CiAgICAgICAgICAgICAgICAgICAgbmV4dF9jaHI7CiAgICAgICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBzdWIgYXJyYXkgewogICAgICAgIG15ICRhICA9IFtdOwoKICAgICAgICBkZWNvZGVfZXJyb3IoJ2pzb24gdGV4dCBvciBwZXJsIHN0cnVjdHVyZSBleGNlZWRzIG1heGltdW0gbmVzdGluZyBsZXZlbCAobWF4X2RlcHRoIHNldCB0b28gbG93PyknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrJGRlcHRoID4gJG1heF9kZXB0aCk7CgogICAgICAgIG5leHRfY2hyKCk7CiAgICAgICAgd2hpdGUoKTsKCiAgICAgICAgaWYoZGVmaW5lZCAkY2ggYW5kICRjaCBlcSAnXScpewogICAgICAgICAgICAtLSRkZXB0aDsKICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICAgICAgcmV0dXJuICRhOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgd2hpbGUoZGVmaW5lZCgkY2gpKXsKICAgICAgICAgICAgICAgIHB1c2ggQCRhLCB2YWx1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaXRlKCk7CgogICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjaCkgewogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoJGNoIGVxICddJyl7CiAgICAgICAgICAgICAgICAgICAgLS0kZGVwdGg7CiAgICAgICAgICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYoJGNoIG5lICcsJyl7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgd2hpdGUoKTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlbGF4ZWQgYW5kICRjaCBlcSAnXScpIHsKICAgICAgICAgICAgICAgICAgICAtLSRkZXB0aDsKICAgICAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkYTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRlY29kZV9lcnJvcigiLCBvciBdIGV4cGVjdGVkIHdoaWxlIHBhcnNpbmcgYXJyYXkiKTsKICAgIH0KCgogICAgc3ViIG9iamVjdCB7CiAgICAgICAgbXkgJG8gPSB7fTsKICAgICAgICBteSAkazsKCiAgICAgICAgZGVjb2RlX2Vycm9yKCdqc29uIHRleHQgb3IgcGVybCBzdHJ1Y3R1cmUgZXhjZWVkcyBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgKG1heF9kZXB0aCBzZXQgdG9vIGxvdz8pJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrJGRlcHRoID4gJG1heF9kZXB0aCk7CiAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICB3aGl0ZSgpOwoKICAgICAgICBpZihkZWZpbmVkICRjaCBhbmQgJGNoIGVxICd9Jyl7CiAgICAgICAgICAgIC0tJGRlcHRoOwogICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICBpZiAoJEZfSE9PSykgewogICAgICAgICAgICAgICAgcmV0dXJuIF9qc29uX29iamVjdF9ob29rKCRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJG87CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB3aGlsZSAoZGVmaW5lZCAkY2gpIHsKICAgICAgICAgICAgICAgICRrID0gKCRhbGxvd19iYXJla2V5IGFuZCAkY2ggbmUgJyInIGFuZCAkY2ggbmUgIiciKSA/IGJhcmVLZXkoKSA6IHN0cmluZygpOwogICAgICAgICAgICAgICAgd2hpdGUoKTsKCiAgICAgICAgICAgICAgICBpZighZGVmaW5lZCAkY2ggb3IgJGNoIG5lICc6Jyl7CiAgICAgICAgICAgICAgICAgICAgJGF0LS07CiAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCInOicgZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0X2NocigpOwogICAgICAgICAgICAgICAgJG8tPnska30gPSB2YWx1ZSgpOwogICAgICAgICAgICAgICAgd2hpdGUoKTsKCiAgICAgICAgICAgICAgICBsYXN0IGlmICghZGVmaW5lZCAkY2gpOwoKICAgICAgICAgICAgICAgIGlmKCRjaCBlcSAnfScpewogICAgICAgICAgICAgICAgICAgIC0tJGRlcHRoOwogICAgICAgICAgICAgICAgICAgIG5leHRfY2hyKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRGX0hPT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9qc29uX29iamVjdF9ob29rKCRvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRvOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCRjaCBuZSAnLCcpewogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICAgICAgICAgIHdoaXRlKCk7CgogICAgICAgICAgICAgICAgaWYgKCRyZWxheGVkIGFuZCAkY2ggZXEgJ30nKSB7CiAgICAgICAgICAgICAgICAgICAgLS0kZGVwdGg7CiAgICAgICAgICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEZfSE9PSykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2pzb25fb2JqZWN0X2hvb2soJG8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG87CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgJGF0LS07CiAgICAgICAgZGVjb2RlX2Vycm9yKCIsIG9yIH0gZXhwZWN0ZWQgd2hpbGUgcGFyc2luZyBvYmplY3QvaGFzaCIpOwogICAgfQoKCiAgICBzdWIgYmFyZUtleSB7ICMgZG9lc24ndCBzdHJpY3RseSBmb2xsb3cgU3RhbmRhcmQgRUNNQS0yNjIgM3JkIEVkaXRpb24KICAgICAgICBteSAka2V5OwogICAgICAgIHdoaWxlKCRjaCA9fiAvW15ceDAwLVx4MjNceDI1LVx4MkZceDNBLVx4NDBceDVCLVx4NUVceDYwXHg3Qi1ceDdGXS8pewogICAgICAgICAgICAka2V5IC49ICRjaDsKICAgICAgICAgICAgbmV4dF9jaHIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRrZXk7CiAgICB9CgoKICAgIHN1YiB3b3JkIHsKICAgICAgICBteSAkd29yZCA9ICBzdWJzdHIoJHRleHQsJGF0LTEsNCk7CgogICAgICAgIGlmKCR3b3JkIGVxICd0cnVlJyl7CiAgICAgICAgICAgICRhdCArPSAzOwogICAgICAgICAgICBuZXh0X2NocjsKICAgICAgICAgICAgcmV0dXJuICRKU09OOjpQUDo6dHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzaWYoJHdvcmQgZXEgJ251bGwnKXsKICAgICAgICAgICAgJGF0ICs9IDM7CiAgICAgICAgICAgIG5leHRfY2hyOwogICAgICAgICAgICByZXR1cm4gdW5kZWY7CiAgICAgICAgfQogICAgICAgIGVsc2lmKCR3b3JkIGVxICdmYWxzJyl7CiAgICAgICAgICAgICRhdCArPSAzOwogICAgICAgICAgICBpZihzdWJzdHIoJHRleHQsJGF0LDEpIGVxICdlJyl7CiAgICAgICAgICAgICAgICAkYXQrKzsKICAgICAgICAgICAgICAgIG5leHRfY2hyOwogICAgICAgICAgICAgICAgcmV0dXJuICRKU09OOjpQUDo6ZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRhdC0tOyAjIGZvciBkZWNvZGVfZXJyb3IgcmVwb3J0CgogICAgICAgIGRlY29kZV9lcnJvcigiJ251bGwnIGV4cGVjdGVkIikgIGlmICgkd29yZCA9fiAvXm4vKTsKICAgICAgICBkZWNvZGVfZXJyb3IoIid0cnVlJyBleHBlY3RlZCIpICBpZiAoJHdvcmQgPX4gL150Lyk7CiAgICAgICAgZGVjb2RlX2Vycm9yKCInZmFsc2UnIGV4cGVjdGVkIikgaWYgKCR3b3JkID1+IC9eZi8pOwogICAgICAgIGRlY29kZV9lcnJvcigibWFsZm9ybWVkIEpTT04gc3RyaW5nLCBuZWl0aGVyIGFycmF5LCBvYmplY3QsIG51bWJlciwgc3RyaW5nIG9yIGF0b20iKTsKICAgIH0KCgogICAgc3ViIG51bWJlciB7CiAgICAgICAgbXkgJG4gICAgPSAnJzsKICAgICAgICBteSAkdjsKCiAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDNDYyNywgaGV4IG9yIG9jdCBkaWd0cyBhcmUgaW52YWxpZC4KICAgICAgICBpZigkY2ggZXEgJzAnKXsKICAgICAgICAgICAgbXkgJHBlZWsgPSBzdWJzdHIoJHRleHQsJGF0LDEpOwogICAgICAgICAgICBteSAkaGV4ICA9ICRwZWVrID1+IC9beFhdLzsgIyAwIG9yIDEKCiAgICAgICAgICAgIGlmKCRoZXgpewogICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgbnVtYmVyIChsZWFkaW5nIHplcm8gbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkaWdpdCkiKTsKICAgICAgICAgICAgICAgICgkbikgPSAoIHN1YnN0cigkdGV4dCwgJGF0KzEpID1+IC9eKFswLTlhLWZBLUZdKykvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNleyAjIG9jdAogICAgICAgICAgICAgICAgKCRuKSA9ICggc3Vic3RyKCR0ZXh0LCAkYXQpID1+IC9eKFswLTddKykvKTsKICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkICRuIGFuZCBsZW5ndGggJG4gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgbnVtYmVyIChsZWFkaW5nIHplcm8gbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkaWdpdCkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoZGVmaW5lZCAkbiBhbmQgbGVuZ3RoKCRuKSl7CiAgICAgICAgICAgICAgICBpZiAoISRoZXggYW5kIGxlbmd0aCgkbikgPT0gMSkgewogICAgICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgbnVtYmVyIChsZWFkaW5nIHplcm8gbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkaWdpdCkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRhdCArPSBsZW5ndGgoJG4pICsgJGhleDsKICAgICAgICAgICAgICAgIG5leHRfY2hyOwogICAgICAgICAgICAgICAgcmV0dXJuICRoZXggPyBoZXgoJG4pIDogb2N0KCRuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoJGNoIGVxICctJyl7CiAgICAgICAgICAgICRuID0gJy0nOwogICAgICAgICAgICBuZXh0X2NocjsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjaCBvciAkY2ggIX4gL1xkLykgewogICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgbnVtYmVyIChubyBkaWdpdHMgYWZ0ZXIgaW5pdGlhbCBtaW51cykiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd2hpbGUoZGVmaW5lZCAkY2ggYW5kICRjaCA9fiAvXGQvKXsKICAgICAgICAgICAgJG4gLj0gJGNoOwogICAgICAgICAgICBuZXh0X2NocjsKICAgICAgICB9CgogICAgICAgIGlmKGRlZmluZWQgJGNoIGFuZCAkY2ggZXEgJy4nKXsKICAgICAgICAgICAgJG4gLj0gJy4nOwoKICAgICAgICAgICAgbmV4dF9jaHI7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCAkY2ggb3IgJGNoICF+IC9cZC8pIHsKICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcigibWFsZm9ybWVkIG51bWJlciAobm8gZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnQpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkbiAuPSAkY2g7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlKGRlZmluZWQobmV4dF9jaHIpIGFuZCAkY2ggPX4gL1xkLyl7CiAgICAgICAgICAgICAgICAkbiAuPSAkY2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKGRlZmluZWQgJGNoIGFuZCAoJGNoIGVxICdlJyBvciAkY2ggZXEgJ0UnKSl7CiAgICAgICAgICAgICRuIC49ICRjaDsKICAgICAgICAgICAgbmV4dF9jaHI7CgogICAgICAgICAgICBpZihkZWZpbmVkKCRjaCkgYW5kICgkY2ggZXEgJysnIG9yICRjaCBlcSAnLScpKXsKICAgICAgICAgICAgICAgICRuIC49ICRjaDsKICAgICAgICAgICAgICAgIG5leHRfY2hyOwogICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjaCBvciAkY2ggPX4gL1xELykgewogICAgICAgICAgICAgICAgICAgIGRlY29kZV9lcnJvcigibWFsZm9ybWVkIG51bWJlciAobm8gZGlnaXRzIGFmdGVyIGV4cCBzaWduKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG4gLj0gJGNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmKGRlZmluZWQoJGNoKSBhbmQgJGNoID1+IC9cZC8pewogICAgICAgICAgICAgICAgJG4gLj0gJGNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVjb2RlX2Vycm9yKCJtYWxmb3JtZWQgbnVtYmVyIChubyBkaWdpdHMgYWZ0ZXIgZXhwIHNpZ24pIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlKGRlZmluZWQobmV4dF9jaHIpIGFuZCAkY2ggPX4gL1xkLyl7CiAgICAgICAgICAgICAgICAkbiAuPSAkY2g7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAkdiAuPSAkbjsKCiAgICAgICAgaWYgKCR2ICF+IC9bLmVFXS8gYW5kIGxlbmd0aCAkdiA+ICRtYXhfaW50c2l6ZSkgewogICAgICAgICAgICBpZiAoJGFsbG93X2JpZ2ludCkgeyAjIGZyb20gQWRhbSBTdXNzbWFuCiAgICAgICAgICAgICAgICByZXF1aXJlIE1hdGg6OkJpZ0ludDsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoOjpCaWdJbnQtPm5ldygkdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiR2IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoJGFsbG93X2JpZ2ludCkgewogICAgICAgICAgICByZXF1aXJlIE1hdGg6OkJpZ0Zsb2F0OwogICAgICAgICAgICByZXR1cm4gTWF0aDo6QmlnRmxvYXQtPm5ldygkdik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMCskdjsKICAgIH0KCgogICAgc3ViIGlzX3ZhbGlkX3V0ZjggewoKICAgICAgICAkdXRmOF9sZW4gPSAkX1swXSA9fiAvW1x4MDAtXHg3Rl0vICA/IDEKICAgICAgICAgICAgICAgICAgOiAkX1swXSA9fiAvW1x4QzItXHhERl0vICA/IDIKICAgICAgICAgICAgICAgICAgOiAkX1swXSA9fiAvW1x4RTAtXHhFRl0vICA/IDMKICAgICAgICAgICAgICAgICAgOiAkX1swXSA9fiAvW1x4RjAtXHhGNF0vICA/IDQKICAgICAgICAgICAgICAgICAgOiAwCiAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgcmV0dXJuIHVubGVzcyAkdXRmOF9sZW47CgogICAgICAgIG15ICRpc192YWxpZF91dGY4ID0gc3Vic3RyKCR0ZXh0LCAkYXQgLSAxLCAkdXRmOF9sZW4pOwoKICAgICAgICByZXR1cm4gKCAkaXNfdmFsaWRfdXRmOCA9fiAvXig/OgogICAgICAgICAgICAgW1x4MDAtXHg3Rl0KICAgICAgICAgICAgfFtceEMyLVx4REZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEUwXVtceEEwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEUxLVx4RUNdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXQogICAgICAgICAgICB8W1x4RURdW1x4ODAtXHg5Rl1bXHg4MC1ceEJGXQogICAgICAgICAgICB8W1x4RUUtXHhFRl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCiAgICAgICAgICAgIHxbXHhGMF1bXHg5MC1ceEJGXVtceDgwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEYxLVx4RjNdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCiAgICAgICAgICAgIHxbXHhGNF1bXHg4MC1ceDhGXVtceDgwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICApJC94ICkgID8gJGlzX3ZhbGlkX3V0ZjggOiAnJzsKICAgIH0KCgogICAgc3ViIGRlY29kZV9lcnJvciB7CiAgICAgICAgbXkgJGVycm9yICA9IHNoaWZ0OwogICAgICAgIG15ICRub19yZXAgPSBzaGlmdDsKICAgICAgICBteSAkc3RyICAgID0gZGVmaW5lZCAkdGV4dCA/IHN1YnN0cigkdGV4dCwgJGF0KSA6ICcnOwogICAgICAgIG15ICRtZXNzICAgPSAnJzsKICAgICAgICBteSAkdHlwZSAgID0gJF0gPj0gNS4wMDggICAgICAgICAgID8gJ1UqJwogICAgICAgICAgICAgICAgICAgOiAkXSA8ICA1LjAwNiAgICAgICAgICAgPyAnQyonCiAgICAgICAgICAgICAgICAgICA6IHV0Zjg6OmlzX3V0ZjgoICRzdHIgKSA/ICdVKicgIyA1LjYKICAgICAgICAgICAgICAgICAgIDogJ0MqJwogICAgICAgICAgICAgICAgICAgOwoKICAgICAgICBmb3IgbXkgJGMgKCB1bnBhY2soICR0eXBlLCAkc3RyICkgKSB7ICMgZW11bGF0ZSBwdl91bmlfZGlzcGxheSgpID8KICAgICAgICAgICAgJG1lc3MgLj0gICRjID09IDB4MDcgPyAnXGEnCiAgICAgICAgICAgICAgICAgICAgOiAkYyA9PSAweDA5ID8gJ1x0JwogICAgICAgICAgICAgICAgICAgIDogJGMgPT0gMHgwYSA/ICdcbicKICAgICAgICAgICAgICAgICAgICA6ICRjID09IDB4MGQgPyAnXHInCiAgICAgICAgICAgICAgICAgICAgOiAkYyA9PSAweDBjID8gJ1xmJwogICAgICAgICAgICAgICAgICAgIDogJGMgPCAgMHgyMCA/IHNwcmludGYoJ1x4eyV4fScsICRjKQogICAgICAgICAgICAgICAgICAgIDogJGMgPT0gMHg1YyA/ICdcXFxcJwogICAgICAgICAgICAgICAgICAgIDogJGMgPCAgMHg4MCA/IGNocigkYykKICAgICAgICAgICAgICAgICAgICA6IHNwcmludGYoJ1x4eyV4fScsICRjKQogICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgaWYgKCBsZW5ndGggJG1lc3MgPj0gMjAgKSB7CiAgICAgICAgICAgICAgICAkbWVzcyAuPSAnLi4uJzsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHVubGVzcyAoIGxlbmd0aCAkbWVzcyApIHsKICAgICAgICAgICAgJG1lc3MgPSAnKGVuZCBvZiBzdHJpbmcpJzsKICAgICAgICB9CgogICAgICAgIENhcnA6OmNyb2FrICgKICAgICAgICAgICAgJG5vX3JlcCA/ICIkZXJyb3IiIDogIiRlcnJvciwgYXQgY2hhcmFjdGVyIG9mZnNldCAkYXQgKGJlZm9yZSBcIiRtZXNzXCIpIgogICAgICAgICk7CgogICAgfQoKCiAgICBzdWIgX2pzb25fb2JqZWN0X2hvb2sgewogICAgICAgIG15ICRvICAgID0gJF9bMF07CiAgICAgICAgbXkgQGtzID0ga2V5cyAleyRvfTsKCiAgICAgICAgaWYgKCAkY2Jfc2tfb2JqZWN0IGFuZCBAa3MgPT0gMSBhbmQgZXhpc3RzICRjYl9za19vYmplY3QtPnsgJGtzWzBdIH0gYW5kIHJlZiAkY2Jfc2tfb2JqZWN0LT57ICRrc1swXSB9ICkgewogICAgICAgICAgICBteSBAdmFsID0gJGNiX3NrX29iamVjdC0+eyAka3NbMF0gfS0+KCAkby0+eyRrc1swXX0gKTsKICAgICAgICAgICAgaWYgKEB2YWwgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR2YWxbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15IEB2YWwgPSAkY2Jfb2JqZWN0LT4oJG8pIGlmICgkY2Jfb2JqZWN0KTsKICAgICAgICBpZiAoQHZhbCA9PSAwIG9yIEB2YWwgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiAkbzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsWzBdOwogICAgICAgIH0KICAgIH0KCgogICAgc3ViIFBQX2RlY29kZV9ib3ggewogICAgICAgIHsKICAgICAgICAgICAgdGV4dCAgICA9PiAkdGV4dCwKICAgICAgICAgICAgYXQgICAgICA9PiAkYXQsCiAgICAgICAgICAgIGNoICAgICAgPT4gJGNoLAogICAgICAgICAgICBsZW4gICAgID0+ICRsZW4sCiAgICAgICAgICAgIGRlcHRoICAgPT4gJGRlcHRoLAogICAgICAgICAgICBlbmNvZGluZyAgICAgID0+ICRlbmNvZGluZywKICAgICAgICAgICAgaXNfdmFsaWRfdXRmOCA9PiAkaXNfdmFsaWRfdXRmOCwKICAgICAgICB9OwogICAgfQoKfSAjIFBBUlNFCgoKc3ViIF9kZWNvZGVfc3Vycm9nYXRlcyB7ICMgZnJvbSBwZXJsdW5pY29kZQogICAgbXkgJHVuaSA9IDB4MTAwMDAgKyAoaGV4KCRfWzBdKSAtIDB4RDgwMCkgKiAweDQwMCArIChoZXgoJF9bMV0pIC0gMHhEQzAwKTsKICAgIG15ICR1biAgPSBwYWNrKCdVKicsICR1bmkpOwogICAgdXRmODo6ZW5jb2RlKCAkdW4gKTsKICAgIHJldHVybiAkdW47Cn0KCgpzdWIgX2RlY29kZV91bmljb2RlIHsKICAgIG15ICR1biA9IHBhY2soJ1UnLCBoZXggc2hpZnQpOwogICAgdXRmODo6ZW5jb2RlKCAkdW4gKTsKICAgIHJldHVybiAkdW47Cn0KCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVXRpbGl0aWVzCiMKCkJFR0lOIHsKICAgIGV2YWwgJ3JlcXVpcmUgU2NhbGFyOjpVdGlsJzsKICAgIHVubGVzcygkQCl7CiAgICAgICAgKkpTT046OlBQOjpibGVzc2VkID0gXCZTY2FsYXI6OlV0aWw6OmJsZXNzZWQ7CiAgICB9CiAgICBlbHNleyAjIFRoaXMgY29kZSBpcyBmcm9tIFNjbGFyOjpVdGlsLgogICAgICAgICMgd2FybiAkQDsKICAgICAgICBldmFsICdzdWIgVU5JVkVSU0FMOjphX3N1Yl9ub3RfbGlrZWx5X3RvX2JlX2hlcmUgeyByZWYoJF9bMF0pIH0nOwogICAgICAgICpKU09OOjpQUDo6Ymxlc3NlZCA9IHN1YiB7CiAgICAgICAgICAgIGxvY2FsKCRALCAkU0lHe19fRElFX199LCAkU0lHe19fV0FSTl9ffSk7CiAgICAgICAgICAgIHJlZigkX1swXSkgPyBldmFsIHsgJF9bMF0tPmFfc3ViX25vdF9saWtlbHlfdG9fYmVfaGVyZSB9IDogdW5kZWY7CiAgICAgICAgfTsKICAgIH0KfQoKCiMgc2hhbWVseSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gSlNPTjo6WFMgY29kZS4KCiRKU09OOjpQUDo6dHJ1ZSAgPSBkbyB7IGJsZXNzIFwobXkgJGR1bW15ID0gMSksICJKU09OOjpQUDo6Qm9vbGVhbiIgfTsKJEpTT046OlBQOjpmYWxzZSA9IGRvIHsgYmxlc3MgXChteSAkZHVtbXkgPSAwKSwgIkpTT046OlBQOjpCb29sZWFuIiB9OwoKc3ViIGlzX2Jvb2wgeyBkZWZpbmVkICRfWzBdIGFuZCBVTklWRVJTQUw6OmlzYSgkX1swXSwgIkpTT046OlBQOjpCb29sZWFuIik7IH0KCnN1YiB0cnVlICB7ICRKU09OOjpQUDo6dHJ1ZSAgfQpzdWIgZmFsc2UgeyAkSlNPTjo6UFA6OmZhbHNlIH0Kc3ViIG51bGwgIHsgdW5kZWY7IH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBhY2thZ2UgSlNPTjo6UFA6OkJvb2xlYW47CgoKdXNlIG92ZXJsb2FkICgKICAgIjArIiAgICAgPT4gc3ViIHsgJHskX1swXX0gfSwKICAgIisrIiAgICAgPT4gc3ViIHsgJF9bMF0gPSAkeyRfWzBdfSArIDEgfSwKICAgIi0tIiAgICAgPT4gc3ViIHsgJF9bMF0gPSAkeyRfWzBdfSAtIDEgfSwKICAgZmFsbGJhY2sgPT4gMSwKKTsKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpwYWNrYWdlIEpTT046OlBQOjpJbmNyUGFyc2VyOwoKdXNlIHN0cmljdDsKCnVzZSBjb25zdGFudCBJTkNSX01fV1MgICA9PiAwOyAjIGluaXRpYWwgd2hpdGVzcGFjZSBza2lwcGluZwp1c2UgY29uc3RhbnQgSU5DUl9NX1NUUiAgPT4gMTsgIyBpbnNpZGUgc3RyaW5nCnVzZSBjb25zdGFudCBJTkNSX01fQlMgICA9PiAyOyAjIGluc2lkZSBiYWNrc2xhc2gKdXNlIGNvbnN0YW50IElOQ1JfTV9KU09OID0+IDM7ICMgb3V0c2lkZSBhbnl0aGluZywgY291bnQgbmVzdGluZwp1c2UgY29uc3RhbnQgSU5DUl9NX0MwICAgPT4gNDsKdXNlIGNvbnN0YW50IElOQ1JfTV9DMSAgID0+IDU7CgokSlNPTjo6UFA6OkluY3JQYXJzZXI6OlZFUlNJT04gPSAnMS4wMSc7CgpteSAkdW5wYWNrX2Zvcm1hdCA9ICRdIDwgNS4wMDYgPyAnQyonIDogJ1UqJzsKCnN1YiBuZXcgewogICAgbXkgKCAkY2xhc3MgKSA9IEBfOwoKICAgIGJsZXNzIHsKICAgICAgICBpbmNyX25lc3QgICAgPT4gMCwKICAgICAgICBpbmNyX3RleHQgICAgPT4gdW5kZWYsCiAgICAgICAgaW5jcl9wYXJzaW5nID0+IDAsCiAgICAgICAgaW5jcl9wICAgICAgID0+IDAsCiAgICB9LCAkY2xhc3M7Cn0KCgpzdWIgaW5jcl9wYXJzZSB7CiAgICBteSAoICRzZWxmLCAkY29kZXIsICR0ZXh0ICkgPSBAXzsKCiAgICAkc2VsZi0+e2luY3JfdGV4dH0gPSAnJyB1bmxlc3MgKCBkZWZpbmVkICRzZWxmLT57aW5jcl90ZXh0fSApOwoKICAgIGlmICggZGVmaW5lZCAkdGV4dCApIHsKICAgICAgICBpZiAoIHV0Zjg6OmlzX3V0ZjgoICR0ZXh0ICkgYW5kICF1dGY4Ojppc191dGY4KCAkc2VsZi0+e2luY3JfdGV4dH0gKSApIHsKICAgICAgICAgICAgdXRmODo6dXBncmFkZSggJHNlbGYtPntpbmNyX3RleHR9ICkgOwogICAgICAgICAgICB1dGY4OjpkZWNvZGUoICRzZWxmLT57aW5jcl90ZXh0fSApIDsKICAgICAgICB9CiAgICAgICAgJHNlbGYtPntpbmNyX3RleHR9IC49ICR0ZXh0OwogICAgfQoKCiAgICBteSAkbWF4X3NpemUgPSAkY29kZXItPmdldF9tYXhfc2l6ZTsKCiAgICBpZiAoIGRlZmluZWQgd2FudGFycmF5ICkgewoKICAgICAgICAkc2VsZi0+e2luY3JfbW9kZX0gPSBJTkNSX01fV1M7CgogICAgICAgIGlmICggd2FudGFycmF5ICkgewogICAgICAgICAgICBteSBAcmV0OwoKICAgICAgICAgICAgJHNlbGYtPntpbmNyX3BhcnNpbmd9ID0gMTsKCiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHB1c2ggQHJldCwgJHNlbGYtPl9pbmNyX3BhcnNlKCAkY29kZXIsICRzZWxmLT57aW5jcl90ZXh0fSApOwoKICAgICAgICAgICAgICAgIHVubGVzcyAoICEkc2VsZi0+e2luY3JfbmVzdH0gYW5kICRzZWxmLT57aW5jcl9tb2RlfSA9PSBJTkNSX01fSlNPTiApIHsKICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2luY3JfbW9kZX0gPSBJTkNSX01fV1M7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IHVudGlsICggISRzZWxmLT57aW5jcl90ZXh0fSApOwoKICAgICAgICAgICAgJHNlbGYtPntpbmNyX3BhcnNpbmd9ID0gMDsKCiAgICAgICAgICAgIHJldHVybiBAcmV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsgIyBpbiBzY2FsYXIgY29udGV4dAogICAgICAgICAgICAkc2VsZi0+e2luY3JfcGFyc2luZ30gPSAxOwogICAgICAgICAgICBteSAkb2JqID0gJHNlbGYtPl9pbmNyX3BhcnNlKCAkY29kZXIsICRzZWxmLT57aW5jcl90ZXh0fSApOwogICAgICAgICAgICAkc2VsZi0+e2luY3JfcGFyc2luZ30gPSAwIGlmIGRlZmluZWQgJG9iajsgIyBwb2ludGVkIGJ5IE1hcnRpbiBKLiBFdmFucwogICAgICAgICAgICByZXR1cm4gJG9iaiA/ICRvYmogOiB1bmRlZjsgIyAkb2JqIGlzIGFuIGVtcHR5IHN0cmluZywgcGFyc2luZyB3YXMgY29tcGxldGVkLgogICAgICAgIH0KCiAgICB9Cgp9CgoKc3ViIF9pbmNyX3BhcnNlIHsKICAgIG15ICggJHNlbGYsICRjb2RlciwgJHRleHQsICRza2lwICkgPSBAXzsKICAgIG15ICRwID0gJHNlbGYtPntpbmNyX3B9OwogICAgbXkgJHJlc3RvcmUgPSAkcDsKCiAgICBteSBAb2JqOwogICAgbXkgJGxlbiA9IGxlbmd0aCAkdGV4dDsKCiAgICBpZiAoICRzZWxmLT57aW5jcl9tb2RlfSA9PSBJTkNSX01fV1MgKSB7CiAgICAgICAgd2hpbGUgKCAkbGVuID4gJHAgKSB7CiAgICAgICAgICAgIG15ICRzID0gc3Vic3RyKCAkdGV4dCwgJHAsIDEgKTsKICAgICAgICAgICAgJHArKyBhbmQgbmV4dCBpZiAoIDB4MjAgPj0gdW5wYWNrKCR1bnBhY2tfZm9ybWF0LCAkcykgKTsKICAgICAgICAgICAgJHNlbGYtPntpbmNyX21vZGV9ID0gSU5DUl9NX0pTT047CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKCAkbGVuID4gJHAgKSB7CiAgICAgICAgbXkgJHMgPSBzdWJzdHIoICR0ZXh0LCAkcCsrLCAxICk7CgogICAgICAgIGlmICggJHMgZXEgJyInICkgewogICAgICAgICAgICBpZiAoICRzZWxmLT57aW5jcl9tb2RlfSAhPSBJTkNSX01fU1RSICApIHsKICAgICAgICAgICAgICAgICRzZWxmLT57aW5jcl9tb2RlfSA9IElOQ1JfTV9TVFI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e2luY3JfbW9kZX0gPSBJTkNSX01fSlNPTjsKICAgICAgICAgICAgICAgIHVubGVzcyAoICRzZWxmLT57aW5jcl9uZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRzZWxmLT57aW5jcl9tb2RlfSA9PSBJTkNSX01fSlNPTiApIHsKCiAgICAgICAgICAgIGlmICggJHMgZXEgJ1snIG9yICRzIGVxICd7JyApIHsKICAgICAgICAgICAgICAgIGlmICggKyskc2VsZi0+e2luY3JfbmVzdH0gPiAkY29kZXItPmdldF9tYXhfZGVwdGggKSB7CiAgICAgICAgICAgICAgICAgICAgQ2FycDo6Y3JvYWsoJ2pzb24gdGV4dCBvciBwZXJsIHN0cnVjdHVyZSBleGNlZWRzIG1heGltdW0gbmVzdGluZyBsZXZlbCAobWF4X2RlcHRoIHNldCB0b28gbG93PyknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRzIGVxICddJyBvciAkcyBlcSAnfScgKSB7CiAgICAgICAgICAgICAgICBsYXN0IGlmICggLS0kc2VsZi0+e2luY3JfbmVzdH0gPD0gMCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJHMgZXEgJyMnICkgewogICAgICAgICAgICAgICAgd2hpbGUgKCAkbGVuID4gJHAgKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBpZiBzdWJzdHIoICR0ZXh0LCAkcCsrLCAxICkgZXEgIlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgfQoKICAgICRzZWxmLT57aW5jcl9wfSA9ICRwOwoKICAgIHJldHVybiBpZiAoICRzZWxmLT57aW5jcl9tb2RlfSA9PSBJTkNSX01fSlNPTiBhbmQgJHNlbGYtPntpbmNyX25lc3R9ID4gMCApOwoKICAgIHJldHVybiAnJyB1bmxlc3MgKCBsZW5ndGggc3Vic3RyKCAkc2VsZi0+e2luY3JfdGV4dH0sIDAsICRwICkgKTsKCiAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMjsKCiAgICAkc2VsZi0+e2luY3JfcH0gPSAkcmVzdG9yZTsKICAgICRzZWxmLT57aW5jcl9jfSA9ICRwOwoKICAgIG15ICggJG9iaiwgJHRhaWwgKSA9ICRjb2Rlci0+UFBfZGVjb2RlX2pzb24oIHN1YnN0ciggJHNlbGYtPntpbmNyX3RleHR9LCAwLCAkcCApLCAweDEwMDAwMDAxICk7CgogICAgJHNlbGYtPntpbmNyX3RleHR9ID0gc3Vic3RyKCAkc2VsZi0+e2luY3JfdGV4dH0sICRwICk7CiAgICAkc2VsZi0+e2luY3JfcH0gPSAwOwoKICAgIHJldHVybiAkb2JqIG9yICcnOwp9CgoKc3ViIGluY3JfdGV4dCB7CiAgICBpZiAoICRfWzBdLT57aW5jcl9wYXJzaW5nfSApIHsKICAgICAgICBDYXJwOjpjcm9haygiaW5jcl90ZXh0IGNhbiBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGluY3JlbWVudGFsIHBhcnNlciBhbHJlYWR5IHN0YXJ0ZWQgcGFyc2luZyIpOwogICAgfQogICAgJF9bMF0tPntpbmNyX3RleHR9Owp9CgoKc3ViIGluY3Jfc2tpcCB7CiAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICRzZWxmLT57aW5jcl90ZXh0fSA9IHN1YnN0ciggJHNlbGYtPntpbmNyX3RleHR9LCAkc2VsZi0+e2luY3JfY30gKTsKICAgICRzZWxmLT57aW5jcl9wfSA9IDA7Cn0KCgpzdWIgaW5jcl9yZXNldCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgJHNlbGYtPntpbmNyX3RleHR9ICAgID0gdW5kZWY7CiAgICAkc2VsZi0+e2luY3JfcH0gICAgICAgPSAwOwogICAgJHNlbGYtPntpbmNyX21vZGV9ICAgID0gMDsKICAgICRzZWxmLT57aW5jcl9uZXN0fSAgICA9IDA7CiAgICAkc2VsZi0+e2luY3JfcGFyc2luZ30gPSAwOwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKMTsKX19FTkRfXwo9cG9kCgo9aGVhZDEgTkFNRQoKSlNPTjo6UFAgLSBKU09OOjpYUyBjb21wYXRpYmxlIHB1cmUtUGVybCBtb2R1bGUuCgo9aGVhZDEgU1lOT1BTSVMKCiB1c2UgSlNPTjo6UFA7CgogIyBleHBvcnRlZCBmdW5jdGlvbnMsIHRoZXkgY3JvYWsgb24gZXJyb3IKICMgYW5kIGV4cGVjdC9nZW5lcmF0ZSBVVEYtOAoKICR1dGY4X2VuY29kZWRfanNvbl90ZXh0ID0gZW5jb2RlX2pzb24gJHBlcmxfaGFzaF9vcl9hcnJheXJlZjsKICRwZXJsX2hhc2hfb3JfYXJyYXlyZWYgID0gZGVjb2RlX2pzb24gJHV0ZjhfZW5jb2RlZF9qc29uX3RleHQ7CgogIyBPTy1pbnRlcmZhY2UKCiAkY29kZXIgPSBKU09OOjpQUC0+bmV3LT5hc2NpaS0+cHJldHR5LT5hbGxvd19ub25yZWY7CiAkcHJldHR5X3ByaW50ZWRfdW5lbmNvZGVkID0gJGNvZGVyLT5lbmNvZGUgKCRwZXJsX3NjYWxhcik7CiAkcGVybF9zY2FsYXIgPSAkY29kZXItPmRlY29kZSAoJHVuaWNvZGVfanNvbl90ZXh0KTsKCiAjIE5vdGUgdGhhdCBKU09OIHZlcnNpb24gMi4wIGFuZCBhYm92ZSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlCiAjIEpTT046OlhTIG9yIEpTT046OlBQLCBzbyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdDoKIAogdXNlIEpTT047Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIGlzIEw8SlNPTjo6WFM+IGNvbXBhdGlibGUgcHVyZSBQZXJsIG1vZHVsZS4KKFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlY29tbWVuZGVkKQoKSlNPTjo6WFMgaXMgdGhlIGZhc3Rlc3QgYW5kIG1vc3QgcHJvcGVyIEpTT04gbW9kdWxlIG9uIENQQU4uCkl0IGlzIHdyaXR0ZW4gYnkgTWFyYyBMZWhtYW5uIGluIEMsIHNvIG11c3QgYmUgY29tcGlsZWQgYW5kCmluc3RhbGxlZCBpbiB0aGUgdXNlZCBlbnZpcm9ubWVudC4KCkpTT046OlBQIGlzIGEgcHVyZS1QZXJsIG1vZHVsZSBhbmQgaGFzIGNvbXBhdGliaWxpdHkgdG8gSlNPTjo6WFMuCgoKPWhlYWQyIEZFQVRVUkVTCgo9b3ZlcgoKPWl0ZW0gKiBjb3JyZWN0IHVuaWNvZGUgaGFuZGxpbmcKClRoaXMgbW9kdWxlIGtub3dzIGhvdyB0byBoYW5kbGUgVW5pY29kZSAoZGVwZW5kaW5nIG9uIFBlcmwgdmVyc2lvbikuCgpTZWUgdG8gTDxKU09OOjpYUy9BIEZFVyBOT1RFUyBPTiBVTklDT0RFIEFORCBQRVJMPiBhbmQgTDxVTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTPi4KCgo9aXRlbSAqIHJvdW5kLXRyaXAgaW50ZWdyaXR5CgpXaGVuIHlvdSBzZXJpYWxpc2UgYSBwZXJsIGRhdGEgc3RydWN0dXJlIHVzaW5nIG9ubHkgZGF0YSB0eXBlcyBzdXBwb3J0ZWQKYnkgSlNPTiBhbmQgUGVybCwgdGhlIGRlc2VyaWFsaXNlZCBkYXRhIHN0cnVjdHVyZSBpcyBpZGVudGljYWwgb24gdGhlIFBlcmwKbGV2ZWwuIChlLmcuIHRoZSBzdHJpbmcgIjIuMCIgZG9lc24ndCBzdWRkZW5seSBiZWNvbWUgIjIiIGp1c3QgYmVjYXVzZQppdCBsb29rcyBsaWtlIGEgbnVtYmVyKS4gVGhlcmUgSTxhcmU+IG1pbm9yIGV4Y2VwdGlvbnMgdG8gdGhpcywgcmVhZCB0aGUKTUFQUElORyBzZWN0aW9uIGJlbG93IHRvIGxlYXJuIGFib3V0IHRob3NlLgoKCj1pdGVtICogc3RyaWN0IGNoZWNraW5nIG9mIEpTT04gY29ycmVjdG5lc3MKClRoZXJlIGlzIG5vIGd1ZXNzaW5nLCBubyBnZW5lcmF0aW5nIG9mIGlsbGVnYWwgSlNPTiB0ZXh0cyBieSBkZWZhdWx0LAphbmQgb25seSBKU09OIGlzIGFjY2VwdGVkIGFzIGlucHV0IGJ5IGRlZmF1bHQgKHRoZSBsYXR0ZXIgaXMgYSBzZWN1cml0eSBmZWF0dXJlKS4KQnV0IHdoZW4gc29tZSBvcHRpb25zIGFyZSBzZXQsIGxvb3NlIGNoY2tpbmcgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZS4KCj1iYWNrCgo9aGVhZDEgRlVOQ1RJT05TCgpCYXNpY2FsbHksIGNoZWNrIHRvIEw8SlNPTj4gb3IgTDxKU09OOjpYUz4uCgo9aGVhZDIgZW5jb2RlX2pzb24KCiAgICAkanNvbl90ZXh0ID0gZW5jb2RlX2pzb24gJHBlcmxfc2NhbGFyCgo9aGVhZDIgZGVjb2RlX2pzb24KCiAgICAkcGVybF9zY2FsYXIgPSBkZWNvZGVfanNvbiAkanNvbl90ZXh0Cgo9aGVhZDIgSlNPTjo6UFA6OnRydWUKClJldHVybnMgSlNPTiB0cnVlIHZhbHVlIHdoaWNoIGlzIGJsZXNzZWQgb2JqZWN0LgpJdCBDPGlzYT4gSlNPTjo6UFA6OkJvb2xlYW4gb2JqZWN0LgoKPWhlYWQyIEpTT046OlBQOjpmYWxzZQoKUmV0dXJucyBKU09OIGZhbHNlIHZhbHVlIHdoaWNoIGlzIGJsZXNzZWQgb2JqZWN0LgpJdCBDPGlzYT4gSlNPTjo6UFA6OkJvb2xlYW4gb2JqZWN0LgoKPWhlYWQyIEpTT046OlBQOjpudWxsCgpSZXR1cm5zIEM8dW5kZWY+LgoKPWhlYWQxIE1FVEhPRFMKCkJhc2ljYWxseSwgY2hlY2sgdG8gTDxKU09OPiBvciBMPEpTT046OlhTPi4KCj1oZWFkMiBuZXcKCiAgICAkanNvbiA9IG5ldyBKU09OOjpQUAoKUnR1cm5zIGEgbmV3IEpTT046OlBQIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlL2VuY29kZSBKU09OCnN0cmluZ3MuCgo9aGVhZDIgYXNjaWkKCiAgICAkanNvbiA9ICRqc29uLT5hc2NpaShbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9hc2NpaQoKSWYgJGVuYWJsZSBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiB0aGUgZW5jb2RlIG1ldGhvZCB3aWxsIG5vdCBnZW5lcmF0ZSBjaGFyYWN0ZXJzIG91dHNpZGUKdGhlIGNvZGUgcmFuZ2UgMC4uMTI3LiBBbnkgVW5pY29kZSBjaGFyYWN0ZXJzIG91dHNpZGUgdGhhdCByYW5nZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcgZWl0aGVyCmEgc2luZ2xlIFx1WFhYWCBvciBhIGRvdWJsZSBcdUhISEhcdUxMTExMIGVzY2FwZSBzZXF1ZW5jZSwgYXMgcGVyIFJGQzQ2MjcuCihTZWUgdG8gTDxKU09OOjpYUy9PQkpFQ1QtT1JJRU5URUQgSU5URVJGQUNFPikuCgpJbiBQZXJsIDUuMDA1LCB0aGVyZSBpcyBubyBjaGFyYWN0ZXIgaGF2aW5nIGhpZ2ggdmFsdWUgKG1vcmUgdGhhbiAyNTUpLgpTZWUgdG8gTDxVTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTPi4KCklmICRlbmFibGUgaXMgZmFsc2UsIHRoZW4gdGhlIGVuY29kZSBtZXRob2Qgd2lsbCBub3QgZXNjYXBlIFVuaWNvZGUgY2hhcmFjdGVycyB1bmxlc3MKcmVxdWlyZWQgYnkgdGhlIEpTT04gc3ludGF4IG9yIG90aGVyIGZsYWdzLiBUaGlzIHJlc3VsdHMgaW4gYSBmYXN0ZXIgYW5kIG1vcmUgY29tcGFjdCBmb3JtYXQuCgogIEpTT046OlBQLT5uZXctPmFzY2lpKDEpLT5lbmNvZGUoW2NociAweDEwNDAxXSkKICA9PiBbIlx1ZDgwMVx1ZGMwMSJdCgo9aGVhZDIgbGF0aW4xCgogICAgJGpzb24gPSAkanNvbi0+bGF0aW4xKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2xhdGluMQoKSWYgJGVuYWJsZSBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiB0aGUgZW5jb2RlIG1ldGhvZCB3aWxsIGVuY29kZSB0aGUgcmVzdWx0aW5nIEpTT04KdGV4dCBhcyBsYXRpbjEgKG9yIGlzby04ODU5LTEpLCBlc2NhcGluZyBhbnkgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBjb2RlIHJhbmdlIDAuLjI1NS4KCklmICRlbmFibGUgaXMgZmFsc2UsIHRoZW4gdGhlIGVuY29kZSBtZXRob2Qgd2lsbCBub3QgZXNjYXBlIFVuaWNvZGUgY2hhcmFjdGVycwp1bmxlc3MgcmVxdWlyZWQgYnkgdGhlIEpTT04gc3ludGF4IG9yIG90aGVyIGZsYWdzLgoKICBKU09OOjpYUy0+bmV3LT5sYXRpbjEtPmVuY29kZSAoWyJceHs4OX1ceHthYmN9Il0KICA9PiBbIlx4ezg5fVxcdTBhYmMiXSAgICAjIChwZXJsIHN5bnRheCwgVSthYmMgZXNjYXBlZCwgVSs4OSBub3QpCgpTZWUgdG8gTDxVTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTPi4KCj1oZWFkMiB1dGY4CgogICAgJGpzb24gPSAkanNvbi0+dXRmOChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF91dGY4CgpJZiAkZW5hYmxlIGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIHRoZSBlbmNvZGUgbWV0aG9kIHdpbGwgZW5jb2RlIHRoZSBKU09OIHJlc3VsdAppbnRvIFVURi04LCBhcyByZXF1aXJlZCBieSBtYW55IHByb3RvY29scywgd2hpbGUgdGhlIGRlY29kZSBtZXRob2QgZXhwZWN0cyB0byBiZSBoYW5kbGVkCmFuIFVURi04LWVuY29kZWQgc3RyaW5nLiBQbGVhc2Ugbm90ZSB0aGF0IFVURi04LWVuY29kZWQgc3RyaW5ncyBkbyBub3QgY29udGFpbiBhbnkKY2hhcmFjdGVycyBvdXRzaWRlIHRoZSByYW5nZSAwLi4yNTUsIHRoZXkgYXJlIHRodXMgdXNlZnVsIGZvciBieXRld2lzZS9iaW5hcnkgSS9PLgoKKEluIFBlcmwgNS4wMDUsIGFueSBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgcmFuZ2UgMC4uMjU1IGRvZXMgbm90IGV4aXN0LgpTZWUgdG8gTDxVTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTPi4pCgpJbiBmdXR1cmUgdmVyc2lvbnMsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1pZ2h0IGVuYWJsZSBhdXRvZGV0ZWN0aW9uIG9mIHRoZSBVVEYtMTYgYW5kIFVURi0zMgplbmNvZGluZyBmYW1pbGllcywgYXMgZGVzY3JpYmVkIGluIFJGQzQ2MjcuCgpJZiAkZW5hYmxlIGlzIGZhbHNlLCB0aGVuIHRoZSBlbmNvZGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBKU09OIHN0cmluZyBhcyBhIChub24tZW5jb2RlZCkKVW5pY29kZSBzdHJpbmcsIHdoaWxlIGRlY29kZSBleHBlY3RzIHRodXMgYSBVbmljb2RlIHN0cmluZy4gQW55IGRlY29kaW5nIG9yIGVuY29kaW5nCihlLmcuIHRvIFVURi04IG9yIFVURi0xNikgbmVlZHMgdG8gYmUgZG9uZSB5b3Vyc2VsZiwgZS5nLiB1c2luZyB0aGUgRW5jb2RlIG1vZHVsZS4KCkV4YW1wbGUsIG91dHB1dCBVVEYtMTZCRS1lbmNvZGVkIEpTT046CgogIHVzZSBFbmNvZGU7CiAgJGpzb250ZXh0ID0gZW5jb2RlICJVVEYtMTZCRSIsIEpTT046OlhTLT5uZXctPmVuY29kZSAoJG9iamVjdCk7CgpFeGFtcGxlLCBkZWNvZGUgVVRGLTMyTEUtZW5jb2RlZCBKU09OOgoKICB1c2UgRW5jb2RlOwogICRvYmplY3QgPSBKU09OOjpYUy0+bmV3LT5kZWNvZGUgKGRlY29kZSAiVVRGLTMyTEUiLCAkanNvbnRleHQpOwoKCj1oZWFkMiBwcmV0dHkKCiAgICAkanNvbiA9ICRqc29uLT5wcmV0dHkoWyRlbmFibGVdKQoKVGhpcyBlbmFibGVzIChvciBkaXNhYmxlcykgYWxsIG9mIHRoZSBDPGluZGVudD4sIEM8c3BhY2VfYmVmb3JlPiBhbmQKQzxzcGFjZV9hZnRlcj4gZmxhZ3MgaW4gb25lIGNhbGwgdG8gZ2VuZXJhdGUgdGhlIG1vc3QgcmVhZGFibGUKKG9yIG1vc3QgY29tcGFjdCkgZm9ybSBwb3NzaWJsZS4KCj1oZWFkMiBpbmRlbnQKCiAgICAkanNvbiA9ICRqc29uLT5pbmRlbnQoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfaW5kZW50CgpUaGUgZGVmYXVsdCBpbmRlbnQgc3BhY2UgbGVuZ3RoIGlzIHRocmVlLgpZb3UgY2FuIHVzZSBDPGluZGVudF9sZW5ndGg+IHRvIGNoYW5nZSB0aGUgbGVuZ3RoLgoKPWhlYWQyIHNwYWNlX2JlZm9yZQoKICAgICRqc29uID0gJGpzb24tPnNwYWNlX2JlZm9yZShbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9zcGFjZV9iZWZvcmUKCj1oZWFkMiBzcGFjZV9hZnRlcgoKICAgICRqc29uID0gJGpzb24tPnNwYWNlX2FmdGVyKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X3NwYWNlX2FmdGVyCgo9aGVhZDIgcmVsYXhlZAoKICAgICRqc29uID0gJGpzb24tPnJlbGF4ZWQoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfcmVsYXhlZAoKPWhlYWQyIGNhbm9uaWNhbAoKICAgICRqc29uID0gJGpzb24tPmNhbm9uaWNhbChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9jYW5vbmljYWwKCklmIHlvdSB3YW50IHlvdXIgb3duIHNvcnRpbmcgcm91dGluZSwgeW91IGNhbiBnaXZlIGEgY29kZSByZWZlcmVjZQpvciBhIHN1YnJvdXRpbmUgbmFtZSB0byBDPHNvcnRfYnk+LiBTZWUgdG8gQzxKU09OOjpQUCBPV04gTUVUSE9EUz4uCgo9aGVhZDIgYWxsb3dfbm9ucmVmCgogICAgJGpzb24gPSAkanNvbi0+YWxsb3dfbm9ucmVmKFskZW5hYmxlXSkKICAgIAogICAgJGVuYWJsZWQgPSAkanNvbi0+Z2V0X2FsbG93X25vbnJlZgoKPWhlYWQyIGFsbG93X3Vua25vd24KCiAgICAkanNvbiA9ICRqc29uLT5hbGxvd191bmtub3duIChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9hbGxvd191bmtub3duCgo9aGVhZDIgYWxsb3dfYmxlc3NlZAoKICAgICRqc29uID0gJGpzb24tPmFsbG93X2JsZXNzZWQoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfYWxsb3dfYmxlc3NlZAoKPWhlYWQyIGNvbnZlcnRfYmxlc3NlZAoKICAgICRqc29uID0gJGpzb24tPmNvbnZlcnRfYmxlc3NlZChbJGVuYWJsZV0pCiAgICAKICAgICRlbmFibGVkID0gJGpzb24tPmdldF9jb252ZXJ0X2JsZXNzZWQKCj1oZWFkMiBmaWx0ZXJfanNvbl9vYmplY3QKCiAgICAkanNvbiA9ICRqc29uLT5maWx0ZXJfanNvbl9vYmplY3QoWyRjb2RlcmVmXSkKCj1oZWFkMiBmaWx0ZXJfanNvbl9zaW5nbGVfa2V5X29iamVjdAoKICAgICRqc29uID0gJGpzb24tPmZpbHRlcl9qc29uX3NpbmdsZV9rZXlfb2JqZWN0KCRrZXkgWz0+ICRjb2RlcmVmXSkKCj1oZWFkMiBzaHJpbmsKCiAgICAkanNvbiA9ICRqc29uLT5zaHJpbmsoWyRlbmFibGVdKQogICAgCiAgICAkZW5hYmxlZCA9ICRqc29uLT5nZXRfc2hyaW5rCgpJbiBKU09OOjpYUywgdGhpcyBmbGFnIHJlc2l6ZXMgc3RyaW5ncyBnZW5lcmF0ZWQgYnkgZWl0aGVyCkM8ZW5jb2RlPiBvciBDPGRlY29kZT4gdG8gdGhlaXIgbWluaW11bSBzaXplIHBvc3NpYmxlLgpJdCB3aWxsIGFsc28gdHJ5IHRvIGRvd25ncmFkZSBhbnkgc3RyaW5ncyB0byBvY3RldC1mb3JtIGlmIHBvc3NpYmxlLgoKSW4gSlNPTjo6UFAsIGl0IGlzIG5vb3AgYWJvdXQgcmVzaXppbmcgc3RyaW5ncyBidXQgdHJpZXMKQzx1dGY4Ojpkb3duZ3JhZGU+IHRvIHRoZSByZXR1cm5lZCBzdHJpbmcgYnkgQzxlbmNvZGU+LgpTZWUgdG8gTDx1dGY4Pi4KClNlZSB0byBMPEpTT046OlhTL09CSkVDVC1PUklFTlRFRCBJTlRFUkZBQ0U+Cgo9aGVhZDIgbWF4X2RlcHRoCgogICAgJGpzb24gPSAkanNvbi0+bWF4X2RlcHRoKFskbWF4aW11bV9uZXN0aW5nX2RlcHRoXSkKICAgIAogICAgJG1heF9kZXB0aCA9ICRqc29uLT5nZXRfbWF4X2RlcHRoCgpTZXRzIHRoZSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgKGRlZmF1bHQgQzw1MTI+KSBhY2NlcHRlZCB3aGlsZSBlbmNvZGluZwpvciBkZWNvZGluZy4gSWYgYSBoaWdoZXIgbmVzdGluZyBsZXZlbCBpcyBkZXRlY3RlZCBpbiBKU09OIHRleHQgb3IgYSBQZXJsCmRhdGEgc3RydWN0dXJlLCB0aGVuIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyIHdpbGwgc3RvcCBhbmQgY3JvYWsgYXQgdGhhdApwb2ludC4KCk5lc3RpbmcgbGV2ZWwgaXMgZGVmaW5lZCBieSBudW1iZXIgb2YgaGFzaC0gb3IgYXJyYXlyZWZzIHRoYXQgdGhlIGVuY29kZXIKbmVlZHMgdG8gdHJhdmVyc2UgdG8gcmVhY2ggYSBnaXZlbiBwb2ludCBvciB0aGUgbnVtYmVyIG9mIEM8ez4gb3IgQzxbPgpjaGFyYWN0ZXJzIHdpdGhvdXQgdGhlaXIgbWF0Y2hpbmcgY2xvc2luZyBwYXJlbnRoZXNpcyBjcm9zc2VkIHRvIHJlYWNoIGEKZ2l2ZW4gY2hhcmFjdGVyIGluIGEgc3RyaW5nLgoKSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHNldHRpbmcgd2lsbCBiZSB1c2VkLCB3aGljaAppcyByYXJlbHkgdXNlZnVsLgoKU2VlIEw8SlNPTjo6WFMvU1NFQ1VSSVRZIENPTlNJREVSQVRJT05TPiBmb3IgbW9yZSBpbmZvIG9uIHdoeSB0aGlzIGlzIHVzZWZ1bC4KCldoZW4gYSBsYXJnZSB2YWx1ZSAoMTAwIG9yIG1vcmUpIHdhcyBzZXQgYW5kIGl0IGRlL2VuY29kZXMgYSBkZWVwIG5lc3RlZCBvYmplY3QvdGV4dCwKaXQgbWF5IHJhaXNlIGEgd2FybmluZyAnRGVlcCByZWN1cnNpb24gb24gc3Vicm91dGluJyBhdCB0aGUgcGVybCBydW50aW1lIHBoYXNlLgoKPWhlYWQyIG1heF9zaXplCgogICAgJGpzb24gPSAkanNvbi0+bWF4X3NpemUoWyRtYXhpbXVtX3N0cmluZ19zaXplXSkKICAgIAogICAgJG1heF9zaXplID0gJGpzb24tPmdldF9tYXhfc2l6ZQoKU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBhIEpTT04gdGV4dCBtYXkgaGF2ZSAoaW4gYnl0ZXMpIHdoZXJlIGRlY29kaW5nIGlzCmJlaW5nIGF0dGVtcHRlZC4gVGhlIGRlZmF1bHQgaXMgQzwwPiwgbWVhbmluZyBubyBsaW1pdC4gV2hlbiBDPGRlY29kZT4KaXMgY2FsbGVkIG9uIGEgc3RyaW5nIHRoYXQgaXMgbG9uZ2VyIHRoZW4gdGhpcyBtYW55IGJ5dGVzLCBpdCB3aWxsIG5vdAphdHRlbXB0IHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ1dCB0aHJvdyBhbiBleGNlcHRpb24uIFRoaXMgc2V0dGluZyBoYXMgbm8KZWZmZWN0IG9uIEM8ZW5jb2RlPiAoeWV0KS4KCklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgbGltaXQgY2hlY2sgd2lsbCBiZSBkZWFjdGl2YXRlZCAoc2FtZSBhcyB3aGVuCkM8MD4gaXMgc3BlY2lmaWVkKS4KClNlZSBMPEpTT046OlhTL1NTRUNVUklUWSBDT05TSURFUkFUSU9OUz4gZm9yIG1vcmUgaW5mbyBvbiB3aHkgdGhpcyBpcyB1c2VmdWwuCgo9aGVhZDIgZW5jb2RlCgogICAgJGpzb25fdGV4dCA9ICRqc29uLT5lbmNvZGUoJHBlcmxfc2NhbGFyKQoKPWhlYWQyIGRlY29kZQoKICAgICRwZXJsX3NjYWxhciA9ICRqc29uLT5kZWNvZGUoJGpzb25fdGV4dCkKCj1oZWFkMiBkZWNvZGVfcHJlZml4CgogICAgKCRwZXJsX3NjYWxhciwgJGNoYXJhY3RlcnMpID0gJGpzb24tPmRlY29kZV9wcmVmaXgoJGpzb25fdGV4dCkKCgo9aGVhZDEgSU5DUkVNRU5UQUwgUEFSU0lORwoKTW9zdCBvZiB0aGlzIHNlY3Rpb24gYXJlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBMPEpTT046OlhTL0lOQ1JFTUVOVEFMIFBBUlNJTkc+LgoKSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgdGhlIG5lZWQgZm9yIGluY3JlbWVudGFsIHBhcnNpbmcgb2YgSlNPTiB0ZXh0cy4KVGhpcyBtb2R1bGUgZG9lcyBhbGxvdyB5b3UgdG8gcGFyc2UgYSBKU09OIHN0cmVhbSBpbmNyZW1lbnRhbGx5LgpJdCBkb2VzIHNvIGJ5IGFjY3VtdWxhdGluZyB0ZXh0IHVudGlsIGl0IGhhcyBhIGZ1bGwgSlNPTiBvYmplY3QsIHdoaWNoCml0IHRoZW4gY2FuIGRlY29kZS4gVGhpcyBwcm9jZXNzIGlzIHNpbWlsYXIgdG8gdXNpbmcgQzxkZWNvZGVfcHJlZml4Pgp0byBzZWUgaWYgYSBmdWxsIEpTT04gb2JqZWN0IGlzIGF2YWlsYWJsZSwgYnV0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQKKGFuZCBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aCBhIG1pbmltdW0gb2YgbWV0aG9kIGNhbGxzKS4KClRoaXMgbW9kdWxlIHdpbGwgb25seSBhdHRlbXB0IHRvIHBhcnNlIHRoZSBKU09OIHRleHQgb25jZSBpdCBpcyBzdXJlIGl0CmhhcyBlbm91Z2ggdGV4dCB0byBnZXQgYSBkZWNpc2l2ZSByZXN1bHQsIHVzaW5nIGEgdmVyeSBzaW1wbGUgYnV0CnRydWx5IGluY3JlbWVudGFsIHBhcnNlci4gVGhpcyBtZWFucyB0aGF0IGl0IHNvbWV0aW1lcyB3b24ndCBzdG9wIGFzCmVhcmx5IGFzIHRoZSBmdWxsIHBhcnNlciwgZm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgZGV0ZWN0IHBhcmVudGhlc2UKbWlzbWF0Y2hlcy4gVGhlIG9ubHkgdGhpbmcgaXQgZ3VhcmFudGVlcyBpcyB0aGF0IGl0IHN0YXJ0cyBkZWNvZGluZyBhcwpzb29uIGFzIGEgc3ludGFjdGljYWxseSB2YWxpZCBKU09OIHRleHQgaGFzIGJlZW4gc2Vlbi4gVGhpcyBtZWFucyB5b3UgbmVlZAp0byBzZXQgcmVzb3VyY2UgbGltaXRzIChlLmcuIEM8bWF4X3NpemU+KSB0byBlbnN1cmUgdGhlIHBhcnNlciB3aWxsIHN0b3AKcGFyc2luZyBpbiB0aGUgcHJlc2VuY2UgaWYgc3ludGF4IGVycm9ycy4KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsZW1lbnQgdGhpcyBpbmNyZW1lbnRhbCBwYXJzZXIuCgo9aGVhZDIgaW5jcl9wYXJzZQoKICAgICRqc29uLT5pbmNyX3BhcnNlKCBbJHN0cmluZ10gKSAjIHZvaWQgY29udGV4dAogICAgCiAgICAkb2JqX29yX3VuZGVmID0gJGpzb24tPmluY3JfcGFyc2UoIFskc3RyaW5nXSApICMgc2NhbGFyIGNvbnRleHQKICAgIAogICAgQG9ial9vcl9lbXB0eSA9ICRqc29uLT5pbmNyX3BhcnNlKCBbJHN0cmluZ10gKSAjIGxpc3QgY29udGV4dAoKVGhpcyBpcyB0aGUgY2VudHJhbCBwYXJzaW5nIGZ1bmN0aW9uLiBJdCBjYW4gYm90aCBhcHBlbmQgbmV3IHRleHQgYW5kCmV4dHJhY3Qgb2JqZWN0cyBmcm9tIHRoZSBzdHJlYW0gYWNjdW11bGF0ZWQgc28gZmFyIChib3RoIG9mIHRoZXNlCmZ1bmN0aW9ucyBhcmUgb3B0aW9uYWwpLgoKSWYgQzwkc3RyaW5nPiBpcyBnaXZlbiwgdGhlbiB0aGlzIHN0cmluZyBpcyBhcHBlbmRlZCB0byB0aGUgYWxyZWFkeQpleGlzdGluZyBKU09OIGZyYWdtZW50IHN0b3JlZCBpbiB0aGUgQzwkanNvbj4gb2JqZWN0LgoKQWZ0ZXIgdGhhdCwgaWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB2b2lkIGNvbnRleHQsIGl0IHdpbGwgc2ltcGx5CnJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nIGZ1cnRoZXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIG1vcmUgdGV4dAppbiBhcyBtYW55IGNodW5rcyBhcyB5b3Ugd2FudC4KCklmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0LCB0aGVuIGl0IHdpbGwgdHJ5IHRvIGV4dHJhY3QKZXhhY3RseSBJPG9uZT4gSlNPTiBvYmplY3QuIElmIHRoYXQgaXMgc3VjY2Vzc2Z1bCwgaXQgd2lsbCByZXR1cm4gdGhpcwpvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBDPHVuZGVmPi4gSWYgdGhlcmUgaXMgYSBwYXJzZSBlcnJvciwKdGhpcyBtZXRob2Qgd2lsbCBjcm9hayBqdXN0IGFzIEM8ZGVjb2RlPiB3b3VsZCBkbyAob25lIGNhbiB0aGVuIHVzZQpDPGluY3Jfc2tpcD4gdG8gc2tpcCB0aGUgZXJyb3Jub3VzIHBhcnQpLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgb2YKdXNpbmcgdGhlIG1ldGhvZC4KCkFuZCBmaW5hbGx5LCBpbiBsaXN0IGNvbnRleHQsIGl0IHdpbGwgdHJ5IHRvIGV4dHJhY3QgYXMgbWFueSBvYmplY3RzCmZyb20gdGhlIHN0cmVhbSBhcyBpdCBjYW4gZmluZCBhbmQgcmV0dXJuIHRoZW0sIG9yIHRoZSBlbXB0eSBsaXN0Cm90aGVyd2lzZS4gRm9yIHRoaXMgdG8gd29yaywgdGhlcmUgbXVzdCBiZSBubyBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIEpTT04Kb2JqZWN0cyBvciBhcnJheXMsIGluc3RlYWQgdGhleSBtdXN0IGJlIGNvbmNhdGVuYXRlZCBiYWNrLXRvLWJhY2suIElmCmFuIGVycm9yIG9jY3VycywgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGFzIGluIHRoZSBzY2FsYXIgY29udGV4dApjYXNlLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCBhbnkgcHJldmlvdXNseS1wYXJzZWQgSlNPTiB0ZXh0cyB3aWxsIGJlCmxvc3QuCgpFeGFtcGxlOiBQYXJzZSBzb21lIEpTT04gYXJyYXlzL29iamVjdHMgaW4gYSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybiB0aGVtLgoKICAgIG15IEBvYmpzID0gSlNPTi0+bmV3LT5pbmNyX3BhcnNlICgiWzVdWzddWzEsMl0iKTsKCj1oZWFkMiBpbmNyX3RleHQKCiAgICAkbHZhbHVlX3N0cmluZyA9ICRqc29uLT5pbmNyX3RleHQKClRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnRseSBzdG9yZWQgSlNPTiBmcmFnbWVudCBhcyBhbiBsdmFsdWUsIHRoYXQKaXMsIHlvdSBjYW4gbWFuaXB1bGF0ZSBpdC4gVGhpcyBJPG9ubHk+IHdvcmtzIHdoZW4gYSBwcmVjZWRpbmcgY2FsbCB0bwpDPGluY3JfcGFyc2U+IGluIEk8c2NhbGFyIGNvbnRleHQ+IHN1Y2Nlc3NmdWxseSByZXR1cm5lZCBhbiBvYmplY3QuIFVuZGVyCmFsbCBvdGhlciBjaXJjdW1zdGFuY2VzIHlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gKEkgbWVhbiBpdC4KYWx0aG91Z2ggaW4gc2ltcGxlIHRlc3RzIGl0IG1pZ2h0IGFjdHVhbGx5IHdvcmssIGl0IEk8d2lsbD4gZmFpbCB1bmRlcgpyZWFsIHdvcmxkIGNvbmRpdGlvbnMpLiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgY2FuIGFsc28gY2FsbCB0aGlzCm1ldGhvZCBiZWZvcmUgaGF2aW5nIHBhcnNlZCBhbnl0aGluZy4KClRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGluIHR3byBjYXNlczogYSkgZmluZGluZyB0aGUgdHJhaWxpbmcgdGV4dCBhZnRlciBhCkpTT04gb2JqZWN0IG9yIGIpIHBhcnNpbmcgbXVsdGlwbGUgSlNPTiBvYmplY3RzIHNlcGFyYXRlZCBieSBub24tSlNPTiB0ZXh0CihzdWNoIGFzIGNvbW1hcykuCgogICAgJGpzb24tPmluY3JfdGV4dCA9fiBzL1xzKixccyovLzsKCkluIFBlcmwgNS4wMDUsIEM8bHZhbHVlPiBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZS4KWW91IG11c3Qgd3JpdGUgY29kZXMgbGlrZSB0aGUgYmVsb3c6CgogICAgJHN0cmluZyA9ICRqc29uLT5pbmNyX3RleHQ7CiAgICAkc3RyaW5nID1+IHMvXHMqLFxzKi8vOwogICAgJGpzb24tPmluY3JfdGV4dCggJHN0cmluZyApOwoKPWhlYWQyIGluY3Jfc2tpcAoKICAgICRqc29uLT5pbmNyX3NraXAKClRoaXMgd2lsbCByZXNldCB0aGUgc3RhdGUgb2YgdGhlIGluY3JlbWVudGFsIHBhcnNlciBhbmQgd2lsbCByZW1vdmUgdGhlCnBhcnNlZCB0ZXh0IGZyb20gdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgQzxpbmNyX3BhcnNlPgpkaWVkLCBpbiB3aGljaCBjYXNlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGluY3JlbWVudGFsIHBhcnNlciBzdGF0ZSBpcyBsZWZ0CnVuY2hhbmdlZCwgdG8gc2tpcCB0aGUgdGV4dCBwYXJzZWQgc28gZmFyIGFuZCB0byByZXNldCB0aGUgcGFyc2Ugc3RhdGUuCgo9aGVhZDIgaW5jcl9yZXNldAoKICAgICRqc29uLT5pbmNyX3Jlc2V0CgpUaGlzIGNvbXBsZXRlbHkgcmVzZXRzIHRoZSBpbmNyZW1lbnRhbCBwYXJzZXIsIHRoYXQgaXMsIGFmdGVyIHRoaXMgY2FsbCwKaXQgd2lsbCBiZSBhcyBpZiB0aGUgcGFyc2VyIGhhZCBuZXZlciBwYXJzZWQgYW55dGhpbmcuCgpUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCBvdCByZXBlYXRlZGx5IHBhcnNlIEpTT04gb2JqZWN0cyBhbmQgd2FudCB0bwppZ25vcmUgYW55IHRyYWlsaW5nIGRhdGEsIHdoaWNoIG1lYW5zIHlvdSBoYXZlIHRvIHJlc2V0IHRoZSBwYXJzZXIgYWZ0ZXIKZWFjaCBzdWNjZXNzZnVsIGRlY29kZS4KClNlZSB0byBMPEpTT046OlhTL0lOQ1JFTUVOVEFMIFBBUlNJTkc+IGZvciBleGFtcGxlcy4KCgo9aGVhZDEgSlNPTjo6UFAgT1dOIE1FVEhPRFMKCj1oZWFkMiBhbGxvd19zaW5nbGVxdW90ZQoKICAgICRqc29uID0gJGpzb24tPmFsbG93X3NpbmdsZXF1b3RlKFskZW5hYmxlXSkKCklmIEM8JGVuYWJsZT4gaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gQzxkZWNvZGU+IHdpbGwgYWNjZXB0CkpTT04gc3RyaW5ncyBxdW90ZWQgYnkgc2luZ2xlIHF1b3RhdGlvbnMgdGhhdCBhcmUgaW52YWxpZCBKU09OCmZvcm1hdC4KCiAgICAkanNvbi0+YWxsb3dfc2luZ2xlcXVvdGUtPmRlY29kZSh7ImZvbyI6J2Jhcid9KTsKICAgICRqc29uLT5hbGxvd19zaW5nbGVxdW90ZS0+ZGVjb2RlKHsnZm9vJzoiYmFyIn0pOwogICAgJGpzb24tPmFsbG93X3NpbmdsZXF1b3RlLT5kZWNvZGUoeydmb28nOidiYXInfSk7CgpBcyBzYW1lIGFzIHRoZSBDPHJlbGF4ZWQ+IG9wdGlvbiwgdGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gcGFyc2UKYXBwbGljYXRpb24tc3BlY2lmaWMgZmlsZXMgd3JpdHRlbiBieSBodW1hbnMuCgoKPWhlYWQyIGFsbG93X2JhcmVrZXkKCiAgICAkanNvbiA9ICRqc29uLT5hbGxvd19iYXJla2V5KFskZW5hYmxlXSkKCklmIEM8JGVuYWJsZT4gaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gQzxkZWNvZGU+IHdpbGwgYWNjZXB0CmJhcmUga2V5cyBvZiBKU09OIG9iamVjdCB0aGF0IGFyZSBpbnZhbGlkIEpTT04gZm9ybWF0LgoKQXMgc2FtZSBhcyB0aGUgQzxyZWxheGVkPiBvcHRpb24sIHRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIHRvIHBhcnNlCmFwcGxpY2F0aW9uLXNwZWNpZmljIGZpbGVzIHdyaXR0ZW4gYnkgaHVtYW5zLgoKICAgICRqc29uLT5hbGxvd19iYXJla2V5LT5kZWNvZGUoJ3tmb286ImJhciJ9Jyk7Cgo9aGVhZDIgYWxsb3dfYmlnbnVtCgogICAgJGpzb24gPSAkanNvbi0+YWxsb3dfYmlnbnVtKFskZW5hYmxlXSkKCklmIEM8JGVuYWJsZT4gaXMgdHJ1ZSAob3IgbWlzc2luZyksIHRoZW4gQzxkZWNvZGU+IHdpbGwgY29udmVydAp0aGUgYmlnIGludGVnZXIgUGVybCBjYW5ub3QgaGFuZGxlIGFzIGludGVnZXIgaW50byBhIEw8TWF0aDo6QmlnSW50PgpvYmplY3QgYW5kIGNvbnZlcnQgYSBmbG9hdGluZyBudW1iZXIgKGFueSkgaW50byBhIEw8TWF0aDo6QmlnRmxvYXQ+LgoKT24gdGhlIGNvbnRhcnksIEM8ZW5jb2RlPiBjb252ZXJ0cyBDPE1hdGg6OkJpZ0ludD4gb2JqZWN0cyBhbmQgQzxNYXRoOjpCaWdGbG9hdD4Kb2JqZWN0cyBpbnRvIEpTT04gbnVtYmVycyB3aXRoIEM8YWxsb3dfYmxlc3NlZD4gZW5hYmxlLgoKICAgJGpzb24tPmFsbG93X25vbnJlZi0+YWxsb3dfYmxlc3NlZC0+YWxsb3dfYmlnbnVtOwogICAkYmlnZmxvYXQgPSAkanNvbi0+ZGVjb2RlKCcyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScpOwogICBwcmludCAkanNvbi0+ZW5jb2RlKCRiaWdmbG9hdCk7CiAgICMgPT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKClNlZSB0byBMPEpTT046OlhTL01BUFBJTkc+IGFib291dCB0aGUgbm9ybWFsIGNvbnZlcnNpb24gb2YgSlNPTiBudW1iZXIuCgo9aGVhZDIgbG9vc2UKCiAgICAkanNvbiA9ICRqc29uLT5sb29zZShbJGVuYWJsZV0pCgpUaGUgdW5lc2NhcGVkIFtceDAwLVx4MWZceDIyXHgyZlx4NWNdIHN0cmluZ3MgYXJlIGludmFsaWQgaW4gSlNPTiBzdHJpbmdzCmFuZCB0aGUgbW9kdWxlIGRvZXNuJ3QgYWxsb3cgdG8gQzxkZWNvZGU+IHRvIHRoZXNlIChleGNlcHQgZm9yIFx4MmYpLgpJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZGVjb2RlPiAgd2lsbCBhY2NlcHQgdGhlc2UKdW5lc2NhcGVkIHN0cmluZ3MuCgogICAgJGpzb24tPmxvb3NlLT5kZWNvZGUocXF8WyJhYmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYiXXwpOwoKU2VlIEw8SlNPTjo6WFMvU1NFQ1VSSVRZIENPTlNJREVSQVRJT05TPi4KCj1oZWFkMiBlc2NhcGVfc2xhc2gKCiAgICAkanNvbiA9ICRqc29uLT5lc2NhcGVfc2xhc2goWyRlbmFibGVdKQoKQWNjb3JkaW5nIHRvIEpTT04gR3JhbW1hciwgSTxzbGFzaD4gKFUrMDAyRikgaXMgZXNjYXBlZC4gQnV0IGRlZmF1bHQKSlNPTjo6UFAgKGFzIHNhbWUgYXMgSlNPTjo6WFMpIGVuY29kZXMgc3RyaW5ncyB3aXRob3V0IGVzY2FwaW5nIHNsYXNoLgoKSWYgQzwkZW5hYmxlPiBpcyB0cnVlIChvciBtaXNzaW5nKSwgdGhlbiBDPGVuY29kZT4gd2lsbCBlc2NhcGUgc2xhc2hlcy4KCj1oZWFkMiAoT0JTT0xFVEVEKWFzX25vbmJsZXNzZWQKCiAgICAkanNvbiA9ICRqc29uLT5hc19ub25ibGVzc2VkCgooT0JTT0xFVEVEKSBJZiBDPCRlbmFibGU+IGlzIHRydWUgKG9yIG1pc3NpbmcpLCB0aGVuIEM8ZW5jb2RlPiB3aWxsIGNvbnZlcnQKYSBibGVzc2VkIGhhc2ggcmVmZXJlbmNlIG9yIGEgYmxlc3NlZCBhcnJheSByZWZlcmVuY2UgKGNvbnRhaW5zCm90aGVyIGJsZXNzZWQgcmVmZXJlbmNlcykgaW50byBKU09OIG1lbWJlcnMgYW5kIGFycmF5cy4KClRoaXMgZmVhdHVyZSBpcyBlZmZlY3RpdmUgb25seSB3aGVuIEM8YWxsb3dfYmxlc3NlZD4gaXMgZW5hYmxlLgoKPWhlYWQyIGluZGVudF9sZW5ndGgKCiAgICAkanNvbiA9ICRqc29uLT5pbmRlbnRfbGVuZ3RoKCRsZW5ndGgpCgpKU09OOjpYUyBpbmRlbnQgc3BhY2UgbGVuZ3RoIGlzIDMgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgpKU09OOjpQUCBzZXQgdGhlIGluZGVudCBzcGFjZSBsZW5ndGggd2l0aCB0aGUgZ2l2ZW4gJGxlbmd0aC4KVGhlIGRlZmF1bHQgaXMgMy4gVGhlIGFjY2VwdGFibGUgcmFuZ2UgaXMgMCB0byAxNS4KCj1oZWFkMiBzb3J0X2J5CgogICAgJGpzb24gPSAkanNvbi0+c29ydF9ieSgkZnVuY3Rpb25fbmFtZSkKICAgICRqc29uID0gJGpzb24tPnNvcnRfYnkoJHN1YnJvdXRpbmVfcmVmKQoKSWYgJGZ1bmN0aW9uX25hbWUgb3IgJHN1YnJvdXRpbmVfcmVmIGFyZSBzZXQsIGl0cyBzb3J0IHJvdXRpbmUgYXJlIHVzZWQKaW4gZW5jb2RpbmcgSlNPTiBvYmplY3RzLgoKICAgJGpzID0gJHBjLT5zb3J0X2J5KHN1YiB7ICRKU09OOjpQUDo6YSBjbXAgJEpTT046OlBQOjpiIH0pLT5lbmNvZGUoJG9iaik7CiAgICMgaXMoJGpzLCBxfHsiYSI6MSwiYiI6MiwiYyI6MywiZCI6NCwiZSI6NSwiZiI6NiwiZyI6NywiaCI6OCwiaSI6OX18KTsKCiAgICRqcyA9ICRwYy0+c29ydF9ieSgnb3duX3NvcnQnKS0+ZW5jb2RlKCRvYmopOwogICAjIGlzKCRqcywgcXx7ImEiOjEsImIiOjIsImMiOjMsImQiOjQsImUiOjUsImYiOjYsImciOjcsImgiOjgsImkiOjl9fCk7CgogICBzdWIgSlNPTjo6UFA6Om93bl9zb3J0IHsgJEpTT046OlBQOjphIGNtcCAkSlNPTjo6UFA6OmIgfQoKQXMgdGhlIHNvcnRpbmcgcm91dGluZSBydW5zIGluIHRoZSBKU09OOjpQUCBzY29wZSwgdGhlIGdpdmVuCnN1YnJvdXRpbmUgbmFtZSBhbmQgdGhlIHNwZWNpYWwgdmFyaWFibGVzIEM8JGE+LCBDPCRiPiB3aWxsIGJlZ2luCidKU09OOjpQUDo6Jy4KCklmICRpbnRlZ2VyIGlzIHNldCwgdGhlbiB0aGUgZWZmZWN0IGlzIHNhbWUgYXMgQzxjYW5vbmljYWw+IG9uLgoKPWhlYWQxIElOVEVSTkFMCgpGb3IgZGV2ZWxvcGVycy4KCj1vdmVyCgo9aXRlbSBQUF9lbmNvZGVfYm94CgpSZXR1cm5zCgogICAgICAgIHsKICAgICAgICAgICAgZGVwdGggICAgICAgID0+ICRkZXB0aCwKICAgICAgICAgICAgaW5kZW50X2NvdW50ID0+ICRpbmRlbnRfY291bnQsCiAgICAgICAgfQoKCj1pdGVtIFBQX2RlY29kZV9ib3gKClJldHVybnMKCiAgICAgICAgewogICAgICAgICAgICB0ZXh0ICAgID0+ICR0ZXh0LAogICAgICAgICAgICBhdCAgICAgID0+ICRhdCwKICAgICAgICAgICAgY2ggICAgICA9PiAkY2gsCiAgICAgICAgICAgIGxlbiAgICAgPT4gJGxlbiwKICAgICAgICAgICAgZGVwdGggICA9PiAkZGVwdGgsCiAgICAgICAgICAgIGVuY29kaW5nICAgICAgPT4gJGVuY29kaW5nLAogICAgICAgICAgICBpc192YWxpZF91dGY4ID0+ICRpc192YWxpZF91dGY4LAogICAgICAgIH07Cgo9YmFjawoKPWhlYWQxIE1BUFBJTkcKClNlZSB0byBMPEpTT046OlhTL01BUFBJTkc+LgoKCj1oZWFkMSBVTklDT0RFIEhBTkRMSU5HIE9OIFBFUkxTCgpJZiB5b3UgZG8gbm90IGtub3cgYWJvdXQgVW5pY29kZSBvbiBQZXJsIHdlbGwsCnBsZWFzZSBjaGVjayBMPEpTT046OlhTL0EgRkVXIE5PVEVTIE9OIFVOSUNPREUgQU5EIFBFUkw+LgoKPWhlYWQyIFBlcmwgNS44IGFuZCBsYXRlcgoKUGVybCBjYW4gaGFuZGxlIFVuaWNvZGUgYW5kIHRoZSBKU09OOjpQUCBkZS9lbmNvZGUgbWV0aG9kcyBhbHNvIHdvcmsgcHJvcGVybHkuCgogICAgJGpzb24tPmFsbG93X25vbnJlZi0+ZW5jb2RlKGNociBoZXggMzA0Mik7CiAgICAkanNvbi0+YWxsb3dfbm9ucmVmLT5lbmNvZGUoY2hyIGhleCAxMjM0NSk7CgpSZXV0dXJucyBDPCJcdTMwNDIiPiBhbmQgQzwiXHVkODA4XHVkZjQ1Ij4gcmVzcGVjdGl2ZWx5LgoKICAgICRqc29uLT5hbGxvd19ub25yZWYtPmRlY29kZSgnIlx1MzA0MiInKTsKICAgICRqc29uLT5hbGxvd19ub25yZWYtPmRlY29kZSgnIlx1ZDgwOFx1ZGY0NSInKTsKClJldHVybnMgVVRGLTggZW5jb2RlZCBzdHJpbmdzIHdpdGggVVRGOCBmbGFnLCByZWdhcmRlZCBhcyBDPFUrMzA0Mj4gYW5kIEM8VSsxMjM0NT4uCgpOb3RlIHRoYXQgdGhlIHZlcnNpb25zIGZyb20gUGVybCA1LjguMCB0byA1LjguMiwgUGVybCBidWlsdC1pbiBDPGpvaW4+IHdhcyBicm9rZW4sCnNvIEpTT046OlBQIHdyYXBzIHRoZSBDPGpvaW4+IHdpdGggYSBzdWJyb3V0aW5lLiBUaHVzIEpTT046OlBQIHdvcmtzIHNsb3cgaW4gdGhlIHZlcnNpb25zLgoKCj1oZWFkMiBQZXJsIDUuNgoKUGVybCBjYW4gaGFuZGxlIFVuaWNvZGUgYW5kIHRoZSBKU09OOjpQUCBkZS9lbmNvZGUgbWV0aG9kcyBhbHNvIHdvcmsuCgo9aGVhZDIgUGVybCA1LjAwNQoKUGVybCA1LjAwNSBpcyBhIGJ5dGUgc2VtZW50aWNzIHdvcmxkIC0tIGFsbCBzdHJpbmdzIGFyZSBzZXF1ZW5jZXMgb2YgYnl0ZXMuClRoYXQgbWVhbnMgdGhlIHVuaWNvZGUgaGFuZGxpbmcgaXMgbm90IGF2YWlsYWJsZS4KCkluIGVuY29kaW5nLAoKICAgICRqc29uLT5hbGxvd19ub25yZWYtPmVuY29kZShjaHIgaGV4IDMwNDIpOyAgIyBoZXggMzA0MiBpcyAxMjM1NC4KICAgICRqc29uLT5hbGxvd19ub25yZWYtPmVuY29kZShjaHIgaGV4IDEyMzQ1KTsgIyBoZXggMTIzNDUgaXMgNzQ1NjUuCgpSZXR1cm5zIEM8Qj4gYW5kIEM8RT4sIGFzIEM8Y2hyPiB0YWtlcyBhIHZhbHVlIG1vcmUgdGhhbiAyNTUsIGl0IHRyZWF0cwphcyBDPCR2YWx1ZSAlIDI1Nj4sIHNvIHRoZSBhYm92ZSBjb2RlcyBhcmUgZXF1aXZhbGVudCB0byA6CgogICAgJGpzb24tPmFsbG93X25vbnJlZi0+ZW5jb2RlKGNociA2Nik7CiAgICAkanNvbi0+YWxsb3dfbm9ucmVmLT5lbmNvZGUoY2hyIDY5KTsKCkluIGRlY29kaW5nLAoKICAgICRqc29uLT5kZWNvZGUoJyJcdTAwZTNcdTAwODFcdTAwODIiJyk7CgpUaGUgcmV0dXJuZWQgaXMgYSBieXRlIHNlcXVlbmNlIEM8MHhFMyAweDgxIDB4ODI+IGZvciBVVEYtOCBlbmNvZGVkCmphcGFuZXNlIGNoYXJhY3RlciAoQzxISVJBR0FOQSBMRVRURVIgQT4pLgpBbmQgaWYgaXQgaXMgcmVwcmVzZW50ZWQgaW4gVW5pY29kZSBjb2RlIHBvaW50LCBDPFUrMzA0Mj4uCgpOZXh0LCAKCiAgICAkanNvbi0+ZGVjb2RlKCciXHUzMDQyIicpOwoKV2Ugb3JkaW5hcnkgZXhwZWN0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIFVuaWNvZGUgY2hhcmFjdGVyIEM8VSszMDQyPi4KQnV0IGhlcmUgaXMgNS4wMDUgd29ybGQuIFRoaXMgaXMgQzwweEUzIDB4ODEgMHg4Mj4uCgogICAgJGpzb24tPmRlY29kZSgnIlx1ZDgwOFx1ZGY0NSInKTsKClRoaXMgaXMgbm90IGEgY2hhcmFjdGVyIEM8VSsxMjM0NT4gYnV0IGJ5dGVzIC0gQzwweGYwIDB4OTIgMHg4ZCAweDg1Pi4KCgo9aGVhZDEgVE9ETwoKPW92ZXIKCj1pdGVtIHNwZWVkCgo9aXRlbSBtZW1vcnkgc2F2aW5nCgo9YmFjawoKCj1oZWFkMSBTRUUgQUxTTwoKTW9zdCBvZiB0aGUgZG9jdW1lbnQgYXJlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBKU09OOjpYUyBkb2MuCgpMPEpTT046OlhTPgoKUkZDNDYyNyAoTDxodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0NjI3LnR4dD4pCgo9aGVhZDEgQVVUSE9SCgpNYWthbWFrYSBIYW5ueWFoYXJhbWl0dSwgRTxsdD5tYWthbWFrYVthdF1jcGFuLm9yZ0U8Z3Q+CgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKQ29weXJpZ2h0IDIwMDctMjAxMCBieSBNYWthbWFrYSBIYW5ueWFoYXJhbWl0dQoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIAoKPWN1dAo=
cGFja2FnZSBKU09OOjpQUDUwMDU7Cgp1c2UgNS4wMDU7CnVzZSBzdHJpY3Q7CgpteSBAcHJvcGVydGllczsKCiRKU09OOjpQUDUwMDU6OlZFUlNJT04gPSAnMS4wOSc7CgpCRUdJTiB7CgogICAgc3ViIHV0Zjg6OmlzX3V0ZjggewogICAgICAgIDA7ICMgSXQgaXMgY29uc2lkZXJlZCB0aGF0IFVURjggZmxhZyBvZmYgZm9yIFBlcmwgNS4wMDUuCiAgICB9CgogICAgc3ViIHV0Zjg6OnVwZ3JhZGUgewogICAgfQoKICAgIHN1YiB1dGY4Ojpkb3duZ3JhZGUgewogICAgICAgIDE7ICMgbXVzdCBhbHdheXMgcmV0dXJuIHRydWUuCiAgICB9CgogICAgc3ViIHV0Zjg6OmVuY29kZSAgewogICAgfQoKICAgIHN1YiB1dGY4OjpkZWNvZGUgewogICAgfQoKICAgICpKU09OOjpQUDo6SlNPTl9QUF9lbmNvZGVfYXNjaWkgICAgICA9IFwmX2VuY29kZV9hc2NpaTsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9lbmNvZGVfbGF0aW4xICAgICA9IFwmX2VuY29kZV9sYXRpbjE7CiAgICAqSlNPTjo6UFA6OkpTT05fUFBfZGVjb2RlX3N1cnJvZ2F0ZXMgPSBcJl9kZWNvZGVfc3Vycm9nYXRlczsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9kZWNvZGVfdW5pY29kZSAgICA9IFwmX2RlY29kZV91bmljb2RlOwoKICAgICMgbWlzc2luZyBpbiBCIG1vZHVsZS4KICAgIHN1YiBCOjpTVmZfSU9LICgpIHsgMHgwMDAxMDAwMDsgfQogICAgc3ViIEI6OlNWZl9OT0sgKCkgeyAweDAwMDIwMDAwOyB9CiAgICBzdWIgQjo6U1ZmX1BPSyAoKSB7IDB4MDAwNDAwMDA7IH0KICAgIHN1YiBCOjpTVnBfSU9LICgpIHsgMHgwMTAwMDAwMDsgfQogICAgc3ViIEI6OlNWcF9OT0sgKCkgeyAweDAyMDAwMDAwOyB9CgogICAgJElOQ3snYnl0ZXMucG0nfSA9IDE7ICMgZHVtbXkKfQoKCgpzdWIgX2VuY29kZV9hc2NpaSB7CiAgICBqb2luKCcnLCBtYXAgeyAkXyA8PSAxMjcgPyBjaHIoJF8pIDogc3ByaW50ZignXHUlMDR4JywgJF8pIH0gdW5wYWNrKCdDKicsICRfWzBdKSApOwp9CgoKc3ViIF9lbmNvZGVfbGF0aW4xIHsKICAgIGpvaW4oJycsIG1hcCB7IGNocigkXykgfSB1bnBhY2soJ0MqJywgJF9bMF0pICk7Cn0KCgpzdWIgX2RlY29kZV9zdXJyb2dhdGVzIHsgIyBmcm9tIGh0dHA6Ly9ob21lcGFnZTEubmlmdHkuY29tL25vbWVuY2xhdG9yL3VuaWNvZGUvdWNzX3V0Zi5odG0KICAgIG15ICR1bmkgPSAweDEwMDAwICsgKGhleCgkX1swXSkgLSAweEQ4MDApICogMHg0MDAgKyAoaGV4KCRfWzFdKSAtIDB4REMwMCk7ICMgZnJvbSBwZXJsdW5pY29kZQogICAgbXkgJGJpdCA9IHVucGFjaygnQjMyJywgcGFjaygnTicsICR1bmkpKTsKCiAgICBpZiAoICRiaXQgPX4gL14wMDAwMDAwMDAwMCguLi4pKC4uLi4uLikoLi4uLi4uKSguLi4uLi4pJC8gKSB7CiAgICAgICAgbXkgKCR3LCAkeCwgJHksICR6KSA9ICgkMSwgJDIsICQzLCAkNCk7CiAgICAgICAgcmV0dXJuIHBhY2soJ0IqJywgc3ByaW50ZignMTExMTAlczEwJXMxMCVzMTAlcycsICR3LCAkeCwgJHksICR6KSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDYXJwOjpjcm9haygiSW52YWxpZCBzdXJyb2dhdGUgcGFpciIpOwogICAgfQp9CgoKc3ViIF9kZWNvZGVfdW5pY29kZSB7CiAgICBteSAoJHUpID0gQF87CiAgICBteSAoJHV0ZjhiaXQpOwoKICAgIGlmICggJHUgPX4gL14wMChbODlhLWZdWzAtOWEtZl0pJC9pICkgeyAjIDB4ODAtMHhmZgogICAgICAgICByZXR1cm4gcGFjayggJ0gyJywgJDEgKTsKICAgIH0KCiAgICBteSAkYml0ID0gdW5wYWNrKCJCKiIsIHBhY2soIkgqIiwgJHUpKTsKCiAgICBpZiAoICRiaXQgPX4gL14wMDAwMCguLi4uLikoLi4uLi4uKSQvICkgewogICAgICAgICR1dGY4Yml0ID0gc3ByaW50ZignMTEwJXMxMCVzJywgJDEsICQyKTsKICAgIH0KICAgIGVsc2lmICggJGJpdCA9fiAvXiguLi4uKSguLi4uLi4pKC4uLi4uLikkLyApIHsKICAgICAgICAkdXRmOGJpdCA9IHNwcmludGYoJzExMTAlczEwJXMxMCVzJywgJDEsICQyLCAkMyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDYXJwOjpjcm9haygiSW52YWxpZCBlc2NhcGVkIHVuaWNvZGUiKTsKICAgIH0KCiAgICByZXR1cm4gcGFjaygnQionLCAkdXRmOGJpdCk7Cn0KCgpzdWIgSlNPTjo6UFA6OmluY3JfcGFyc2UgewogICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDE7CiAgICAoICRfWzBdLT57X2luY3JfcGFyc2VyfSB8fD0gSlNPTjo6UFA6OkluY3JQYXJzZXItPm5ldyApLT5pbmNyX3BhcnNlKCBAXyApOwp9CgoKc3ViIEpTT046OlBQOjppbmNyX3RleHQgewogICAgJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3OwoKICAgIGlmICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9LT57aW5jcl9wYXJzaW5nfSApIHsKICAgICAgICBDYXJwOjpjcm9haygiaW5jcl90ZXh0IGNhbiBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGluY3JlbWVudGFsIHBhcnNlciBhbHJlYWR5IHN0YXJ0ZWQgcGFyc2luZyIpOwogICAgfQoKICAgICRfWzBdLT57X2luY3JfcGFyc2VyfS0+e2luY3JfdGV4dH0gPSAkX1sxXSBpZiAoIEBfID4gMSApOwogICAgJF9bMF0tPntfaW5jcl9wYXJzZXJ9LT57aW5jcl90ZXh0fTsKfQoKCnN1YiBKU09OOjpQUDo6aW5jcl9za2lwIHsKICAgICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3ICktPmluY3Jfc2tpcDsKfQoKCnN1YiBKU09OOjpQUDo6aW5jcl9yZXNldCB7CiAgICAoICRfWzBdLT57X2luY3JfcGFyc2VyfSB8fD0gSlNPTjo6UFA6OkluY3JQYXJzZXItPm5ldyApLT5pbmNyX3Jlc2V0Owp9CgoKMTsKX19FTkRfXwoKPXBvZAoKPWhlYWQxIE5BTUUKCkpTT046OlBQNTAwNSAtIEhlbHBlciBtb2R1bGUgaW4gdXNpbmcgSlNPTjo6UFAgaW4gUGVybCA1LjAwNQoKPWhlYWQxIERFU0NSSVBUSU9OCgpKU09OOjpQUCBjYWxscyBpbnRlcm5hbGx5LgoKPWhlYWQxIEFVVEhPUgoKTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgoKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKCkNvcHlyaWdodCAyMDA3LTIwMDkgYnkgTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUKClRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiAKCj1jdXQKCg==
cGFja2FnZSBKU09OOjpQUDU2OwoKdXNlIDUuMDA2Owp1c2Ugc3RyaWN0OwoKbXkgQHByb3BlcnRpZXM7CgokSlNPTjo6UFA1Njo6VkVSU0lPTiA9ICcxLjA4JzsKCkJFR0lOIHsKCiAgICBzdWIgdXRmODo6aXNfdXRmOCB7CiAgICAgICAgbXkgJGxlbiA9ICBsZW5ndGggJF9bMF07ICMgY2hhciBsZW5ndGgKICAgICAgICB7CiAgICAgICAgICAgIHVzZSBieXRlczsgIyAgYnl0ZSBsZW5ndGg7CiAgICAgICAgICAgIHJldHVybiAkbGVuICE9IGxlbmd0aCAkX1swXTsgIyBpZiAhPSwgVVRGOC1mbGFnZ2VkIG9uLgogICAgICAgIH0KICAgIH0KCgogICAgc3ViIHV0Zjg6OnVwZ3JhZGUgewogICAgICAgIDsgIyBub29wOwogICAgfQoKCiAgICBzdWIgdXRmODo6ZG93bmdyYWRlICgkOyQpIHsKICAgICAgICByZXR1cm4gMSB1bmxlc3MgKCB1dGY4Ojppc191dGY4KCAkX1swXSApICk7CgogICAgICAgIGlmICggX2lzX3ZhbGlkX3V0ZjgoICRfWzBdICkgKSB7CiAgICAgICAgICAgIG15ICRkb3duZ3JhZGU7CiAgICAgICAgICAgIGZvciBteSAkYyAoIHVucGFjayggIlUqIiwgJF9bMF0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggJGMgPCAyNTYgKSB7CiAgICAgICAgICAgICAgICAgICAgJGRvd25ncmFkZSAuPSBwYWNrKCJDIiwgJGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGRvd25ncmFkZSAuPSBwYWNrKCJVIiwgJGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRfWzBdID0gJGRvd25ncmFkZTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBDYXJwOjpjcm9haygiV2lkZSBjaGFyYWN0ZXIgaW4gc3Vicm91dGluZSBlbnRyeSIpIHVubGVzcyAoICRfWzFdICk7CiAgICAgICAgICAgIDA7CiAgICAgICAgfQogICAgfQoKCiAgICBzdWIgdXRmODo6ZW5jb2RlICgkKSB7ICMgVVRGOCBmbGFnIG9mZgogICAgICAgIGlmICggdXRmODo6aXNfdXRmOCggJF9bMF0gKSApIHsKICAgICAgICAgICAgJF9bMF0gPSBwYWNrKCAiQyoiLCB1bnBhY2soICJDKiIsICRfWzBdICkgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRfWzBdID0gcGFjayggIlUqIiwgdW5wYWNrKCAiQyoiLCAkX1swXSApICk7CiAgICAgICAgICAgICRfWzBdID0gcGFjayggIkMqIiwgdW5wYWNrKCAiQyoiLCAkX1swXSApICk7CiAgICAgICAgfQogICAgfQoKCiAgICBzdWIgdXRmODo6ZGVjb2RlICgkKSB7ICMgVVRGOCBmbGFnIG9uCiAgICAgICAgaWYgKCBfaXNfdmFsaWRfdXRmOCggJF9bMF0gKSApIHsKICAgICAgICAgICAgdXRmODo6ZG93bmdyYWRlKCAkX1swXSApOwogICAgICAgICAgICAkX1swXSA9IHBhY2soICJVKiIsIHVucGFjayggIlUqIiwgJF9bMF0gKSApOwogICAgICAgIH0KICAgIH0KCgogICAgKkpTT046OlBQOjpKU09OX1BQX2VuY29kZV9hc2NpaSAgICAgID0gXCZfZW5jb2RlX2FzY2lpOwogICAgKkpTT046OlBQOjpKU09OX1BQX2VuY29kZV9sYXRpbjEgICAgID0gXCZfZW5jb2RlX2xhdGluMTsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9kZWNvZGVfc3Vycm9nYXRlcyA9IFwmSlNPTjo6UFA6Ol9kZWNvZGVfc3Vycm9nYXRlczsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9kZWNvZGVfdW5pY29kZSAgICA9IFwmSlNPTjo6UFA6Ol9kZWNvZGVfdW5pY29kZTsKCiAgICB1bmxlc3MgKCBkZWZpbmVkICZCOjpTVnBfTk9LICkgeyAjIG1pc3NpbmcgaW4gQiBtb2R1bGUuCiAgICAgICAgZXZhbCBxeyBzdWIgQjo6U1ZwX05PSyAoKSB7IDB4MDIwMDAwMDA7IH0gfTsKICAgIH0KCn0KCgoKc3ViIF9lbmNvZGVfYXNjaWkgewogICAgam9pbignJywKICAgICAgICBtYXAgewogICAgICAgICAgICAkXyA8PSAxMjcgPwogICAgICAgICAgICAgICAgY2hyKCRfKSA6CiAgICAgICAgICAgICRfIDw9IDY1NTM1ID8KICAgICAgICAgICAgICAgIHNwcmludGYoJ1x1JTA0eCcsICRfKSA6IHNwcmludGYoJ1x1JXhcdSV4JywgSlNPTjo6UFA6Ol9lbmNvZGVfc3Vycm9nYXRlcygkXykpOwogICAgICAgIH0gX3VucGFja19lbXUoJF9bMF0pCiAgICApOwp9CgoKc3ViIF9lbmNvZGVfbGF0aW4xIHsKICAgIGpvaW4oJycsCiAgICAgICAgbWFwIHsKICAgICAgICAgICAgJF8gPD0gMjU1ID8KICAgICAgICAgICAgICAgIGNocigkXykgOgogICAgICAgICAgICAkXyA8PSA2NTUzNSA/CiAgICAgICAgICAgICAgICBzcHJpbnRmKCdcdSUwNHgnLCAkXykgOiBzcHJpbnRmKCdcdSV4XHUleCcsIEpTT046OlBQOjpfZW5jb2RlX3N1cnJvZ2F0ZXMoJF8pKTsKICAgICAgICB9IF91bnBhY2tfZW11KCRfWzBdKQogICAgKTsKfQoKCnN1YiBfdW5wYWNrX2VtdSB7ICMgZm9yIFBlcmwgNS42IHVucGFjayB3YXJuaW5ncwogICAgcmV0dXJuICAgIXV0Zjg6OmlzX3V0ZjgoJF9bMF0pID8gdW5wYWNrKCdDKicsICRfWzBdKSAKICAgICAgICAgICA6IF9pc192YWxpZF91dGY4KCRfWzBdKSA/IHVucGFjaygnVSonLCAkX1swXSkKICAgICAgICAgICA6IHVucGFjaygnQyonLCAkX1swXSk7Cn0KCgpzdWIgX2lzX3ZhbGlkX3V0ZjggewogICAgbXkgJHN0ciA9ICRfWzBdOwogICAgbXkgJGlzX3V0Zjg7CgogICAgd2hpbGUgKCRzdHIgPX4gLyg/OgogICAgICAgICAgKAogICAgICAgICAgICAgW1x4MDAtXHg3Rl0KICAgICAgICAgICAgfFtceEMyLVx4REZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEUwXVtceEEwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEUxLVx4RUNdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXQogICAgICAgICAgICB8W1x4RURdW1x4ODAtXHg5Rl1bXHg4MC1ceEJGXQogICAgICAgICAgICB8W1x4RUUtXHhFRl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCiAgICAgICAgICAgIHxbXHhGMF1bXHg5MC1ceEJGXVtceDgwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICAgICAgfFtceEYxLVx4RjNdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCiAgICAgICAgICAgIHxbXHhGNF1bXHg4MC1ceDhGXVtceDgwLVx4QkZdW1x4ODAtXHhCRl0KICAgICAgICAgICkKICAgICAgICB8ICguKQogICAgKS94ZykKICAgIHsKICAgICAgICBpZiAoZGVmaW5lZCAkMSkgewogICAgICAgICAgICAkaXNfdXRmOCA9IDEgaWYgKCFkZWZpbmVkICRpc191dGY4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRpc191dGY4ID0gMCBpZiAoIWRlZmluZWQgJGlzX3V0ZjgpOwogICAgICAgICAgICBpZiAoJGlzX3V0ZjgpIHsgIyBldmVudHVhbGx5LCBub3QgdXRmOAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkaXNfdXRmODsKfQoKCnN1YiBKU09OOjpQUDo6aW5jcl9wYXJzZSB7CiAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMTsKICAgICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3ICktPmluY3JfcGFyc2UoIEBfICk7Cn0KCgpzdWIgSlNPTjo6UFA6OmluY3JfdGV4dCA6IGx2YWx1ZSB7CiAgICAkX1swXS0+e19pbmNyX3BhcnNlcn0gfHw9IEpTT046OlBQOjpJbmNyUGFyc2VyLT5uZXc7CgogICAgaWYgKCAkX1swXS0+e19pbmNyX3BhcnNlcn0tPntpbmNyX3BhcnNpbmd9ICkgewogICAgICAgIENhcnA6OmNyb2FrKCJpbmNyX3RleHQgY2FuIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgaW5jcmVtZW50YWwgcGFyc2VyIGFscmVhZHkgc3RhcnRlZCBwYXJzaW5nIik7CiAgICB9CiAgICAkX1swXS0+e19pbmNyX3BhcnNlcn0tPntpbmNyX3RleHR9Owp9CgoKc3ViIEpTT046OlBQOjppbmNyX3NraXAgewogICAgKCAkX1swXS0+e19pbmNyX3BhcnNlcn0gfHw9IEpTT046OlBQOjpJbmNyUGFyc2VyLT5uZXcgKS0+aW5jcl9za2lwOwp9CgoKc3ViIEpTT046OlBQOjppbmNyX3Jlc2V0IHsKICAgICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3ICktPmluY3JfcmVzZXQ7Cn0KCgoxOwpfX0VORF9fCgo9cG9kCgo9aGVhZDEgTkFNRQoKSlNPTjo6UFA1NiAtIEhlbHBlciBtb2R1bGUgaW4gdXNpbmcgSlNPTjo6UFAgaW4gUGVybCA1LjYKCj1oZWFkMSBERVNDUklQVElPTgoKSlNPTjo6UFAgY2FsbHMgaW50ZXJuYWxseS4KCj1oZWFkMSBBVVRIT1IKCk1ha2FtYWthIEhhbm55YWhhcmFtaXR1LCBFPGx0Pm1ha2FtYWthW2F0XWNwYW4ub3JnRTxndD4KCgo9aGVhZDEgQ09QWVJJR0hUIEFORCBMSUNFTlNFCgpDb3B5cmlnaHQgMjAwNy0yMDA5IGJ5IE1ha2FtYWthIEhhbm55YWhhcmFtaXR1CgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gCgo9Y3V0Cgo=
cGFja2FnZSBKU09OOjpQUDU4OwoKdXNlIDUuMDA4Owp1c2Ugc3RyaWN0OwoKbXkgQHByb3BlcnRpZXM7CgokSlNPTjo6UFA1ODo6VkVSU0lPTiA9ICcxLjAzJzsKCgpCRUdJTiB7CgogICAgdW5sZXNzICggZGVmaW5lZCAmdXRmODo6aXNfdXRmOCApIHsKICAgICAgIHJlcXVpcmUgRW5jb2RlOwogICAgICAgKnV0Zjg6OmlzX3V0ZjggPSAqRW5jb2RlOjppc191dGY4OwogICAgfQoKICAgICpKU09OOjpQUDo6SlNPTl9QUF9lbmNvZGVfYXNjaWkgICAgICA9IFwmSlNPTjo6UFA6Ol9lbmNvZGVfYXNjaWk7CiAgICAqSlNPTjo6UFA6OkpTT05fUFBfZW5jb2RlX2xhdGluMSAgICAgPSBcJkpTT046OlBQOjpfZW5jb2RlX2xhdGluMTsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9kZWNvZGVfc3Vycm9nYXRlcyA9IFwmSlNPTjo6UFA6Ol9kZWNvZGVfc3Vycm9nYXRlczsKICAgICpKU09OOjpQUDo6SlNPTl9QUF9kZWNvZGVfdW5pY29kZSAgICA9IFwmSlNPTjo6UFA6Ol9kZWNvZGVfdW5pY29kZTsKCiAgICBpZiAoJF0gPj0gNS4wMDggYW5kICRdIDwgNS4wMDgwMDMpIHsgIyBqb2luKCkgaW4gNS44LjAgLSA1LjguMiBpcyBicm9rZW4uCiAgICAgICAgcGFja2FnZSBKU09OOjpQUDsKICAgICAgICByZXF1aXJlIHN1YnM7CiAgICAgICAgc3Vicy0+aW1wb3J0KCdqb2luJyk7CiAgICAgICAgZXZhbCBxfAogICAgICAgICAgICBzdWIgam9pbiB7CiAgICAgICAgICAgICAgICByZXR1cm4gJycgaWYgKEBfIDwgMik7CiAgICAgICAgICAgICAgICBteSAkaiAgID0gc2hpZnQ7CiAgICAgICAgICAgICAgICBteSAkc3RyID0gc2hpZnQ7CiAgICAgICAgICAgICAgICBmb3IgKEBfKSB7ICRzdHIgLj0gJGogLiAkXzsgfQogICAgICAgICAgICAgICAgcmV0dXJuICRzdHI7CiAgICAgICAgICAgIH0KICAgICAgICB8OwogICAgfQoKfQoKCnN1YiBKU09OOjpQUDo6aW5jcl9wYXJzZSB7CiAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMTsKICAgICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3ICktPmluY3JfcGFyc2UoIEBfICk7Cn0KCgpzdWIgSlNPTjo6UFA6OmluY3JfdGV4dCA6IGx2YWx1ZSB7CiAgICAkX1swXS0+e19pbmNyX3BhcnNlcn0gfHw9IEpTT046OlBQOjpJbmNyUGFyc2VyLT5uZXc7CgogICAgaWYgKCAkX1swXS0+e19pbmNyX3BhcnNlcn0tPntpbmNyX3BhcnNpbmd9ICkgewogICAgICAgIENhcnA6OmNyb2FrKCJpbmNyX3RleHQgY2FuIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgaW5jcmVtZW50YWwgcGFyc2VyIGFscmVhZHkgc3RhcnRlZCBwYXJzaW5nIik7CiAgICB9CiAgICAkX1swXS0+e19pbmNyX3BhcnNlcn0tPntpbmNyX3RleHR9Owp9CgoKc3ViIEpTT046OlBQOjppbmNyX3NraXAgewogICAgKCAkX1swXS0+e19pbmNyX3BhcnNlcn0gfHw9IEpTT046OlBQOjpJbmNyUGFyc2VyLT5uZXcgKS0+aW5jcl9za2lwOwp9CgoKc3ViIEpTT046OlBQOjppbmNyX3Jlc2V0IHsKICAgICggJF9bMF0tPntfaW5jcl9wYXJzZXJ9IHx8PSBKU09OOjpQUDo6SW5jclBhcnNlci0+bmV3ICktPmluY3JfcmVzZXQ7Cn0KCgoxOwpfX0VORF9fCgo9cG9kCgo9aGVhZDEgTkFNRQoKSlNPTjo6UFA1OCAtIEhlbHBlciBtb2R1bGUgaW4gdXNpbmcgSlNPTjo6UFAgaW4gUGVybCA1LjggYW5kIGxhdG9yCgo9aGVhZDEgREVTQ1JJUFRJT04KCkpTT046OlBQIGNhbGxzIGludGVybmFsbHkuCgo9aGVhZDEgQVVUSE9SCgpNYWthbWFrYSBIYW5ueWFoYXJhbWl0dSwgRTxsdD5tYWthbWFrYVthdF1jcGFuLm9yZ0U8Z3Q+CgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKQ29weXJpZ2h0IDIwMDgtMjAwOSBieSBNYWthbWFrYSBIYW5ueWFoYXJhbWl0dQoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIAoKPWN1dAoK
PWhlYWQxIE5BTUUKCkpTT046OlBQOjpCb29sZWFuIC0gZHVtbXkgbW9kdWxlIHByb3ZpZGluZyBKU09OOjpQUDo6Qm9vbGVhbgoKPWhlYWQxIFNZTk9QU0lTCgogIyBkbyBub3QgInVzZSIgeW91cnNlbGYKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgZXhpc3RzIG9ubHkgdG8gcHJvdmlkZSBvdmVybG9hZCByZXNvbHV0aW9uIGZvciBTdG9yYWJsZSBhbmQgc2ltaWxhciBtb2R1bGVzLiBTZWUKTDxKU09OOjpQUD4gZm9yIG1vcmUgaW5mbyBhYm91dCB0aGlzIGNsYXNzLgoKPWN1dAoKdXNlIEpTT046OlBQICgpOwp1c2Ugc3RyaWN0OwoKMTsKCj1oZWFkMSBBVVRIT1IKClRoaXMgaWRlYSBpcyBmcm9tIEw8SlNPTjo6WFM6OkJvb2xlYW4+IHdyaXR0ZW4gYnkgTWFyYyBMZWhtYW5uIDxzY2htb3JwW2F0XXNjaG1vcnAuZGU+Cgo9Y3V0Cgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vaVBob25lLnBtIC0gYWxsIGlQaG9uZSBoYW5kbGUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBpUGhvbmUucG0sdiAxLjggMjAxMC8wNi8yNSAxNjowNjowMyBjciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6aVBob25lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6Okxhbmd1YWdlOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjggJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjppUGhvbmUgLSBpUGhvbmUgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBpUGhvbmUgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgogICAgY3JlYXRlIGFuIG9iamVjdAoKICAgICAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICAgICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICAgICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICAgICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6UXVldWU7CiAgICAgICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwogICAgICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9jazsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKICAgICAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CgogICAgICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICAgICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgKTsKICAgICAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgKTsKICAgICAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgKTsKICAgICAgICBteSAkVXNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgICk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgICAgIExvZ09iamVjdCAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgIE1haW5PYmplY3QgICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICA9PiAkR3JvdXBPYmplY3QsICMgaWYgZ2l2ZW4KICAgICAgICAgICAgQ3VzdG9tZXJHcm91cE9iamVjdCA9PiAkQ3VzdG9tZXJHcm91cE9iamVjdCwgIyBpZiBnaXZlbgogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRTdGF0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgKTsKICAgICAgICBteSAkTG9ja09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2NrLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRTTEFPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U0xBLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgICAgIEVuY29kZU9iamVjdCAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgICAgICBHcm91cE9iamVjdCAgICAgICAgPT4gJEdyb3VwT2JqZWN0LCAgICAgICAgIyBpZiBnaXZlbgogICAgICAgICAgICBDdXN0b21lclVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwgIyBpZiBnaXZlbgogICAgICAgICAgICBRdWV1ZU9iamVjdCAgICAgICAgPT4gJFF1ZXVlT2JqZWN0LCAgICAgICAgIyBpZiBnaXZlbgogICAgICAgICk7CiAgICAgICAgbXkgJExpbmtPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICApOwogICAgICAgIG15ICRpUGhvbmVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6aVBob25lLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICBMb2dPYmplY3QgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgICAgIEVuY29kZU9iamVjdCAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgICAgICBHcm91cE9iamVjdCAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgICAgICBDdXN0b21lclVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgUXVldWVPYmplY3QgICAgICAgID0+ICRRdWV1ZU9iamVjdCwKICAgICAgICAgICAgVXNlck9iamVjdCAgICAgICAgID0+ICRVc2VyT2JqZWN0LAogICAgICAgICAgICBRdWV1ZU9iamVjdCAgICAgICAgPT4gJFF1ZXVlT2JqZWN0LAogICAgICAgICAgICBTZXJ2aWNlT2JqZWN0ICAgICAgPT4gJFNlcnZpY2VPYmplY3QsCiAgICAgICAgICAgIFR5cGVPYmplY3QgICAgICAgICA9PiAkVHlwZU9iamVjdCwKICAgICAgICAgICAgU3RhdGVPYmplY3QgICAgICAgID0+ICRTdGF0ZU9iamVjdCwKICAgICAgICAgICAgTG9ja09iamVjdCAgICAgICAgID0+ICRMb2NrT2JqZWN0LAogICAgICAgICAgICBTTEFPYmplY3QgICAgICAgICAgPT4gJFNMQU9iamVjdCwKICAgICAgICAgICAgVGlja2V0T2JqZWN0ICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgIExpbmtiamVjdCAgICAgICAgICA9PiAkTGlua09iamVjdCwKICAgICAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFF1ZXVlT2JqZWN0IFNlcnZpY2VPYmplY3QgVHlwZU9iamVjdAogICAgICAgIFN0YXRlT2JqZWN0IExvY2tPYmplY3QgU0xBT2JqZWN0IEN1c3RvbWVyVXNlck9iamVjdCBUaWNrZXRPYmplY3QgTGlua09iamVjdCApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEgb2JqZWN0IjsKICAgIH0KCiAgICAkU2VsZi0+e0xvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgTG9nUHJlZml4ID0+ICdpUGhvbmVIYW5kbGUnLAogICAgICAgICV7JFNlbGZ9LAogICAgKTsKCiAgICBteSAkU3lzdGVtVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWZXJzaW9uJyk7CgogICAgIyBjaGVjayBmb3IgYW55IHZlcnNpb24gc3RhcmluZyB3aXRoIDIuNAogICAgaWYgKCAkU3lzdGVtVmVyc2lvbiA9fiBteyBcQSAyIFwuIDQgXC4gXGQrIFx6IH14bXMgKSB7CiAgICAgICAgJFNlbGYtPnsnQVBJM1gnfSA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+eydBUEkzWCd9ID0gMDsKICAgICAgICBpZiAoICRTeXN0ZW1WZXJzaW9uID1+IG17IFxBIDMgKD86IFwuXGQrICl7Mn0gXHogfXhtcyApIHsKICAgICAgICAgICAgJFNlbGYtPnsnQVBJM1gnfSA9IDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU2NyZWVuQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KCAleyRTZWxmfSwgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtMYW5ndWFnZX0gKTsKCiAgICAjICAgIG15ICRIdHRwVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIdHRwVHlwZScpOwogICAgIyAgICBteSAkRlFETiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJyk7CiAgICAjICAgIG15ICRTY3JpcHRBbGlhcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTY3JpcHRBbGlhcycpOwogICAgIwogICAgIyAgICAjIHNvdWxkIGJlIHJldHJlaXZlZCBieSB0aGUgY29uZmlnPwogICAgIyAgICBteSAkSGFuZGxlID0gJ2pzb24ucGwnCiAgICAjCiAgICAjICAgIG15ICRBY3Rpb25VUkwgPSAkSHR0cFR5cGUgLiAnOi8vJyAuICRGUUROIC4gJy8nIC4gJFNjcmlwdEFsaWFzIC4gJEhhbmRsZSAuICc/JyA7CgogICAgbXkgJUNvbmZpZyA9ICgKICAgICAgICBQaG9uZSA9PiB7CiAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdOZXcgUGhvbmUgVGlja2V0JyksCiAgICAgICAgICAgIEVsZW1lbnRzID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1R5cGUnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBvcHRpb25zIGFyZSBqdXN0IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnRnJvbScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSA9PiAnERITBkF1dG9Db21wbGV0aW9uJywKCiAgICAgICAgICAgICAgICAgICAgIyB0aGUgbGlzdCBvZiBjdXN0b21lcnMgVVJMIGlzIG5vdCBqZXQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgICAgICAgICAjT3B0aW9uc1VSTCA9PiAkQWN0aW9uVVJMIC4gIkxpc3Qgb2YgY3VzdG9tZXJzIiwKICAgICAgICAgICAgICAgICAgICAjIG90aGVyIG9wdGlvbiBpcyB0byB1c2UgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBPcHRpb25zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUbycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1RvJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YXR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXd0eXBlID0+ICdQaWNrZXInLAogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgID0+IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMleyRTZWxmLT5fR2V0VG9zKCAlUGFyYW0sICkgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGlzIG9wdGlvbnMgYXJlIGp1c3QgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEFsbFF1ZXVlcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1NlcnZpY2UnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyAgPT4gewoKICAgICAgICAgICAgICAgICAgICAgICAgIyV7ICRTZWxmLT5fR2V0U2VydmljZXMoICVQYXJhbSwgKSB9CiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBvcHRpb25zIGFyZSBqdXN0IGZvciB0ZXN0aWcKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdTTEEnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdTTEEnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyAgPT4gewoKICAgICAgICAgICAgICAgICAgICAgICAgIyV7ICRTZWxmLT5fR2V0U0xBcyggJVBhcmFtLCApIH0KICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGlzIG9wdGlvbnMgYXJlIGp1c3QgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnT3duZXInLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdPd25lcicpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3dHlwZSA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBPcHRpb25zICA9PiB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgb3B0aW9ucyBhcmUganVzdCBmb3IgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICdTaG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdSZXNwb25zaWJsZScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3dHlwZSA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBPcHRpb25zICA9PiB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgb3B0aW9ucyBhcmUganVzdCBmb3IgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICdTaG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld1R5cGUgID0+ICdJbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgTWluICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDI1MCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdUZXh0JyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gMjBfMDAwLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ0N1c3RvbWVySUQnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAxNTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnTmV4dFRpY2tldFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnTmV4dCBUaWNrZXQgU3RhdGUnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBvcHRpb25zIGFyZSBqdXN0IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnUGVuZGluZ0RhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnUGVuZGluZyBEYXRlIChmb3IgcGVuZGluZyogc3RhdGVzKScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFZpZXd0eXBlICA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1ByaW9yaXR5JyksCiAgICAgICAgICAgICAgICAgICAgRGF0YXR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXd0eXBlID0+ICdQaWNrZXInLAoKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgb3B0aW9ucyBhcmUganVzdCBmb3IgdGVzdGluZwogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdEdWVEYXRlJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ0R1ZSBEYXRlIChmb3IgcGVuZGluZyogc3RhdGVzKScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFZpZXd0eXBlICA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1RpbWUgdW5pdHMgKHdvcmsgdW5pdHMpJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ0lucHV0JywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJycsCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICcnLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWluICAgPT4sCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBNYXggICA9PiwKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgPT4gewogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNVUkwgPT4gewogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+LAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+LAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAjfSwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICB9LAoKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIE5vdGUgPT4gewogICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQWRkIE5vdGUnKSwKICAgICAgICAgICAgRWxlbWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMjUwLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXIgPT4gJ05vdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnVGV4dCcpLAogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld1R5cGUgID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICAgICAgTWluICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDIwXzAwMCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdOb3RlVHlwZScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ05vdGUgdHlwZScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3dHlwZSA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBPcHRpb25zICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRTZWxmLT5fR2V0Tm90ZVR5cGVzKCAlUGFyYW0sICkgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICdub3RlLWludGVybmFsJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnVGltZSB1bml0cyAod29yayB1bml0cyknKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAxMCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdJbnB1dCcsCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyNTAsCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnJywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdCb2R5JywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQm9keScpLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDIwXzAwMCwKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgQ2xvc2UgPT4gewogICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQ2xvc2UnKSwKICAgICAgICAgICAgRWxlbWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMjUwLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXIgPT4gJ0Nsb3NlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1RleHQnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyMF8wMDAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnTm90ZVR5cGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdOb3RlIHR5cGUnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkU2VsZi0+X0dldE5vdGVUeXBlcyggJVBhcmFtLCApIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnbm90ZS1pbnRlcm5hbCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdOZXh0VGlja2V0U3RhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdOZXh0IFRpY2tldCBTdGF0ZScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3dHlwZSA9PiAnUGlja2VyJywKCiAgICAgICAgICAgICAgICAgICAgIyB0aGlzIG9wdGlvbnMgYXJlIGp1c3QgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICBPcHRpb25zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnVGltZSB1bml0cyAod29yayB1bml0cyknKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAxMCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAjICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyNTAsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAjICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ0JvZHknLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQm9keScpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWluICAgICAgID0+IDEsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDIwXzAwMCwKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICMgICAgICAgICAgICAgICAgewogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdTdGF0ZScpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9PiB7CiAgICAgICAgICAgIwogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFBhcmFte0FjdGlvbn0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIENvbXBvc2UgPT4gewogICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQ29tcG9zZScpLAogICAgICAgICAgICBFbGVtZW50cyA9PiBbCgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdGcm9tJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ0lucHV0JywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCgogICAgICAgICAgICAgICAgICAgICMgZGVmaW5lIGEgUmVkb25seUZpZWxkdG8KICAgICAgICAgICAgICAgICAgICAjIFJlYWRPbmx5ICA9PiAxLAogICAgICAgICAgICAgICAgICAgICMgZ2V0IGZyb20gYWRkcmVzcyBmcm9tIHRpY2tldAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVG8nLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ0VNYWlsJywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCgogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9PiAnJywKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2MnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQ2MnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnRU1haWwnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQmNjJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ0JjYycpLAogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld1R5cGUgID0+ICdFTWFpbCcsCiAgICAgICAgICAgICAgICAgICAgTWluICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAwLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1N1YmplY3QnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFZpZXdUeXBlICA9PiAnSW5wdXQnLAogICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyNTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCgogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSByZXRpZXZlZCBmcm9tIHRpY2tldAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdUZXh0JyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gMjBfMDAwLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAxLAoKICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgcmV0aWV2ZWQgZnJvbSB0aGUgc2VsZWN0ZWQgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnTmV4dFRpY2tldFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnTmV4dCBUaWNrZXQgU3RhdGUnKSwKICAgICAgICAgICAgICAgICAgICBEYXRhdHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgVmlld3R5cGUgPT4gJ1BpY2tlcicsCgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBvcHRpb25zIGFyZSBqdXN0IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnUGVuZGluZ0RhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnUGVuZGluZyBEYXRlIChmb3IgcGVuZGluZyogc3RhdGVzKScpLAogICAgICAgICAgICAgICAgICAgIERhdGF0eXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFZpZXd0eXBlICA9PiAnUGlja2VyJywKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgPT4gJExhbmd1YWdlT2JqZWN0LT5HZXQoJ1RpbWUgdW5pdHMgKHdvcmsgdW5pdHMpJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBWaWV3VHlwZSAgPT4gJ0lucHV0JywKICAgICAgICAgICAgICAgICAgICBNaW4gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUbycsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdUbycpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyNTAsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAjICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnU3ViamVjdCcpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnSW5wdXQnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1pbiAgICAgICA9PiAxLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICA9PiAyNTAsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDEsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAjICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ0JvZHknLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QtPkdldCgnQm9keScpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWluICAgICAgID0+IDEsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgID0+IDIwXzAwMCwKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gMSwKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICAgPT4gJycsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICMgICAgICAgICAgICAgICAgewogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdTdGF0ZScpLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyA9PiB7CiAgICAgICAgICAgIwogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFBhcmFte0FjdGlvbn0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+IDAsCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgID0+ICcnLAogICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKICAgIHJldHVybiBcJUNvbmZpZzsKfQoKc3ViIFJlc3BvbnNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIHJldHVybgogICAgfQoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzCiAgICBteSAlU3RkUmVzcG9uc2VzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFN0ZFJlc3BvbnNlcyggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgIHJldHVybiBcJVN0ZFJlc3BvbnNlczsKfQoKPWl0ZW0gQmFkZ2VzKCkKCkdldCBCYWRnZXMgdGlja2V0IGNvdW50cyBmb3IgV2F0Y2hlZCwgTG9ja2VkIGFuZCBSZXBvc2libGUgZm9yIHRpY2tldHMKCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+QmFkZ2VzKAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGEgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3VsdCA9ICgKICAgICAgICBMb2NrZWQgPT4gewogICAgICAgICAgICBBbGwgPT4gMSwKICAgICAgICAgICAgTmV3ID0+IDEsCiAgICAgICAgfSwKCiAgICAgICAgV2F0Y2hlZCA9PiB7ICAgICAgICMgT3B0aW9uYWwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICAgICAgICAgIEFsbCA9PiAyLAogICAgICAgICAgICBOZXcgPT4gMCwKICAgICAgICB9LAoKICAgICAgICBSZXNwb25zaWJsZSA9PiB7ICAgIyBPcHRpb25hbCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgICAgICAgICAgQWxsID0+IDEsCiAgICAgICAgICAgIE5ldyA9PiAxLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEJhZGdlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBEYXRhOwoKICAgICMgbG9ja2VkCiAgICBpZiAoMSkgewogICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIExvY2tzICAgICAgPT4gWydsb2NrJ10sCiAgICAgICAgICAgIE93bmVySURzICAgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICApOwogICAgICAgIG15ICRDb3VudE5ldyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIExvY2tzICAgICAgPT4gWydsb2NrJ10sCiAgICAgICAgICAgIE93bmVySURzICAgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgIFNlZW4gPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBQZXJtaXNzaW9uICAgICAgID0+ICdybycsCiAgICAgICAgKTsKICAgICAgICAkQ291bnROZXcgPSAkQ291bnQgLSAkQ291bnROZXc7CiAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICBMb2NrZWQgPT4gewogICAgICAgICAgICAgICAgQWxsID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIE5ldyA9PiAkQ291bnROZXcsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICAjIHJlc3BvbnNpYmxlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgID0+ICdPcGVuJywKICAgICAgICAgICAgUmVzcG9uc2libGVJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBQZXJtaXNzaW9uICAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgbXkgJENvdW50TmV3ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgID0+ICdPcGVuJywKICAgICAgICAgICAgUmVzcG9uc2libGVJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICBUaWNrZXRGbGFnICAgICA9PiB7CiAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFRpY2tldEZsYWdVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgJENvdW50TmV3ID0gJENvdW50IC0gJENvdW50TmV3OwoKICAgICAgICBwdXNoIEBEYXRhLCB7CiAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IHsKICAgICAgICAgICAgICAgIEFsbCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBOZXcgPT4gJENvdW50TmV3LAogICAgICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgIyB3YXRjaGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OldhdGNoZXInKSApIHsKCiAgICAgICAgIyBjaGVjayBhY2Nlc3MKICAgICAgICBteSAkQWNjZXNzT2sgPSAxOwogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpXYXRjaGVyR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OldhdGNoZXJHcm91cCcpIH07CiAgICAgICAgfQogICAgICAgIGlmIChAR3JvdXBzKSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAwOwogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICEkUGFyYW17IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZXR1cm4gb24gbm8gYWNjZXNzCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzT2sgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJEFjY2Vzc09rKSB7CgogICAgICAgICAgICAjIGZpbmQgd2F0Y2hlZCB0aWNrZXRzCiAgICAgICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgICAgICBXYXRjaFVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENvdW50TmV3ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgICAgIFdhdGNoVXNlcklEcyA9PiBbICRQYXJhbXtVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBUaWNrZXRGbGFnICAgPT4gewogICAgICAgICAgICAgICAgICAgIFNlZW4gPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUaWNrZXRGbGFnVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICA9PiAncm8nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkQ291bnROZXcgPSAkQ291bnQgLSAkQ291bnROZXc7CgogICAgICAgICAgICBwdXNoIEBEYXRhLCB7CiAgICAgICAgICAgICAgICBXYXRjaGVkID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIE5ldyA9PiAkQ291bnROZXcsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQERhdGE7Cn0KCj1pdGVtIEVzY2FsYXRpb25WaWV3KCkKCkdldCB0aGUgbnVtYmVyIG9mIHRpa2V0cyBvbiBlc3RhbGF0aW9uIHN0YXR1cyBieSBzdGF0ZSB0eXBlIG9yIGxhcyBjdXN0b21lciBhcnRpY2xlIGluZm9ybWF0aW9uIGZyb20KZWFjaCB0aWNrZXQgaW4gZXNjYWxhdGlvbiBzdGF0dXMgd2l0aGluIGEgZmlsdGVyLCBpZiB0aGUgIkZpbHRlciIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgoKICAgIG15IEBSZXN1bHQgPSAkaVBob25lT2JqZWN0LT5Fc2NhbGF0aW9uVmlldygKICAgICAgICBVc2VySUQgID0+IDEsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiVG9kYXkiLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiVG9tb3Jyb3ciLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiTmV4dFdlZWsiLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+RXNjYWxhdGlvblZpZXcoCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIEZpbHRlciAgPT4gIlRvZGF5IiwKCiAgICAgICAgI0xpbWl0IChvcHRpb25hbCkgc2V0IHRvIDEwMCBieSBkZWZhdWx0LCBpZiBub3Qgc3BjaWZpZWQKICAgICAgICBMaW1pdCAgID0+IDUwLAoKICAgICAgICAjIE9yZGVyQnkgYW5kIFNvcnRCeSAob3B0aW9uYWwpCiAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsICAjIERvd258VXAKICAgICAgICBTb3J0QnkgID0+ICdBZ2UnLCAgICMgT3duZXJ8UmVzcG9uc2libGV8Q3VzdG9tZXJJRHxTdGF0ZXxUaWNrZXROdW1iZXJ8UXVldWV8UHJpb3JpdHl8QWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR5cGV8TG9ja3xUaXRsZXxTZXJ2aWNlfFNMQXxQZW5kaW5nVGltZXxFc2NhbGF0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc2NhbGF0aW9uVXBkYXRlVGltZXxFc2NhbGF0aW9uUmVzcG9uc2VUaW1lfEVzY2FsYXRpb25Tb2x1dGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGlja2V0RnJlZVRpbWUxLTZ8VGlja2V0RnJlZUtleTEtMTZ8VGlja2V0RnJlZVRleHQxLTE2CiAgICApOwoKICAgICNhIHJlc3VsdCBjb3VsZCBiZQoKICAgIEBSZXN1dGwgPSAoCiAgICAgICAgewogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNTk2LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICAgICAgICA9PiA5MjMsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJwaG9uZSIsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJUZXN0aW5nIGZvciBlc2NhbGF0aW9uIiwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudENoYXJzZXQgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInRleHQvcGxhaW47IiwKICAgICAgICAgICAgY2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NDY6MTUiLAogICAgICAgICAgICBDcmVhdGVkQnkgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgICAgICAgICAgICAgICA9PiAtMTI5NiwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTQiLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uVGltZSA9PiAxMjc3MzExODc0LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZUVzY2FsYXRpb24gICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyQG90cnMub3JnIiwKICAgICAgICAgICAgSW5jb21pbmdUaW1lICAgICAgICAgICAgICAgICAgICAgPT4gMTI3NzMxMTU3NSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInVubG9jayIsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJ0ZXh0L3BsYWluIiwKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICIzIG5vcm1hbCIsCiAgICAgICAgICAgIFByaW9yaXR5Q29sb3IgICAgICAgICAgICAgICAgICAgID0+ICIjY2RjZGNkIiwKICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWdlbnQxIiwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyIiwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICAgICAgICAgICAgICAgPT4gLTEyOTYsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgID0+ICIyMDEwLTA2LTIzIDExOjUxOjE0IiwKICAgICAgICAgICAgU29sdXRpb25UaW1lRGVzdGluYXRpb25UaW1lICAgICAgPT4gMTI3NzMxMTg3NCwKICAgICAgICAgICAgU29sdXRpb25UaW1lRXNjYWxhdGlvbiAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgICAgICAgICAgPT4gLTEyNjAsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJvcGVuIiwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkVzY2FsYXRpb24gVGVzdCIsCiAgICAgICAgICAgIFRpY2tldEZyZWVLZXkxMyAgICAgICAgICAgICAgICAgID0+ICJDcml0aWNhbGl0eUlEIiwKICAgICAgICAgICAgVGlja2V0RnJlZUtleTE0ICAgICAgICAgICAgICAgICAgPT4gIkltcGFjdElEIiwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMTc2LAogICAgICAgICAgICBUaWNrZXROdW1iZXIgICAgICAgICAgICAgICAgICAgICA9PiAyMDEwMDYyMzEwMDAwMDE1LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiRXNjYWxhdGlvbiBUZXN0IiwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSW5jaWRlbnQiLAogICAgICAgICAgICBVbnRpbFRpbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAtMTI5NSwKICAgICAgICAgICAgVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTUiLAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25UaW1lICAgICAgICA9PiAxMjc3MzExODc1LAogICAgICAgICAgICBVcGRhdGVUaW1lRXNjYWxhdGlvbiAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVcGRhdGVUaW1lV29ya2luZ1RpbWUgICAgICAgICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgU2VlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwgIyBvbmx5IG9uIG90cnMgMy54IGZyYW1ld29yawoKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBFc2NhbGF0aW9uVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSArIDYwICogNjAgKiAyNCAqIDcsCiAgICApOwogICAgbXkgJFRpbWVTdGFtcE5leHRXZWVrID0gIiRZZWFyLSRNb250aC0kRGF5IDIzOjU5OjU5IjsKCiAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKyA2MCAqIDYwICogMjQsCiAgICApOwogICAgbXkgJFRpbWVTdGFtcFRvbW9ycm93ID0gIiRZZWFyLSRNb250aC0kRGF5IDIzOjU5OjU5IjsKCiAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgbXkgJFRpbWVTdGFtcFRvZGF5ID0gIiRZZWFyLSRNb250aC0kRGF5IDIzOjU5OjU5IjsKCiAgICAjIGRlZmluZSBmaWx0ZXIKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIFRvZGF5ID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUb2RheScsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVGlja2V0RXNjYWxhdGlvblRpbWVPbGRlckRhdGUgPT4gJFRpbWVTdGFtcFRvZGF5LAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1NvcnRCeX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBUb21vcnJvdyA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnVG9tb3Jyb3cnLAogICAgICAgICAgICBQcmlvICAgPT4gMjAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldEVzY2FsYXRpb25UaW1lT2xkZXJEYXRlID0+ICRUaW1lU3RhbXBUb21vcnJvdywKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgICAgICA9PiAncm8nLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgTmV4dFdlZWsgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ05leHQgV2VlaycsCiAgICAgICAgICAgIFByaW8gICA9PiAzMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVGlja2V0RXNjYWxhdGlvblRpbWVPbGRlckRhdGUgPT4gJFRpbWVTdGFtcE5leHRXZWVrLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1NvcnRCeX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBkbyBzaG93biB0aWNrZXRzIGxvb2t1cAogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAxMDA7CiAgICBpZiAoICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgIG15IEBWaWV3YWJsZVRpY2tldHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7ICRQYXJhbXtGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIExpbWl0ICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICk7CiAgICAgICAgbXkgQExpc3Q7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFZpZXdhYmxlVGlja2V0cykgewogICAgICAgICAgICBuZXh0IGlmICEkVGlja2V0SUQ7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPlRpY2tldExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCwgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICAgICAgICAgIG5leHQgaWYgISVBcnRpY2xlOwogICAgICAgICAgICBwdXNoIEBMaXN0LCBcJUFydGljbGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBATGlzdDsKICAgIH0KCiAgICAjIGRvIG5hdiBiYXIgbG9va3VwCiAgICBteSBAU3RhdGVzOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ291bnROZXcgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgVGlja2V0RmxhZyA9PiB7CiAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFRpY2tldEZsYWdVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkQ291bnROZXcgPSAkQ291bnQgLSAkQ291bnROZXc7CgogICAgICAgIHB1c2ggQFN0YXRlcywgewogICAgICAgICAgICBTdGF0ZVR5cGUgPT4gJEZpbHRlciwKCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAkQ291bnROZXcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBAU3RhdGVzOwp9Cgo9aXRlbSBTdGF0dXNWaWV3KCkKCkdldCB0aGUgbnVtYmVyIG9mIHRpa2V0cyBieSBzdGF0dXMgKG9wZW4gb3IgY2xvc2VkKSBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUgaW5mb3JtYXRpb24gZnJvbSBlYWNoCnRpY2tldCBpbiBlYWNoIHN0YXR1cyB3aXRoaW4gYW4gc3BlY2lmaWVkIGZpbHRlciwgaWYgdGhlICJGaWx0ZXIiIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+U3RhdHVzVmlldygKICAgICAgICBVc2VySUQgID0+IDEsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiT3BlbiIsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHNXaXRoTmV3TWVzc2FnZXMgPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJDbG9zZWQiLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQFJlc3VsdCA9ICRpUGhvbmVPYmplY3QtPlN0YXR1c1ZpZXcoCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIEZpbHRlciAgPT4gIk9wZW4iLAoKICAgICAgICAjTGltaXQgKG9wdGlvbmFsKSBzZXQgdG8gMTAwIGJ5IGRlZmF1bHQsIGlmIG5vdCBzcGNpZmllZAogICAgICAgIExpbWl0ICAgPT4gNTAsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNTk2LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICAgICAgICA9PiA5MjMsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJwaG9uZSIsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJUaGlzIGlzIGFuIG9wZW4gdGlja2V0IiwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudENoYXJzZXQgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInRleHQvcGxhaW47IiwKICAgICAgICAgICAgY2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NDY6MTUiLAogICAgICAgICAgICBDcmVhdGVkQnkgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgICAgICAgICAgICAgICA9PiAtMTI5NiwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTQiLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uVGltZSA9PiAxMjc3MzExODc0LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZUVzY2FsYXRpb24gICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyQG90cnMub3JnIiwKICAgICAgICAgICAgSW5jb21pbmdUaW1lICAgICAgICAgICAgICAgICAgICAgPT4gMTI3NzMxMTU3NSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInVubG9jayIsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJ0ZXh0L3BsYWluIiwKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICIzIG5vcm1hbCIsCiAgICAgICAgICAgIFByaW9yaXR5Q29sb3IgICAgICAgICAgICAgICAgICAgID0+ICIjY2RjZGNkIiwKICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWdlbnQxIiwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyIiwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICAgICAgICAgICAgICAgPT4gLTEyOTYsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgID0+ICIyMDEwLTA2LTIzIDExOjUxOjE0IiwKICAgICAgICAgICAgU29sdXRpb25UaW1lRGVzdGluYXRpb25UaW1lICAgICAgPT4gMTI3NzMxMTg3NCwKICAgICAgICAgICAgU29sdXRpb25UaW1lRXNjYWxhdGlvbiAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgICAgICAgICAgPT4gLTEyNjAsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJvcGVuIiwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTMgICAgICAgICAgICAgICAgICA9PiAiQ3JpdGljYWxpdHlJRCIsCiAgICAgICAgICAgIFRpY2tldEZyZWVLZXkxNCAgICAgICAgICAgICAgICAgID0+ICJJbXBhY3RJRCIsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE3NiwKICAgICAgICAgICAgVGlja2V0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgPT4gMjAxMDA2MjMxMDAwMDAxNSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSnVuayIsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJJbmNpZGVudCIsCiAgICAgICAgICAgIFVudGlsVGltZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk1LAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNSIsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVEZXN0aW5hdGlvblRpbWUgICAgICAgID0+IDEyNzczMTE4NzUsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVFc2NhbGF0aW9uICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVXb3JraW5nVGltZSAgICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLCAjIG9ubHkgb24gb3RycyAzLnggZnJhbWV3b3JrCgogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIFN0YXR1c1ZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBmaWx0ZXIKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIE9wZW4gPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ29wZW4nLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSAgPT4gJ09wZW4nLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICA9PiAkUGFyYW17T3JkZXJCeX0sCiAgICAgICAgICAgICAgICBTb3J0QnkgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENsb3NlZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnY2xvc2VkJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDEsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBTdGF0ZVR5cGUgID0+ICdDbG9zZWQnLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICA9PiAkUGFyYW17T3JkZXJCeX0sCiAgICAgICAgICAgICAgICBTb3J0QnkgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGRvIHNob3duIHRpY2tldHMgbG9va3VwCiAgICBteSAkTGltaXQgPSAkUGFyYW17TGltaXR9IHx8IDEwMDsKICAgIGlmICggJFBhcmFte0ZpbHRlcn0gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlVGlja2V0cyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3sgJFBhcmFte0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCwKICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgKTsKICAgICAgICBteSBATGlzdDsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVmlld2FibGVUaWNrZXRzKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRUaWNrZXRJRDsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+VGlja2V0TGlzdCggVGlja2V0SUQgPT4gJFRpY2tldElELCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgICAgICAgICAgbmV4dCBpZiAhJUFydGljbGU7CiAgICAgICAgICAgIHB1c2ggQExpc3QsIFwlQXJ0aWNsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBMaXN0OwogICAgfQoKICAgICMgZG8gbmF2IGJhciBsb29rdXAKICAgIG15IEBTdGF0ZXM7CiAgICBmb3IgbXkgJEZpbHRlciAoIGtleXMgJUZpbHRlcnMgKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwogICAgICAgIG15ICRDb3VudE5ldyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgIFNlZW4gPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRDb3VudE5ldyA9ICRDb3VudCAtICRDb3VudE5ldzsKCiAgICAgICAgcHVzaCBAU3RhdGVzLCB7CiAgICAgICAgICAgIFN0YXRlVHlwZSA9PiAkRmlsdGVyLAoKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+ICRDb3VudE5ldywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIEBTdGF0ZXM7Cn0KCj1pdGVtIExvY2tlZFZpZXcoKQoKR2V0IHRoZSBudW1iZXIgb2YgbG9ja2VkIHRpa2V0cyBieSBzdGF0dXMgdHlwZSAoYWxsLCBuZXcsIHJlbWluZGVyLCByZW1pbmRlciByZWFjaGVkICkgb3IgbGFzdApjdXN0b21lciBhcnRpY2xlIGluZm9ybWF0aW9uIGZyb20gZWFjaCBsb2NrZWQgdGlja2V0IGluIGVhY2ggc3RhdHVzIHdpdGhpbiBhbiBzcGVjaWZpZWQgZmlsdGVyLCBpZgp0aGUgIkZpbHRlciIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgoKICAgIG15IEBSZXN1bHQgPSAkaVBob25lT2JqZWN0LT5Mb2NrZWRWaWV3KAogICAgICAgIFVzZXJJRCAgPT4gMSwKCiAgICAgICAgIyBPcmRlckJ5IGFuZCBTb3J0QnkgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLCAgIyBEb3dufFVwCiAgICAgICAgU29ydEJ5ICA9PiAnQWdlJywgICAjIE93bmVyfFJlc3BvbnNpYmxlfEN1c3RvbWVySUR8U3RhdGV8VGlja2V0TnVtYmVyfFF1ZXVlfFByaW9yaXR5fEFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUeXBlfExvY2t8VGl0bGV8U2VydmljZXxTTEF8UGVuZGluZ1RpbWV8RXNjYWxhdGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRXNjYWxhdGlvblVwZGF0ZVRpbWV8RXNjYWxhdGlvblJlc3BvbnNlVGltZXxFc2NhbGF0aW9uU29sdXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRpY2tldEZyZWVUaW1lMS02fFRpY2tldEZyZWVLZXkxLTE2fFRpY2tldEZyZWVUZXh0MS0xNgogICAgKTsKCiAgICAjYSByZXN1bHQgY291bGQgYmUKCiAgICBAUmVzdXRsID0gKAogICAgICAgIHsKICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJBbGwiLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiTmV3LAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiUmVtaW5kZXIsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHNXaXRoTmV3TWVzc2FnZXMgPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJSZW1pbmRlclJlYWNoZWQsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHNXaXRoTmV3TWVzc2FnZXMgPT4gMCwKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+TG9ja2VkVmlldygKICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgRmlsdGVyICA9PiAiTmV3IiwKCiAgICAgICAgI0xpbWl0IChvcHRpb25hbCkgc2V0IHRvIDEwMCBieSBkZWZhdWx0LCBpZiBub3Qgc3BjaWZpZWQKICAgICAgICBMaW1pdCAgID0+IDUwLAoKICAgICAgICAjIE9yZGVyQnkgYW5kIFNvcnRCeSAob3B0aW9uYWwpCiAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsICAjIERvd258VXAKICAgICAgICBTb3J0QnkgID0+ICdBZ2UnLCAgICMgT3duZXJ8UmVzcG9uc2libGV8Q3VzdG9tZXJJRHxTdGF0ZXxUaWNrZXROdW1iZXJ8UXVldWV8UHJpb3JpdHl8QWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR5cGV8TG9ja3xUaXRsZXxTZXJ2aWNlfFNMQXxQZW5kaW5nVGltZXxFc2NhbGF0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc2NhbGF0aW9uVXBkYXRlVGltZXxFc2NhbGF0aW9uUmVzcG9uc2VUaW1lfEVzY2FsYXRpb25Tb2x1dGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGlja2V0RnJlZVRpbWUxLTZ8VGlja2V0RnJlZUtleTEtMTZ8VGlja2V0RnJlZVRleHQxLTE2CiAgICApOwoKICAgICNhIHJlc3VsdCBjb3VsZCBiZQoKICAgIEBSZXN1dGwgPSAoCiAgICAgICAgewogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNTk2LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICAgICAgICA9PiA5MjMsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJwaG9uZSIsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJUaGlzIGlzIGFuIG9wZW4gdGlja2V0IiwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudENoYXJzZXQgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInRleHQvcGxhaW47IiwKICAgICAgICAgICAgY2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NDY6MTUiLAogICAgICAgICAgICBDcmVhdGVkQnkgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgICAgICAgICAgICAgICA9PiAtMTI5NiwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTQiLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uVGltZSA9PiAxMjc3MzExODc0LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZUVzY2FsYXRpb24gICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyQG90cnMub3JnIiwKICAgICAgICAgICAgSW5jb21pbmdUaW1lICAgICAgICAgICAgICAgICAgICAgPT4gMTI3NzMxMTU3NSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImxvY2siLAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidGV4dC9wbGFpbiIsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJBZ2VudDEiLAogICAgICAgICAgICBQcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiMyBub3JtYWwiLAogICAgICAgICAgICBQcmlvcml0eUNvbG9yICAgICAgICAgICAgICAgICAgICA9PiAiI2NkY2RjZCIsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJKdW5rIiwKICAgICAgICAgICAgUmVzcG9uc2libGUgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgID0+ICJjdXN0b21lciIsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk2LAogICAgICAgICAgICBTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNCIsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uVGltZSAgICAgID0+IDEyNzczMTE4NzQsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZUVzY2FsYXRpb24gICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZVdvcmtpbmdUaW1lICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAib3BlbiIsCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJPcGVuIFRpY2tldCBUZXN0IiwKICAgICAgICAgICAgVGlja2V0RnJlZUtleTEzICAgICAgICAgICAgICAgICAgPT4gIkNyaXRpY2FsaXR5SUQiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTQgICAgICAgICAgICAgICAgICA9PiAiSW1wYWN0SUQiLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNzYsCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgICAgICAgICAgICAgICAgICAgID0+IDIwMTAwNjIzMTAwMDAwMTUsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJPcGVuIFRpY2tldCBUZXN0IiwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSW5jaWRlbnQiLAogICAgICAgICAgICBVbnRpbFRpbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAtMTI5NSwKICAgICAgICAgICAgVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTUiLAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25UaW1lICAgICAgICA9PiAxMjc3MzExODc1LAogICAgICAgICAgICBVcGRhdGVUaW1lRXNjYWxhdGlvbiAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVcGRhdGVUaW1lV29ya2luZ1RpbWUgICAgICAgICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgU2VlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwgIyBvbmx5IG9uIG90cnMgMy54IGZyYW1ld29yawogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIExvY2tlZFZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBmaWx0ZXIKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIEFsbCA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgID0+IFsnbG9jayddLAogICAgICAgICAgICAgICAgT3duZXJJRHMgICA9PiBbICRQYXJhbXtVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgPT4gJFBhcmFte1NvcnRCeX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBOZXcgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ05ldyBBcnRpY2xlJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDEsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgID0+IFsnbG9jayddLAogICAgICAgICAgICAgICAgT3duZXJJRHMgICA9PiBbICRQYXJhbXtVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlbWluZGVyID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQZW5kaW5nJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDIsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgID0+IFsnbG9jayddLAogICAgICAgICAgICAgICAgU3RhdGVUeXBlICA9PiBbICdwZW5kaW5nIHJlbWluZGVyJywgJ3BlbmRpbmcgYXV0bycgXSwKICAgICAgICAgICAgICAgIE93bmVySURzICAgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICA9PiAkUGFyYW17T3JkZXJCeX0sCiAgICAgICAgICAgICAgICBTb3J0QnkgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVtaW5kZXJSZWFjaGVkID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdSZW1pbmRlciBSZWFjaGVkJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDMsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbJ2xvY2snXSwKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgID0+IFsncGVuZGluZyByZW1pbmRlciddLAogICAgICAgICAgICAgICAgVGlja2V0UGVuZGluZ1RpbWVPbGRlck1pbnV0ZXMgPT4gMSwKICAgICAgICAgICAgICAgIE93bmVySURzICAgICAgICAgICAgICAgICAgICAgID0+IFsgJFBhcmFte1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBkbyBzaG93biB0aWNrZXRzIGxvb2t1cAogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAxMDA7CiAgICBpZiAoICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgIG15IEBWaWV3YWJsZVRpY2tldHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7ICRQYXJhbXtGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIExpbWl0ICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICk7CiAgICAgICAgbXkgQExpc3Q7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFZpZXdhYmxlVGlja2V0cykgewogICAgICAgICAgICBuZXh0IGlmICEkVGlja2V0SUQ7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPlRpY2tldExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCwgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICAgICAgICAgIG5leHQgaWYgISVBcnRpY2xlOwogICAgICAgICAgICBwdXNoIEBMaXN0LCBcJUFydGljbGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBATGlzdDsKICAgIH0KCiAgICAjIGRvIG5hdiBiYXIgbG9va3VwCiAgICBteSBAU3RhdGVzOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ291bnROZXcgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgVGlja2V0RmxhZyA9PiB7CiAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFRpY2tldEZsYWdVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkQ291bnROZXcgPSAkQ291bnQgLSAkQ291bnROZXc7CgogICAgICAgIHB1c2ggQFN0YXRlcywgewogICAgICAgICAgICBTdGF0ZVR5cGUgPT4gJEZpbHRlciwKCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAkQ291bnROZXcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBAU3RhdGVzOwp9Cgo9aXRlbSBXYXRjaGVkVmlldygpCgpHZXQgdGhlIG51bWJlciBvZiB3YXRjaGVkIHRpa2V0cyBieSBzdGF0dXMgdHlwZSAoYWxsLCBuZXcsIHJlbWluZGVyLCByZW1pbmRlciByZWFjaGVkICkgb3IgbGFzdApjdXN0bWVyIGFydGljbGUgaW5mb3JtYXRpb24gZnJvbSBlYWNoIHdhdGNoZWQgdGlja2V0IGluIGVhY2ggc3RhdHVzIHdpdGhpbiBhbiBzcGVjaWZpZWQgZmlsdGVyLCBpZgp0aGUgIkZpbHRlciIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgoKICAgIG15IEBSZXN1bHQgPSAkaVBob25lT2JqZWN0LT5XYXRjaGVkVmlldygKICAgICAgICBVc2VySUQgID0+IDEsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWxsIiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTdGF0ZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gIk5ldywKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTdGF0ZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gIlJlbWluZGVyLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiUmVtaW5kZXJSZWFjaGVkLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQFJlc3VsdCA9ICRpUGhvbmVPYmplY3QtPldhdGNoZWRWaWV3KAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICBGaWx0ZXIgID0+ICJOZXciLAoKICAgICAgICAjTGltaXQgKG9wdGlvbmFsKSBzZXQgdG8gMTAwIGJ5IGRlZmF1bHQsIGlmIG5vdCBzcGNpZmllZAogICAgICAgIExpbWl0ICAgPT4gNTAsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE1OTYsCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgICAgICAgID0+IDkyMywKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInBob25lIiwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIlRoaXMgaXMgYW4gb3BlbiB0aWNrZXQiLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50Q2hhcnNldCAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAidGV4dC9wbGFpbjsiLAogICAgICAgICAgICBjaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo0NjoxNSIsCiAgICAgICAgICAgIENyZWF0ZWRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgICAgICAgICAgICAgID0+IC0xMjk2LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNCIsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25UaW1lID0+IDEyNzczMTE4NzQsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRXNjYWxhdGlvbiAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgICAgID0+IC0xMjYwLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiY3VzdG9tZXJAb3Rycy5vcmciLAogICAgICAgICAgICBJbmNvbWluZ1RpbWUgICAgICAgICAgICAgICAgICAgICA9PiAxMjc3MzExNTc1LAogICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAibG9jayIsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJ0ZXh0L3BsYWluIiwKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICIzIG5vcm1hbCIsCiAgICAgICAgICAgIFByaW9yaXR5Q29sb3IgICAgICAgICAgICAgICAgICAgID0+ICIjY2RjZGNkIiwKICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWdlbnQxIiwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyIiwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICAgICAgICAgICAgICAgPT4gLTEyOTYsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgID0+ICIyMDEwLTA2LTIzIDExOjUxOjE0IiwKICAgICAgICAgICAgU29sdXRpb25UaW1lRGVzdGluYXRpb25UaW1lICAgICAgPT4gMTI3NzMxMTg3NCwKICAgICAgICAgICAgU29sdXRpb25UaW1lRXNjYWxhdGlvbiAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgICAgICAgICAgPT4gLTEyNjAsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJvcGVuIiwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTMgICAgICAgICAgICAgICAgICA9PiAiQ3JpdGljYWxpdHlJRCIsCiAgICAgICAgICAgIFRpY2tldEZyZWVLZXkxNCAgICAgICAgICAgICAgICAgID0+ICJJbXBhY3RJRCIsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE3NiwKICAgICAgICAgICAgVGlja2V0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgPT4gMjAxMDA2MjMxMDAwMDAxNSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSnVuayIsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJJbmNpZGVudCIsCiAgICAgICAgICAgIFVudGlsVGltZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk1LAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNSIsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVEZXN0aW5hdGlvblRpbWUgICAgICAgID0+IDEyNzczMTE4NzUsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVFc2NhbGF0aW9uICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVXb3JraW5nVGltZSAgICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLCAjIG9ubHkgb24gb3RycyAzLnggZnJhbWV3b3JrCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgV2F0Y2hlZFZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBmaWx0ZXIKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIEFsbCA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgICAgPT4gWydsb2NrJ10sCiAgICAgICAgICAgICAgICBXYXRjaFVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBOZXcgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ05ldyBBcnRpY2xlJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDEsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgICAgPT4gWydsb2NrJ10sCiAgICAgICAgICAgICAgICBXYXRjaFVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgVGlja2V0RmxhZyAgID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlbWluZGVyID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQZW5kaW5nJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDIsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBMb2NrcyAgICAgICAgPT4gWydsb2NrJ10sCiAgICAgICAgICAgICAgICBTdGF0ZVR5cGUgICAgPT4gWyAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgICAgICAgICBXYXRjaFVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZW1pbmRlclJlYWNoZWQgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1JlbWluZGVyIFJlYWNoZWQnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMywKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIExvY2tzICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsnbG9jayddLAogICAgICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gWydwZW5kaW5nIHJlbWluZGVyJ10sCiAgICAgICAgICAgICAgICBUaWNrZXRQZW5kaW5nVGltZU9sZGVyTWludXRlcyA9PiAxLAogICAgICAgICAgICAgICAgV2F0Y2hVc2VySURzICAgICAgICAgICAgICAgICAgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1NvcnRCeX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGRvIHNob3duIHRpY2tldHMgbG9va3VwCiAgICBteSAkTGltaXQgPSAkUGFyYW17TGltaXR9IHx8IDEwMDsKICAgIGlmICggJFBhcmFte0ZpbHRlcn0gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlVGlja2V0cyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3sgJFBhcmFte0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCwKICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgKTsKICAgICAgICBteSBATGlzdDsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVmlld2FibGVUaWNrZXRzKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRUaWNrZXRJRDsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+VGlja2V0TGlzdCggVGlja2V0SUQgPT4gJFRpY2tldElELCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgICAgICAgICAgbmV4dCBpZiAhJUFydGljbGU7CiAgICAgICAgICAgIHB1c2ggQExpc3QsIFwlQXJ0aWNsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBMaXN0OwogICAgfQoKICAgICMgZG8gbmF2IGJhciBsb29rdXAKICAgIG15IEBTdGF0ZXM7CiAgICBmb3IgbXkgJEZpbHRlciAoIGtleXMgJUZpbHRlcnMgKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwogICAgICAgIG15ICRDb3VudE5ldyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgIFNlZW4gPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRDb3VudE5ldyA9ICRDb3VudCAtICRDb3VudE5ldzsKCiAgICAgICAgcHVzaCBAU3RhdGVzLCB7CiAgICAgICAgICAgIFN0YXRlVHlwZSA9PiAkRmlsdGVyLAoKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+ICRDb3VudE5ldywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIEBTdGF0ZXM7Cn0KCj1pdGVtIFJlc3BvbnNpYmxlVmlldygpCgpHZXQgdGhlIG51bWJlciBvZiBsb2NrZWQgb3IgdW5sb2NrZWQgdGlrZXRzIHdoZXJlIHRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBieSBzdGF0dXMgdHlwZQooYWxsLCBuZXcsIHJlbWluZGVyLCByZW1pbmRlciByZWFjaGVkICkgb3IgbGFzdCBjdXN0b21lciBhcnRpY2xlIGluZm9ybWF0aW9uIGZyb20gZWFjaCB0aWNrZXQgd2hlcmUKdGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yICBpbiBlYWNoIHN0YXR1cyB3aXRoaW4gYW4gc3BlY2lmaWVkIGZpbHRlciwgaWYgdGhlICJGaWx0ZXIiIGFyZ3VtZW50IGlzCnNwZWNpZmllZC4KCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+UmVzcG9uc2libGVWaWV3KAogICAgICAgIFVzZXJJRCAgPT4gMSwKCiAgICAgICAgIyBPcmRlckJ5IGFuZCBTb3J0QnkgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLCAgIyBEb3dufFVwCiAgICAgICAgU29ydEJ5ICA9PiAnQWdlJywgICAjIE93bmVyfFJlc3BvbnNpYmxlfEN1c3RvbWVySUR8U3RhdGV8VGlja2V0TnVtYmVyfFF1ZXVlfFByaW9yaXR5fEFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUeXBlfExvY2t8VGl0bGV8U2VydmljZXxTTEF8UGVuZGluZ1RpbWV8RXNjYWxhdGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRXNjYWxhdGlvblVwZGF0ZVRpbWV8RXNjYWxhdGlvblJlc3BvbnNlVGltZXxFc2NhbGF0aW9uU29sdXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRpY2tldEZyZWVUaW1lMS02fFRpY2tldEZyZWVLZXkxLTE2fFRpY2tldEZyZWVUZXh0MS0xNgogICAgKTsKCiAgICAjYSByZXN1bHQgY291bGQgYmUKCiAgICBAUmVzdXRsID0gKAogICAgICAgIHsKICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJBbGwiLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiTmV3LAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAiUmVtaW5kZXIsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHNXaXRoTmV3TWVzc2FnZXMgPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJSZW1pbmRlclJlYWNoZWQsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOdW1iZXJPZlRpY2tldHNXaXRoTmV3TWVzc2FnZXMgPT4gMCwKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+UmVzcG9uc2libGVWaWV3KAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICBGaWx0ZXIgID0+ICJOZXciLAoKICAgICAgICAjTGltaXQgKG9wdGlvbmFsKSBzZXQgdG8gMTAwIGJ5IGRlZmF1bHQsIGlmIG5vdCBzcGNpZmllZAogICAgICAgIExpbWl0ICAgPT4gNTAsCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBPd25lcnxSZXNwb25zaWJsZXxDdXN0b21lcklEfFN0YXRlfFRpY2tldE51bWJlcnxRdWV1ZXxQcmlvcml0eXxBZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZXxMb2NrfFRpdGxlfFNlcnZpY2V8U0xBfFBlbmRpbmdUaW1lfEVzY2FsYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVzY2FsYXRpb25VcGRhdGVUaW1lfEVzY2FsYXRpb25SZXNwb25zZVRpbWV8RXNjYWxhdGlvblNvbHV0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaWNrZXRGcmVlVGltZTEtNnxUaWNrZXRGcmVlS2V5MS0xNnxUaWNrZXRGcmVlVGV4dDEtMTYKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE1OTYsCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgICAgICAgID0+IDkyMywKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInBob25lIiwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIlRoaXMgaXMgYW4gb3BlbiB0aWNrZXQiLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50Q2hhcnNldCAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAidGV4dC9wbGFpbjsiLAogICAgICAgICAgICBjaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo0NjoxNSIsCiAgICAgICAgICAgIENyZWF0ZWRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgICAgICAgICAgICAgID0+IC0xMjk2LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNCIsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25UaW1lID0+IDEyNzczMTE4NzQsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRXNjYWxhdGlvbiAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgICAgID0+IC0xMjYwLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiY3VzdG9tZXJAb3Rycy5vcmciLAogICAgICAgICAgICBJbmNvbWluZ1RpbWUgICAgICAgICAgICAgICAgICAgICA9PiAxMjc3MzExNTc1LAogICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAibG9jayIsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJ0ZXh0L3BsYWluIiwKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICIzIG5vcm1hbCIsCiAgICAgICAgICAgIFByaW9yaXR5Q29sb3IgICAgICAgICAgICAgICAgICAgID0+ICIjY2RjZGNkIiwKICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWdlbnQxIiwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyIiwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICAgICAgICAgICAgICAgPT4gLTEyOTYsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgID0+ICIyMDEwLTA2LTIzIDExOjUxOjE0IiwKICAgICAgICAgICAgU29sdXRpb25UaW1lRGVzdGluYXRpb25UaW1lICAgICAgPT4gMTI3NzMxMTg3NCwKICAgICAgICAgICAgU29sdXRpb25UaW1lRXNjYWxhdGlvbiAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgICAgICAgICAgPT4gLTEyNjAsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJvcGVuIiwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTMgICAgICAgICAgICAgICAgICA9PiAiQ3JpdGljYWxpdHlJRCIsCiAgICAgICAgICAgIFRpY2tldEZyZWVLZXkxNCAgICAgICAgICAgICAgICAgID0+ICJJbXBhY3RJRCIsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE3NiwKICAgICAgICAgICAgVGlja2V0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgPT4gMjAxMDA2MjMxMDAwMDAxNSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSnVuayIsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJJbmNpZGVudCIsCiAgICAgICAgICAgIFVudGlsVGltZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk1LAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNSIsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVEZXN0aW5hdGlvblRpbWUgICAgICAgID0+IDEyNzczMTE4NzUsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVFc2NhbGF0aW9uICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVXb3JraW5nVGltZSAgICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLCAjIG9ubHkgb24gb3RycyAzLnggZnJhbWV3b3JrCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgUmVzcG9uc2libGVWaWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgZmlsdGVyCiAgICBteSAlRmlsdGVycyA9ICgKICAgICAgICBBbGwgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgU3RhdGVUeXBlICAgICAgICAgID0+ICdPcGVuJywKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcklEcyA9PiBbICRQYXJhbXtVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uICAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE5ldyA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnTmV3IEFydGljbGUnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMSwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICA9PiAnT3BlbicsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgVGlja2V0RmxhZyAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICAgICAgU29ydEJ5ICAgICAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlbWluZGVyID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQZW5kaW5nJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDIsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBTdGF0ZVR5cGUgPT4gWyAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJJRHMgPT4gWyAkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICAgICAgICA9PiAkUGFyYW17U29ydEJ5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZW1pbmRlclJlYWNoZWQgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1JlbWluZGVyIFJlYWNoZWQnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMywKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgICAgICAgICAgID0+IFsncGVuZGluZyByZW1pbmRlciddLAogICAgICAgICAgICAgICAgVGlja2V0UGVuZGluZ1RpbWVPbGRlck1pbnV0ZXMgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcklEcyAgICAgICAgICAgID0+IFsgJFBhcmFte1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtPcmRlckJ5fSwKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgID0+ICdybycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewoKICAgICAgICAjIGRvIHNob3duIHRpY2tldHMgbG9va3VwCiAgICAgICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAxMDA7CiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSApIHsKICAgICAgICAgICAgbXkgQFZpZXdhYmxlVGlja2V0cyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7ICRQYXJhbXtGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgICAgICBMaW1pdCAgPT4gJExpbWl0LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBMaXN0OwogICAgICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVmlld2FibGVUaWNrZXRzKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICEkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICBteSAlQXJ0aWNsZSA9ICRTZWxmLT5UaWNrZXRMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQsIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwogICAgICAgICAgICAgICAgbmV4dCBpZiAhJUFydGljbGU7CiAgICAgICAgICAgICAgICBwdXNoIEBMaXN0LCBcJUFydGljbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBkbyBuYXYgYmFyIGxvb2t1cAogICAgICAgIG15IEBTdGF0ZXM7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDb3VudE5ldyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWVuID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvdW50TmV3ID0gJENvdW50IC0gJENvdW50TmV3OwoKICAgICAgICAgICAgcHVzaCBAU3RhdGVzLCB7CiAgICAgICAgICAgICAgICBTdGF0ZVR5cGUgPT4gJEZpbHRlciwKCiAgICAgICAgICAgICAgICBOdW1iZXJPZlRpY2tldHMgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzV2l0aE5ld01lc3NhZ2VzID0+ICRDb3VudE5ldywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBTdGF0ZXM7CiAgICB9CiAgICByZXR1cm4KfQoKPWl0ZW0gUXVldWVWaWV3KCkKCkdldCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIHRpa2V0cyBieSBxdWV1ZSBhcyB3ZWxsIGFzIGJhc2ljIHF1ZXVlIGluZm9ybWF0aW9uLCBvciBsYXMgY3VzdG9tZXIKYXJ0aWNsZSBpbmZvcm1hdGlvbiBmcm9tIGVhY2ggdGlja2V0IHdpdGhpbiBhbiBzcGVjaWZpZWQgcXVldWUsIGlmIHRoZSAiUXVldWUiIGFyZ3VtZW50IGlzCnNwZWNpZmllZC4KCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+UXVldWVWaWV3KAogICAgICAgIFVzZXJJRCAgPT4gMSwKCiAgICAgICAgIyBPcmRlckJ5IGFuZCBTb3J0QnkgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLCAgIyBEb3dufFVwCiAgICAgICAgU29ydEJ5ICA9PiAnQWdlJywgICAjIE93bmVyfFJlc3BvbnNpYmxlfEN1c3RvbWVySUR8U3RhdGV8VGlja2V0TnVtYmVyfFF1ZXVlfFByaW9yaXR5fEFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUeXBlfExvY2t8VGl0bGV8U2VydmljZXxTTEF8UGVuZGluZ1RpbWV8RXNjYWxhdGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRXNjYWxhdGlvblVwZGF0ZVRpbWV8RXNjYWxhdGlvblJlc3BvbnNlVGltZXxFc2NhbGF0aW9uU29sdXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRpY2tldEZyZWVUaW1lMS02fFRpY2tldEZyZWVLZXkxLTE2fFRpY2tldEZyZWVUZXh0MS0xNgogICAgKTsKCiAgICAjYSByZXN1bHQgY291bGQgYmUKCiAgICBAUmVzdXRsID0gKAogICAgICAgIHsKICAgICAgICAgICAgUXVldWVOYW1lICAgICAgICAgICAgICAgICAgICAgID0+ICJKdW5rIiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAwLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICAgID0+ICJBbGwganVuayB0aWNrZXRzLiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgUXVldWVOYW1lICAgICAgICAgICAgICAgICAgICAgID0+ICJNaXNjIiwKICAgICAgICAgICAgTnVtYmVyT2ZUaWNrZXRzICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAwLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgPT4gNCwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICAgID0+ICJBbGwgbWlzYyB0aWNrZXRzLiIKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVzdWx0ID0gJGlQaG9uZU9iamVjdC0+UXVldWVWaWV3KAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgUXVldWVJRCAgPT4gNCwKCiAgICAgICAgI0xpbWl0IChvcHRpb25hbCkgc2V0IHRvIDEwMCBieSBkZWZhdWx0LCBpZiBub3Qgc3BjaWZpZWQKICAgICAgICBMaW1pdCAgICA9PiA1MCwKCiAgICAgICAgIyBPcmRlckJ5IGFuZCBTb3J0QnkgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgID0+ICdBZ2UnLCAgICMgT3duZXJ8UmVzcG9uc2libGV8Q3VzdG9tZXJJRHxTdGF0ZXxUaWNrZXROdW1iZXJ8UXVldWV8UHJpb3JpdHl8QWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR5cGV8TG9ja3xUaXRsZXxTZXJ2aWNlfFNMQXxQZW5kaW5nVGltZXxFc2NhbGF0aW9uVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc2NhbGF0aW9uVXBkYXRlVGltZXxFc2NhbGF0aW9uUmVzcG9uc2VUaW1lfEVzY2FsYXRpb25Tb2x1dGlvblRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGlja2V0RnJlZVRpbWUxLTZ8VGlja2V0RnJlZUtleTEtMTZ8VGlja2V0RnJlZVRleHQxLTE2CiAgICApOwoKICAgICNhIHJlc3VsdCBjb3VsZCBiZQoKICAgIEBSZXN1dGwgPSAoCiAgICAgICAgewogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNTk2LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICAgICAgICA9PiA5MjMsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICJwaG9uZSIsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJUaGlzIGlzIGFuIG9wZW4gdGlja2V0IiwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudENoYXJzZXQgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInRleHQvcGxhaW47IiwKICAgICAgICAgICAgY2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gInV0Zi04IiwKICAgICAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NDY6MTUiLAogICAgICAgICAgICBDcmVhdGVkQnkgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgICAgICAgICAgICAgICA9PiAtMTI5NiwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTQiLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uVGltZSA9PiAxMjc3MzExODc0LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZUVzY2FsYXRpb24gICAgICA9PiAxLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyQG90cnMub3JnIiwKICAgICAgICAgICAgSW5jb21pbmdUaW1lICAgICAgICAgICAgICAgICAgICAgPT4gMTI3NzMxMTU3NSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gImxvY2siLAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidGV4dC9wbGFpbiIsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJBZ2VudDEiLAogICAgICAgICAgICBQcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiMyBub3JtYWwiLAogICAgICAgICAgICBQcmlvcml0eUNvbG9yICAgICAgICAgICAgICAgICAgICA9PiAiI2NkY2RjZCIsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJNaXNjIiwKICAgICAgICAgICAgUmVzcG9uc2libGUgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgID0+ICJjdXN0b21lciIsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk2LAogICAgICAgICAgICBTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNCIsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uVGltZSAgICAgID0+IDEyNzczMTE4NzQsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZUVzY2FsYXRpb24gICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZVdvcmtpbmdUaW1lICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAib3BlbiIsCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJPcGVuIFRpY2tldCBUZXN0IiwKICAgICAgICAgICAgVGlja2V0RnJlZUtleTEzICAgICAgICAgICAgICAgICAgPT4gIkNyaXRpY2FsaXR5SUQiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTQgICAgICAgICAgICAgICAgICA9PiAiSW1wYWN0SUQiLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxNzYsCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgICAgICAgICAgICAgICAgICAgID0+IDIwMTAwNjIzMTAwMDAwMTUsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJPcGVuIFRpY2tldCBUZXN0IiwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkp1bmsiLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSW5jaWRlbnQiLAogICAgICAgICAgICBVbnRpbFRpbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAtMTI5NSwKICAgICAgICAgICAgVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgICAgPT4gIjIwMTAtMDYtMjMgMTE6NTE6MTUiLAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25UaW1lICAgICAgICA9PiAxMjc3MzExODc1LAogICAgICAgICAgICBVcGRhdGVUaW1lRXNjYWxhdGlvbiAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVcGRhdGVUaW1lV29ya2luZ1RpbWUgICAgICAgICAgICA9PiAtMTI2MCwKICAgICAgICAgICAgU2VlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwgIyBvbmx5IG9uIG90cnMgMy54IGZyYW1ld29yawogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIFF1ZXVlVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBWaWV3YWJsZUxvY2tJRHMgPSAkU2VsZi0+e0xvY2tPYmplY3R9LT5Mb2NrVmlld2FibGVMb2NrKCBUeXBlID0+ICdJRCcgKTsKCiAgICBteSBAVmlld2FibGVTdGF0ZUlEcyA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICBUeXBlICAgPT4gJ1ZpZXdhYmxlJywKICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICk7CgogICAgIyBkbyBzaG93biB0aWNrZXRzIGxvb2t1cAogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAxMDA7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICBteSBAVmlld2FibGVUaWNrZXRzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCgogICAgICAgICAgICAjICAgICAgICAgICAgJXsgJEZpbHRlcnN7ICRQYXJhbXtGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIE9yZGVyQnkgICAgPT4gJFBhcmFte09yZGVyQnl9LAogICAgICAgICAgICBTb3J0QnkgICAgID0+ICRQYXJhbXtTb3J0Qnl9LAogICAgICAgICAgICBTdGF0ZUlEcyAgID0+IFxAVmlld2FibGVTdGF0ZUlEcywKICAgICAgICAgICAgTG9ja0lEcyAgICA9PiBcQFZpZXdhYmxlTG9ja0lEcywKICAgICAgICAgICAgUXVldWVJRHMgICA9PiBbICRQYXJhbXtRdWV1ZUlEfSBdLAogICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIExpbWl0ICAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgKTsKICAgICAgICBteSBATGlzdDsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVmlld2FibGVUaWNrZXRzKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRUaWNrZXRJRDsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+VGlja2V0TGlzdCggVGlja2V0SUQgPT4gJFRpY2tldElELCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgICAgICAgICAgbmV4dCBpZiAhJUFydGljbGU7CiAgICAgICAgICAgIHB1c2ggQExpc3QsIFwlQXJ0aWNsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBMaXN0OwogICAgfQoKICAgIG15ICVBbGxRdWV1ZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMaXN0KCBWYWxpZCA9PiAwICk7CgogICAgbXkgQFF1ZXVlczsKICAgIG15ICVRdWV1ZVN1bTsKICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlQWxsUXVldWVzICkgewogICAgICAgIG15ICVRdWV1ZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFN0YXRlSURzID0+IFxAVmlld2FibGVTdGF0ZUlEcywKICAgICAgICAgICAgTG9ja0lEcyAgPT4gXEBWaWV3YWJsZUxvY2tJRHMsCiAgICAgICAgICAgIFF1ZXVlSURzID0+IFskUXVldWVJRF0sCgogICAgICAgICAgICAjICAgICAgICAgICAgUXVldWVJRHMgPT4gXEBWaWV3YWJsZVF1ZXVlSURzLAogICAgICAgICAgICAjICAgICAgICAgICAgJVNvcnQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBMaW1pdCAgICAgID0+IDEwMDAsCiAgICAgICAgKTsKICAgICAgICBuZXh0IGlmICEkQ291bnQ7CgogICAgICAgIG15ICRDb3VudE5ldyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBTdGF0ZUlEcyA9PiBcQFZpZXdhYmxlU3RhdGVJRHMsCiAgICAgICAgICAgIExvY2tJRHMgID0+IFxAVmlld2FibGVMb2NrSURzLAogICAgICAgICAgICBRdWV1ZUlEcyA9PiBbJFF1ZXVlSURdLAoKICAgICAgICAgICAgIyAgICAgICAgICAgIFF1ZXVlSURzID0+IFxAVmlld2FibGVRdWV1ZUlEcywKICAgICAgICAgICAgIyAgICAgICAgICAgICVTb3J0LAogICAgICAgICAgICBUaWNrZXRGbGFnID0+IHsKICAgICAgICAgICAgICAgIFNlZW4gPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVGlja2V0RmxhZ1VzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICA9PiAncncnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICApOwogICAgICAgICRDb3VudE5ldyA9ICRDb3VudCAtICRDb3VudE5ldzsKCiAgICAgICAgcHVzaCBAUXVldWVzLCB7CiAgICAgICAgICAgIFF1ZXVlSUQgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgUXVldWVOYW1lID0+ICRRdWV1ZXtOYW1lfSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICRRdWV1ZXtDb21tZW50fSwKCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0cyAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIE51bWJlck9mVGlja2V0c1dpdGhOZXdNZXNzYWdlcyA9PiAkQ291bnROZXcsCiAgICAgICAgfTsKICAgIH0KCiAgICAjICAgIGZvciBteSAkVGlja2V0SUQgKEBWaWV3YWJsZVRpY2tldHMpIHsKICAgICMgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldCggVGlja2V0SUQgPT4gJFRpY2tldElEICkKICAgICMgICAgICAgICRRdWV1ZVN1bXtRdWV1ZUlEfQogICAgIyAgICB9CiAgICByZXR1cm4gQFF1ZXVlczsKfQoKPWl0ZW0gVGlja2V0TGlzdCgpCgpHZXQgdGhlIGxhc3QgY3VzdG9tZXIgYXJ0aWNsZSBpbmZvcm1hdGlvbiBvZiBhIHRpY2tldAoKICAgIG15IEBSZXN1bHQgPSAkaVBob25lT2JqZWN0LT5UaWNrZXRMaXN0KAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgVGlja2V0SUQgID0+IDE3NiwKICAgICk7CgogICAgI2EgcmVzdWx0IGNvdWxkIGJlCgogICAgQFJlc3V0bCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE1OTYsCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgICAgICAgID0+IDkyMywKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gInBob25lIiwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIlRoaXMgaXMgYW4gb3BlbiB0aWNrZXQiLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50Q2hhcnNldCAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAidGV4dC9wbGFpbjsiLAogICAgICAgICAgICBjaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAidXRmLTgiLAogICAgICAgICAgICBDcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo0NjoxNSIsCiAgICAgICAgICAgIENyZWF0ZWRCeSAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgICAgICAgICAgICAgID0+IC0xMjk2LAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNCIsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25UaW1lID0+IDEyNzczMTE4NzQsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lRXNjYWxhdGlvbiAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgICAgID0+IC0xMjYwLAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiY3VzdG9tZXJAb3Rycy5vcmciLAogICAgICAgICAgICBJbmNvbWluZ1RpbWUgICAgICAgICAgICAgICAgICAgICA9PiAxMjc3MzExNTc1LAogICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAibG9jayIsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJ0ZXh0L3BsYWluIiwKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIkFnZW50MSIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICIzIG5vcm1hbCIsCiAgICAgICAgICAgIFByaW9yaXR5Q29sb3IgICAgICAgICAgICAgICAgICAgID0+ICIjY2RjZGNkIiwKICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk1pc2MiLAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgICAgICAgICAgICAgICA9PiAiQWdlbnQxIiwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPT4gImN1c3RvbWVyIiwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICAgICAgICAgICAgICAgPT4gLTEyOTYsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSAgICAgID0+ICIyMDEwLTA2LTIzIDExOjUxOjE0IiwKICAgICAgICAgICAgU29sdXRpb25UaW1lRGVzdGluYXRpb25UaW1lICAgICAgPT4gMTI3NzMxMTg3NCwKICAgICAgICAgICAgU29sdXRpb25UaW1lRXNjYWxhdGlvbiAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgICAgICAgICAgPT4gLTEyNjAsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJvcGVuIiwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUaWNrZXRGcmVlS2V5MTMgICAgICAgICAgICAgICAgICA9PiAiQ3JpdGljYWxpdHlJRCIsCiAgICAgICAgICAgIFRpY2tldEZyZWVLZXkxNCAgICAgICAgICAgICAgICAgID0+ICJJbXBhY3RJRCIsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDE3NiwKICAgICAgICAgICAgVGlja2V0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgPT4gMjAxMDA2MjMxMDAwMDAxNSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gIk9wZW4gVGlja2V0IFRlc3QiLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAiSnVuayIsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICJJbmNpZGVudCIsCiAgICAgICAgICAgIFVudGlsVGltZSAgICAgICAgICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgICAgICAgICAgICAgID0+IC0xMjk1LAogICAgICAgICAgICBVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlICAgICAgICA9PiAiMjAxMC0wNi0yMyAxMTo1MToxNSIsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVEZXN0aW5hdGlvblRpbWUgICAgICAgID0+IDEyNzczMTE4NzUsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVFc2NhbGF0aW9uICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVwZGF0ZVRpbWVXb3JraW5nVGltZSAgICAgICAgICAgID0+IC0xMjYwLAogICAgICAgICAgICBTZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLCAjIG9ubHkgb24gb3RycyAzLnggZnJhbWV3b3JrCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgVGlja2V0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVDb2xvciA9ICgKICAgICAgICAxID0+ICcjY2RjZGNkJywKICAgICAgICAyID0+ICcjY2RjZGNkJywKICAgICAgICAzID0+ICcjY2RjZGNkJywKICAgICAgICA0ID0+ICcjZmZhYWFhJywKICAgICAgICA1ID0+ICcjZmY1MDVlJywKICAgICk7CgogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwoKICAgICRBcnRpY2xle1ByaW9yaXR5Q29sb3J9ID0gJENvbG9yeyAkQXJ0aWNsZXtQcmlvcml0eUlEfSB9OwoKICAgIGlmICggJFNlbGYtPnsnQVBJM1gnfSApIHsKICAgICAgICBteSAlVGlja2V0RmxhZyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RmxhZ0dldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRUaWNrZXRGbGFne3NlZW59IHx8ICRUaWNrZXRGbGFne1NlZW59ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTZWVufSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc3RyaXAgb3V0IGFsbCBkYXRhCiAgICBteSBARGVsZXRlCiAgICAgICAgPSBxdyhSZXBseVRvIE1lc3NhZ2VJRCBJblJlcGx5VG8gUmVmZXJlbmNlcyBBZ2VUaW1lVW5peCBDcmVhdGVUaW1lVW5peCBQcmlvcml0eUlEIFN0YXRlSUQKICAgICAgICBRdWV1ZUlEIFNlbmRlclR5cGVJRCBPd25lcklEIFJlc3BvbnNpYmxlSUQgQXJ0aWNsZVR5cGVJRCBBcnRpY2xlRnJlZUtleTEKICAgICAgICBBcnRpY2xlRnJlZUtleTIgQXJ0aWNsZUZyZWVLZXkzIEFydGljbGVGcmVlVGV4dDEgQXJ0aWNsZUZyZWVUZXh0MgogICAgICAgIEFydGljbGVGcmVlVGV4dDMgSW5jb21pbmdUaW1lIFJlYWxUaWxsVGltZU5vdFVzZWQgTG9ja0lEIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQKICAgICAgICBTdGF0ZVR5cGUgQXJjaGl2ZUZsYWcgVW5sb2NrVGltZW91dCBDaGFuZ2VkCiAgICApOwoKICAgIGZvciBteSAkS2V5IChARGVsZXRlKSB7CiAgICAgICAgZGVsZXRlICRBcnRpY2xleyRLZXl9OwogICAgfQoKICAgIGZvciBteSAkS2V5ICgga2V5cyAlQXJ0aWNsZSApIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRBcnRpY2xleyRLZXl9IHx8ICRBcnRpY2xleyRLZXl9IGVxICcnICkgewogICAgICAgICAgICBkZWxldGUgJEFydGljbGV7JEtleX07CiAgICAgICAgfQogICAgICAgIGlmICggJEtleSA9fiAvXkVzY2FsYS8gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkQXJ0aWNsZXskS2V5fTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVBcnRpY2xlOwp9CgpzdWIgVGlja2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCVQYXJhbSk7CgogICAgaWYgKCAkU2VsZi0+eydBUEkzWCd9ICkgewogICAgICAgIG15ICVUaWNrZXRGbGFnID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGbGFnR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggJFRpY2tldEZsYWd7c2Vlbn0gfHwgJFRpY2tldEZsYWd7U2Vlbn0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7U2Vlbn0gPSAxOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRpY2tldCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBzZWVuCiAgICAgICAgbXkgJEFydGljbGVBbGxTZWVuID0gMTsKICAgICAgICBteSBASW5kZXggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVJbmRleCggVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0gKTsKICAgICAgICBmb3IgbXkgJEFydGljbGVJRCAoQEluZGV4KSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPnsnQVBJM1gnfSApIHsKICAgICAgICAgICAgICAgIG15ICVBcnRpY2xlRmxhZyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdHZXQoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGxhc3QgaWYgYXJ0aWNsZSB3YXMgbm90IHNob3duCiAgICAgICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUZsYWd7U2Vlbn0gJiYgISRBcnRpY2xlRmxhZ3tzZWVufSApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUFsbFNlZW4gPSAwOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgbWFyayB0aWNrZXQgYXMgc2VlbiBpZiBhbGwgYXJ0aWNsZSBhcmUgc2hvd24KICAgICAgICBpZiAoICRBcnRpY2xlQWxsU2VlbiAmJiAkU2VsZi0+eydBUEkzWCd9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZsYWdTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICdTZWVuJywKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgYWNjb3VudGVkIHRpbWUKICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCVQYXJhbSk7CiAgICBpZiAoIGRlZmluZWQgJEFjY291bnRlZFRpbWUgKSB7CiAgICAgICAgJFRpY2tldHtBY2NvdW50ZWRUaW1lfSA9ICRBY2NvdW50ZWRUaW1lOwogICAgfQoKICAgICMgc3RyaXAgb3V0IGFsbCBkYXRhCiAgICBteSBARGVsZXRlCiAgICAgICAgPSBxdyhSZXBseVRvIE1lc3NhZ2VJRCBJblJlcGx5VG8gUmVmZXJlbmNlcyBBZ2VUaW1lVW5peCBDcmVhdGVUaW1lVW5peCBQcmlvcml0eUlEIFN0YXRlSUQKICAgICAgICBRdWV1ZUlEIFNlbmRlclR5cGVJRCBPd25lcklEIFJlc3BvbnNpYmxlSUQgQXJ0aWNsZVR5cGVJRCBBcnRpY2xlRnJlZUtleTEKICAgICAgICBBcnRpY2xlRnJlZUtleTIgQXJ0aWNsZUZyZWVLZXkzIEFydGljbGVGcmVlVGV4dDEgQXJ0aWNsZUZyZWVUZXh0MiBBcnRpY2xlRnJlZVRleHQzCiAgICAgICAgSW5jb21pbmdUaW1lIFJlYWxUaWxsVGltZU5vdFVzZWQgTG9ja0lEIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgU3RhdGVUeXBlIEFyY2hpdmVGbGFnCiAgICAgICAgVW5sb2NrVGltZW91dCBDaGFuZ2VkCiAgICApOwoKICAgIGZvciBteSAkS2V5IChARGVsZXRlKSB7CiAgICAgICAgZGVsZXRlICRUaWNrZXR7JEtleX07CiAgICB9CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRUaWNrZXR7JEtleX0gfHwgJFRpY2tldHskS2V5fSBlcSAnJyApIHsKICAgICAgICAgICAgZGVsZXRlICRUaWNrZXR7JEtleX07CiAgICAgICAgfQogICAgICAgIGlmICggJEtleSA9fiAvXkVzY2FsYS8gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkVGlja2V0eyRLZXl9OwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAlVGlja2V0Owp9CgpzdWIgQXJ0aWNsZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KCVQYXJhbSk7CgogICAgaWYgKCAkU2VsZi0+eydBUEkzWCd9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgaXMgc2VlbgogICAgICAgIG15ICVBcnRpY2xlRmxhZyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUZsYWd7c2Vlbn0gfHwgJEFydGljbGVGbGFne1NlZW59ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTZWVufSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIG1hcmsgc2hvd24gYXJ0aWNsZSBhcyBzZWVuCiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ1NldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1NlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB0aWNrZXQgbmVlZCB0byBiZSBtYXJrZWQgYXMgc2VlbgogICAgbXkgJEFydGljbGVBbGxTZWVuID0gMTsKICAgIG15IEBJbmRleCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUluZGV4KCBUaWNrZXRJRCA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0gKTsKICAgIGZvciBteSAkQXJ0aWNsZUlEIChASW5kZXgpIHsKICAgICAgICBpZiAoICRTZWxmLT57J0FQSTNYJ30gKSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlRmxhZyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdHZXQoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbGFzdCBpZiBhcnRpY2xlIHdhcyBub3Qgc2hvd24KICAgICAgICAgICAgaWYgKCAhJEFydGljbGVGbGFne1NlZW59ICYmICEkQXJ0aWNsZUZsYWd7c2Vlbn0gKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUFsbFNlZW4gPSAwOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG1hcmsgdGlja2V0IGFzIHNlZW4gaWYgYWxsIGFydGljbGUgYXJlIHNob3duCiAgICBpZiAoICRBcnRpY2xlQWxsU2VlbiAmJiAkU2VsZi0+eydBUEkzWCd9ICkgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RmxhZ1NldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgICAgICA9PiAnU2VlbicsCiAgICAgICAgICAgIFZhbHVlICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgYWNjb3VudGVkIHRpbWUKICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCglUGFyYW0pOwogICAgaWYgKCBkZWZpbmVkICRBY2NvdW50ZWRUaW1lICkgewogICAgICAgICRBcnRpY2xle0FjY291bnRlZFRpbWV9ID0gJEFjY291bnRlZFRpbWU7CiAgICB9CgogICAgIyBzdHJpcCBvdXQgYWxsIGRhdGEKICAgIG15IEBEZWxldGUKICAgICAgICA9IHF3KFJlcGx5VG8gTWVzc2FnZUlEIEluUmVwbHlUbyBSZWZlcmVuY2VzIEFnZVRpbWVVbml4IENyZWF0ZVRpbWVVbml4IFByaW9yaXR5SUQgU3RhdGVJRAogICAgICAgIFF1ZXVlSUQgU2VuZGVyVHlwZUlEIE93bmVySUQgUmVzcG9uc2libGVJRCBBcnRpY2xlVHlwZUlEIEFydGljbGVGcmVlS2V5MQogICAgICAgIEFydGljbGVGcmVlS2V5MiBBcnRpY2xlRnJlZUtleTMgQXJ0aWNsZUZyZWVUZXh0MSBBcnRpY2xlRnJlZVRleHQyIEFydGljbGVGcmVlVGV4dDMKICAgICAgICBJbmNvbWluZ1RpbWUgUmVhbFRpbGxUaW1lTm90VXNlZCBMb2NrSUQgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBTdGF0ZVR5cGUgQXJjaGl2ZUZsYWcKICAgICAgICBVbmxvY2tUaW1lb3V0IENoYW5nZWQKICAgICk7CgogICAgZm9yIG15ICRLZXkgKEBEZWxldGUpIHsKICAgICAgICBkZWxldGUgJEFydGljbGV7JEtleX07CiAgICB9CgogICAgZm9yIG15ICRLZXkgKCBrZXlzICVBcnRpY2xlICkgewogICAgICAgIGlmICggIWRlZmluZWQgJEFydGljbGV7JEtleX0gfHwgJEFydGljbGV7JEtleX0gZXEgJycgKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkQXJ0aWNsZXskS2V5fTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkS2V5ID1+IC9eRXNjYWxhLyApIHsKICAgICAgICAgICAgZGVsZXRlICRBcnRpY2xleyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUFydGljbGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU2VydmljZSA9ICgpOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIGlmICggKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTTEEgPSAoKTsKCiAgICAjIGdldCBzbGEKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zID0gKCk7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eydUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbid9ICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPnsnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3MgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXROb3RlVHlwZXMgewoKICAgICMgcmVhZHkgZm9yIGlQaG9uZQogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGcmVlVGV4dCcpOwogICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CgogICAgbXkgJU5vdGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBSZXN1bHQgPT4gJ0hBU0gnICk7CiAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVOb3RlVHlwZXM7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJElkOiBpUGhvbmUucG0sdiAxLjggMjAxMC8wNi8yNSAxNjowNjowMyBjciBFeHAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSlNPTi5wbSAtIFdyYXBwZXIgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgSlNPTgojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSlNPTi5wbSx2IDEuMiAyMDEwLzA2LzIxIDE4OjE1OjM3IGNyIEV4cCAkCiMgJE9sZElkOiBKU09OLnBtLHYgMS40IDIwMTAvMDYvMTcgMjE6Mzk6NDAgY3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkpTT047Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgSlNPTjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SlNPTiAtIHRoZSBKU09OIHdyYXBwZXIgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgcGVybCBkYXRhIHN0cnVjdHVyZXMgdG8gSlNPTi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgSlNPTiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwoKICAgIG15ICRKU09OT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkpTT04tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57SlNPTk9iamVjdH0gPSBKU09OLT5uZXcoKTsKICAgICRTZWxmLT57SlNPTk9iamVjdH0tPmFsbG93X25vbnJlZigxKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEVuY29kZSgpCgpFbmNvZGUgYSBwZXJsIGRhdGEgc3RydWN0dXJlIHRvIGEgSlNPTiBzdHJpbmcuCgogICAgbXkgJEpTT05TdHJpbmcgPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gJERhdGEsCiAgICApOwoKPWN1dAoKc3ViIEVuY29kZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IEpTT04tZW5jb2RlZCBwcmVzZW50YXRpb24gb2YgcGVybCBzdHJ1Y3R1cmUKICAgIG15ICRKU09ORW5jb2RlZCA9ICRTZWxmLT57SlNPTk9iamVjdH0tPmVuY29kZSggJFBhcmFte0RhdGF9ICkgfHwgJyIiJzsKCiAgICByZXR1cm4gJEpTT05FbmNvZGVkOwp9CgojIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIHlldAojPWl0ZW0gRGVjb2RlKCkKIwojRGVjb2RlIGEgSlNPTiBzdHJpbmcgdG8gYSBwZXJsIGRhdGEgc3RydWN0dXJlLgojCiMgICAgbXkgJFBlcmxTdHJ1Y3R1clNjYWxhciA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiMgICAgICAgIERhdGEgPT4gJEpTT05TdHJpbmcsCiMgICAgKTsKIwojPWN1dAoKc3ViIERlY29kZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBkYXRhCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte0RhdGF9OwoKICAgICMgZGVjb2RlIEpTT04gZW5jb2RlZCB0byBwZXJsIHN0cnVjdHVyZQogICAgbXkgJFNjYWxhciA9ICRTZWxmLT57SlNPTk9iamVjdH0tPmRlY29kZSggJFBhcmFte0RhdGF9ICk7CgogICAgcmV0dXJuICRTY2FsYXI7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMC8wNi8yMSAxODoxNTozNyAkCgo9Y3V0Cg==