SystemMonitoring
2.1.2
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Added functionality for OTRS::ITSM.
Init release for OTRS 2.4.
Basic mail interface to System Monitoring Suites. Also provides deeper integration to Nagios (Acknowledge on lock and Checkscript).
Einfache Email Schnittstelle zu System Monitoring Suites. Weitergehende Integration mit Nagios (Acknowledge on lock and Checkscript).
2.4.x
For configuration instructions please refer to the information in doc/SystemMonitoring.txt.
Eine Anleitung zur Konfiguration des SystemMonitoring Moduls findet sich in der Datei doc/SystemMonitoring.txt.
# check if config option exists
my $Config = $Self->{ConfigObject}->Get( 'PostMaster::PreFilterModule' );
# update/rename config option
if ($Config && $Config->{'0001-SystemMonitoring'} ) {
$Self->{SysConfigObject} = Kernel::System::Config->new( %{$Self} );
$Self->{SysConfigObject}->ConfigItemUpdate(
Valid => 1,
Key => 'PostMaster::PreFilterModule###00-SystemMonitoring',
Value => $Config->{'0001-SystemMonitoring'},
);
}
2010-03-08 10:34:46
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBvdHJzLk5hZ2lvc0NoZWNrLnBsIC0gT1RSUyBOYWdpb3MgY2hlY2tlcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogb3Rycy5OYWdpb3NDaGVjay5wbCx2IDEuOCAyMDEwLzAyLzE1IDE4OjE2OjA2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFGRkVSTyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiMgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgb3Igc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKdXNlIEdldG9wdDo6U3RkOwpteSAlb3B0czsKZ2V0b3B0KCAnYycsIFwlb3B0cyApOwppZiAoICRvcHRze2h9ICkgewogICAgcHJpbnQKICAgICAgICAiVXNhZ2U6ICRGaW5kQmluOjpTY3JpcHQgWy1OIChydW5zIGFzIE5hZ2lvc2NoZWNrZXIpXSBbLXYgKHZlcmJvc2UpXSBbLWMgL3BhdGgvdG8vY29uZmlnX2ZpbGVdXG4iOwogICAgcHJpbnQgIlxuIjsKICAgIGV4aXQ7Cn0KCmlmICggISRvcHRze2N9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTmVlZCAtYyBDT05GSUdGSUxFXG4iOwogICAgZXhpdCAxOwp9CmVsc2lmICggIS1lICRvcHRze2N9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTm8gc3VjaCBmaWxlICRvcHRze2N9XG4iOwogICAgZXhpdCAxOwp9CgojIHJlYWQgY29uZmlnIGZpbGUKbXkgJUNvbmZpZzsKb3BlbiggbXkgJElOLCAnPCcsICRvcHRze2N9ICkgfHwgZGllICJFUlJPUjogQ2FuJ3Qgb3BlbiAkb3B0c3tjfTogJCFcbiI7Cm15ICRDb250ZW50ID0gJyc7CndoaWxlICg8JElOPikgewogICAgJENvbnRlbnQgLj0gJF87Cn0KaWYgKCAhZXZhbCAkQ29udGVudCApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IEludmFsaWQgY29uZmlnIGZpbGUgJG9wdHN7Y306ICRAXG4iOwogICAgZXhpdCAxOwp9Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwp1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OwoKIyBjcmVhdGUgY29tbW9uIG9iamVjdHMKbXkgJUNvbW1vbk9iamVjdCA9ICgpOwokQ29tbW9uT2JqZWN0e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TG9nT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICVDb21tb25PYmplY3QsCiAgICBMb2dQcmVmaXggPT4gJ290cnMuTmFnaW9zQ2hlY2snCik7CiRDb21tb25PYmplY3R7VGltZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIHNlYXJjaCB0aWNrZXRzCm15IEBUaWNrZXRJRHMgPSAkQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICV7ICRDb25maWd7U2VhcmNofSB9LAogICAgTGltaXQgID0+IDEwMF8wMDAsCiAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgIFVzZXJJRCA9PiAxLAopOwpteSAkVGlja2V0Q291bnQgPSBzY2FsYXIgQFRpY2tldElEczsKCiMgdmVyYm9zZSBtb2RlCmlmICggJG9wdHN7dn0gKSB7CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CiAgICAgICAgbXkgJVRpY2tldCA9ICRDb21tb25PYmplY3R7VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICBwcmludCBTVERFUlIgIiRUaWNrZXR7VGlja2V0SUR9OiRUaWNrZXR7VGlja2V0TnVtYmVyfVxuIjsKICAgIH0KfQoKIyBubyBjaGVja2VyIG1vZGUKaWYgKCAhJG9wdHN7Tn0gKSB7CiAgICBwcmludCAiJFRpY2tldENvdW50XG4iOwogICAgZXhpdCAwOwp9CgojIGNsZWFudXAgY29uZmlnIGZpbGUKbXkgJU1hcCA9ICgKICAgIG1heF9jcml0X3RyZXNoaG9sZCA9PiAnbWF4X2NyaXRfdHJlc2hvbGQnLAogICAgbWF4X3dhcm5fdHJlc2hob2xkID0+ICdtYXhfd2Fybl90cmVzaG9sZCcsCiAgICBtaW5fY3JpdF90cmVzaGhvbGQgPT4gJ21pbl9jcml0X3RyZXNob2xkJywKICAgIG1pbl93YXJuX3RyZXNoaG9sZCA9PiAnbWluX3dhcm5fdHJlc2hvbGQnLAopOwpmb3IgbXkgJFR5cGUgKCBrZXlzICVNYXAgKSB7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3skVHlwZX0gKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJOT1RJQ0U6IFR5cG8gaW4gY29uZmlnIG5hbWUsIHVzZSAkTWFweyRUeXBlfSBpbnN0ZWFkIG9mICRUeXBlXG4iOwogICAgICAgICRDb25maWd7ICRNYXB7JFR5cGV9IH0gPSAkQ29uZmlneyRUeXBlfTsKICAgICAgICBkZWxldGUgJENvbmZpZ3skVHlwZX07CiAgICB9Cn0KCiMgZG8gY3JpdGljYWwgYW5kIHdhcm5pbmcgY2hlY2sKZm9yIG15ICRUeXBlIChxdyhjcml0X3RyZXNob2xkIHdhcm5fdHJlc2hvbGQpKSB7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3sgJ21pbl8nIC4gJFR5cGUgfSApIHsKICAgICAgICBpZiAoICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gPj0gJFRpY2tldENvdW50ICkgewogICAgICAgICAgICBpZiAoICRUeXBlID1+IC9eY3JpdF8vICkgewogICAgICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgICAgICAgICAiJENvbmZpZ3tjaGVja25hbWV9IENSSVRJQ0FMICRDb25maWd7Q1JJVF9UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIjsKICAgICAgICAgICAgICAgIGV4aXQgMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRUeXBlID1+IC9ed2Fybl8vICkgewogICAgICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgICAgICAgICAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWF4XycgLiAkVHlwZSB9IDw9ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBDUklUSUNBTCAkQ29uZmlne0NSSVRfVFhUfSAkVGlja2V0Q291bnR8dGlja2V0cz0kVGlja2V0Q291bnQ7JENvbmZpZ3ttaW5fd2Fybl90cmVzaG9sZH06JENvbmZpZ3ttYXhfd2Fybl90cmVzaG9sZH07JENvbmZpZ3ttaW5fY3JpdF90cmVzaG9sZH06JENvbmZpZ3ttYXhfY3JpdF90cmVzaG9sZH1cbiI7CiAgICAgICAgICAgICAgICBleGl0IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSA9fiAvXndhcm5fLyApIHsKICAgICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICAgICAgICAgIiRDb25maWd7Y2hlY2tuYW1lfSBXQVJOSU5HICRDb25maWd7V0FSTl9UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIjsKICAgICAgICAgICAgICAgIGV4aXQgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKIyByZXR1cm4gb2sKcHJpbnQKICAgICIkQ29uZmlne2NoZWNrbmFtZX0gT0sgJENvbmZpZ3tPS19UWFR9ICRUaWNrZXRDb3VudHx0aWNrZXRzPSRUaWNrZXRDb3VudDskQ29uZmlne21pbl93YXJuX3RyZXNob2xkfTokQ29uZmlne21heF93YXJuX3RyZXNob2xkfTskQ29uZmlne21pbl9jcml0X3RyZXNob2xkfTokQ29uZmlne21heF9jcml0X3RyZXNob2xkfVxuIjsKZXhpdCAwOwo=
TkFNRQogICAgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZyAtIEJhc2ljIFN5c3RlbQogICAgTW9uaXRvcmluZyBJbnRlcmZhY2UKClNZTk9QU0lTCiAgICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgYmFzaWMgaW50ZXJmYWNlIHRvIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gSXQKICAgIHdvcmtzIGJ5IHJlY2VpdmluZyBlbWFpbCBtZXNzYWdlcyBzZW50IGJ5IHRoZSBNb25pdG9yaW5nIFN1aXRlLiBOZXcKICAgIHRpY2tldHMgYXJlIGNyZWF0ZWQgaW4gY2FzZSBvZiBjb21wb25lbnQgZmFpbHVyZXMuIE9uY2UgYSB0aWNrZXQgaGFzCiAgICBiZWVuIG9wZW5lZCBtZXNzYWdlcyByZWdhcmRpbmcgdGhlIGVmZmVjdGVkIGNvbXBvbmVudCBhcmUgYXR0YWNoZWQgdG8KICAgIHRoaXMgdGlja2V0LiBXaGVuIHRoZSBjb21wb25lbnQgcmVjb3ZlcnMsIHRoZSB0aWNrZXQgc3RhdGUgY2FuIGJlCiAgICBjaGFuZ2VkIG9yIHRoZSB0aWNrZXQgY2FuIGJlIGNsb3NlZC4KCiAgICBPbmNlIGEgb3BlbiB0aWNrZXQgZm9yIGEgZ2l2ZW4gSG9zdC9TZXJ2aWNlIGNvbWJpbmF0aW9uIGV4aXN0cywgYWxsCiAgICBtYWlscyBjb25jZXJuaW5nIHRoaXMgcGFydGljdWxhciBjb21iaW5hdGlvbiB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZQogICAgdGlja2V0IHVudGlsIGl0J3MgY2xvc2VkLgoKICAgIElmIHRoZSBPVFJTOjpJVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBtb2R1bGUgaXMgaW5zdGFsbGVkIGFuZAogICAgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uICJTeXN0ZW1Nb25pdG9yaW5nOjpTZXRJbmNpZGVudFN0YXRlIiBpcyBzZXQKICAgIHRvICJZZXMiLCBhIENJIHdpdGggdGhlIGdpdmVuIGhvc3QgbmFtZSBpcyBzZWFyY2hlZCBpbiB0aGUgQ0kgZGF0YWJhc2UuCiAgICBJZiBleGFjdGx5IG9uZSBDSSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQsIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIGlzIHNldAogICAgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIGluY29taW5nIG1haWwgKEluY2lkZW50IC8gT3BlcmF0aW9uYWwpLgoKICAgIElmIHRoZSBPVFJTOjpJVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBtb2R1bGUgaXMgaW5zdGFsbGVkIGFuZAogICAgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uICJTeXN0ZW1Nb25pdG9yaW5nOjpMaW5rVGlja2V0V2l0aENJIiBpcyBzZXQKICAgIHRvICJZZXMiLCBhIENJIGlzIGxpbmtlZCBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHN5c3RlbSBtb25pdG9yaW5nCiAgICBpbmNpZGVudCB0aWNrZXQuIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiBhIHN1YnNlcXVlbnQgc3lzdGVtIG1vbml0b3JpbmcKICAgIGVtYWlsIGFycml2ZXMhCgpDT05GSUdVUkFUSU9OIE9QVElPTlMKICAgIFRvIGFsbG93IGZsZXhpYmxlIGludGVncmF0aW9uIGJldHdlZW4gT1RSUyBhbmQgYSBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZQogICAgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWVzCiAgICAoYXMgc2hvd24gYmVsb3cpIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYSBzdGFuZGFyZCBOYWdpb3MgaW5zdGFsbGF0aW9uLgoKICAgICogIkZyb21BZGRyZXNzUmVnRXhwIgogICAgICAgIE9ubHkgbWFpbHMgbWF0Y2hpbmcgdGhpcyAiRnJvbToiIGFkZHJlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGlzCiAgICAgICAgZmlsdGVyLiBZb3UgbmVlZCB0byBhZGp1c3QgdGhpcyBzZXR0aW5nIHRvIHRoZSBmcm9tIGFkZHJlc3MgeW91cgogICAgICAgIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlIHVzZXMgZm9yIG91dGdvaW5nIG1haWxzLgoKICAgICAgICBEZWZhdWx0OiAnc3lzbW9uQG15c3lzdGVtLmNvbScKCiAgICAqICJTdGF0ZVJlZ0V4cCIKICAgICAgICBSZWd1bGFyIEV4cHJlc3Npb24gdG8gZXh0cmFjdCAiU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdccypTdGF0ZTpccysoXFMrKScKCiAgICAqICJOZXdUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIG5ldyB0aWNrZXQKCiAgICAgICAgRGVmYXVsdDogJ0NSSVRJQ0FMfERPV04nCgogICAgKiAiQ2xvc2VUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIHRpY2tldAogICAgICAgIHRyYW5zaXRpb24gdG8gIkNsb3NlQWN0aW9uU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdPS3xVUCcKCiAgICAqICJDbG9zZUFjdGlvblN0YXRlIgogICAgICAgIE5ldyBzdGF0dXMgZm9yIHRpY2tldCB3aGVuIHNlcnZpY2UgcmVjb3ZlcnMuIFRoaXMgY2FuIGJlIGVpdGhlcgogICAgICAgICJPTEQiIGluIHdoaWNoIGNhc2UgdGhlIG9sZCBzdGF0dXMgc3RheXMsIG9yIHRoZSBuYW1lIG9mIHRoZSBuZXcKICAgICAgICBzdGF0dXMuIFBsZWFzZSBub3RlLCB0aGF0IHRoaXMgc3RhdGUgbmVlZHMgdG8gYmUgY29uZmlndXJlZCBpbiB5b3VyCiAgICAgICAgT1RSUyBpbnN0YWxsYXRpb24gYXMgdmFsaWQgc3RhdGUuIElmIHRoZSBzdGF0ZSB5b3Ugc2V0IGhlcmUgZG9lcyBub3QKICAgICAgICBleGlzdCwgdGhlIHRpY2tldCBzdGF0ZSB3aWxsIG5vdCBiZSBhbHRlcmVkLgoKICAgICAgICBEZWZhdWx0OiAnY2xvc2VkIHN1Y2Nlc3NmdWwnCgogICAgKiAiQ2xvc2VQZW5kaW5nVGltZSIKICAgICAgICBQZW5kaW5nIHRpbWUgaW4gc2Vjb25kcyBmb3IgJ1BlbmRpbmcuLi4nIHN0YXR1cyB0aW1lLiAoSWdub3JlZCBmb3IKICAgICAgICBvdGhlciBzdGF0dXMgdHlwZXMpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQKICAgICAgICBieSBPVFJTIHZlcnNpb25zIG9sZGVyIHRoYW4gMi4yLiBPbiB0aGVzZSBzeXN0ZW1zIHRoZSBwZW5kaW5nIHRpbWUKICAgICAgICBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGlja2V0IHdpbGwgYmUgdXNlZCwgd2hpY2ggbWF5IGhhdmUgaW4KICAgICAgICBzdXJwcmlzaW5nIGVmZmVjdHMuIEl0J3MgcmVjb21tZW5kZWQgbm90IHRvIHVzZSAnUGVuZGluZy4uLicgc3RhdGVzCiAgICAgICAgd2l0aCBPVFJTIHByaW9yIHRvIDIuMi4KCiAgICAgICAgRGVmYXVsdDogIjYwKjYwKjI0KjIiICgyIGRheXMpCgogICAgKiAiSG9zdFJlZ0V4cCIKICAgICAgICBSZWd1bGFyIGV4cHJlc3Npb24gdG8gZXh0cmFjdCAiSG9zdCIKCiAgICAgICAgRGVmYXVsdDogJ1xzKkFkZHJlc3M6XHMrKFxkK1wuXGQrXC5cZCtcLlxkKylccyonCgogICAgKiAiRnJlZVRleHRIb3N0IgogICAgICAgIEZyZWUgdGV4dCBmaWVsZCBpbmRleCB0byBzdG9yZSAiSG9zdCIKCiAgICAgICAgRGVmYXVsdDogJzEnCgogICAgKiAiU2VydmljZVJlZ0V4cCIKICAgICAgICBSZWd1bGFyIGV4cHJlc3Npb24gdG8gZXh0cmFjdCAiU2VydmljZSIKCiAgICAgICAgRGVmYXVsdDogJ1xzKlNlcnZpY2U6XHMrKC4qKVxzKicKCiAgICAqICJEZWZhdWx0U2VydmljZSIKICAgICAgICBEZWZhdWx0IGZvciAiU2VydmljZSI7IHVzZWQgaWYgbm8gc2VydmljZSBjYW4gYmUgZXh0cmFjdGVkLCBpLmUuIGlmCiAgICAgICAgaG9zdCBnb2VzIERPV04vVVAKCiAgICAgICAgRGVmYXVsdDogJ0hvc3QnCgogICAgKiAiRnJlZVRleHlTZXJ2aWNlIgogICAgICAgIEZyZWUgdGV4dCBmaWVsZCBpbmRleCB0byBzdG9yZSBzZXJ2aWNlCgogICAgICAgIERlZmF1bHQ6ICcyJwoKICAgICogIlNlbmRlclR5cGUiCiAgICAgICAgU2VuZGVyIHR5cGUgdXNlZCBmb3IgY3JlYXRpbmcgdGlja2V0cyBhbmQgYXR0YWNoaW5nIG5vdGVzCgogICAgICAgIERlZmF1bHQ6ICJzeXN0ZW0iCgogICAgKiAiQXJ0aWNsZVR5cGUiCiAgICAgICAgQXJ0aWNsZSB0eXBlIHVzZWQgdG8gYXR0YWNoIGZvbGxvdyB1cCBlbWFpbHMgdG8gZXhpc3RpbmcgdGlja2V0cwoKICAgICAgICBEZWZhdWx0OiAibm90ZS1yZXBvcnQiCgpDT05UUk9MIEZMT1cKICAgIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBpbGx1c3RyYXRlcyBob3cgbWFpbHMgYXJlIGhhbmRsZWQgYnkgdGhpcyBtb2R1bGUKICAgIGFuZCBpbiB3aGljaCBjYXNlcyB0aGV5IHRyaWdnZXIgd2hpY2ggYWN0aW9uLiBQcmV0dHkgbXVjaCBhbGwgY2hlY2tzIGFyZQogICAgY29uZmlndXJhYmxlIHVzaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGdpdmVuIGJ5IHRoZSBwYXJhbWV0ZXJzIGxpc3RlZAogICAgYWJvdmUuCgogICAgIE1haWwgbWF0Y2hlcyAnRnJvbUFkZHJlc3MnPwogICAgIHwKICAgICArLT4gTk8gIC0+IENvbnRpbnVlIHdpdGggcmVndWxhciBtYWlsIHByb2Nlc3NpbmcKICAgICB8CiAgICAgKy0+IFlFUyAtPiBEb2VzIGEgdGlja2V0IHdpdGggbWF0Y2hpbmcgSG9zdC9TZXJ2aWNlIGNvbWJpbmF0aW9uCiAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0IGluIE9UUlM/CiAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICArLT4gTk8gIC0+IERvZXMgJ1N0YXRlOicgbWF0Y2ggJ05ld1RpY2tldFJlZ0V4cCc/CiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKICAgICAgICAgICAgICAgIHwgICAgICAgICAgKy0+IE5PICAtPiBTdG9wIHByb2Nlc3NpbmcgdGhpcyBtYWlsCiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgKHNpbGVudCBkcm9wKQogICAgICAgICAgICAgICAgfCAgICAgICAgICB8CiAgICAgICAgICAgICAgICB8ICAgICAgICAgICstPiBZRVMgLT4gQ3JlYXRlIG5ldyB0aWNrZXQsIHJlY29yZCBIb3N0CiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgYW5kIFNlcnZpY2UsIGF0dGFjaCBtYWlsCiAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICArLT4gWUVTIC0+IEF0dGFjaCBtYWlsIHRvIHRpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAtPiBEb2VzICdTdGF0ZTonIG1hdGNoICdDbG9zZVRpY2tldFJlZ0V4cCc/CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0+IE5PICAtPiBDb250aW51ZSB3aXRoIHJlZ3VsYXIgbWFpbCBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0+IFlFUyAtPiBDaGFuZ2UgdGlja2V0IHR5cGUgYXMgY29uZmlndXJlZCBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbG9zZUFjdGlvblN0YXRlJwoKICAgIEJlc2lkZXMgb2YgYSBmZXcgYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzIHRoaXMgaXMgaG93IHRoZQogICAgU3lzdGVtTW9uaXRvcmluZyBtb2R1bGUgdHJlYXRzIGluY29taW5nIG1haWxzLiBCeSBjaGFuZ2luZyB0aGUgcmVndWxhcgogICAgZXhwcmVzc2lvbnMgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGFkb3B0IGl0IHRvIGRpZmZlcmVudCBtb25pdG9yaW5nCiAgICBzeXN0ZW1zLgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN5c3RlbU1vbml0b3JpbmcueG1sLHYgMS4xNiAyMDEwLzAyLzIwIDAwOjU3OjI3IHViIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMxLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBBRlRFUiBQb3N0TWFzdGVyRmlsdGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5mYWNoZSBFbWFpbCBTY2huaXR0c3RlbGxlIHp1IFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gRGllc2VuIEJsb2NrIG51dHplbiwgd2VubiBkaWVzZXIgRmlsdGVyIE5BQ0ggZGVuIFBvc3RNYXN0ZXJGaWx0ZXJuIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlBvc3RNYXN0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tQWRkcmVzc1JlZ0V4cCI+bmFnaW9zQGV4YW1wbGUuY29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVJlZ0V4cCI+XHMqU3RhdGU6XHMrKFxTKyk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikhvc3RSZWdFeHAiPlxzKkhvc3Q6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZVJlZ0V4cCI+XHMqU2VydmljZTpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOZXdUaWNrZXRSZWdFeHAiPkNSSVRJQ0FMfERPV048L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlVGlja2V0UmVnRXhwIj5PS3xVUDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VBY3Rpb25TdGF0ZSI+Y2xvc2VkIHN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlUGVuZGluZ1RpbWUiPjE3MjgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFNlcnZpY2UiPkhvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0SG9zdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTZXJ2aWNlIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZW5kZXJUeXBlIj5zeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVUeXBlIj5ub3RlLXJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlBvc3RNYXN0ZXI6OlByZUZpbHRlck1vZHVsZSMjIzAwLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBCRUZPUkUgUG9zdE1hc3RlckZpbHRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RWluZmFjaGUgRW1haWwgU2Nobml0dHN0ZWxsZSB6dSBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIERpZXNlbiBCbG9jayBudXR6ZW4sIHdlbm4gZGllc2VyIEZpbHRlciBWT1IgZGVuIFBvc3RNYXN0ZXJGaWx0ZXJuIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlBvc3RNYXN0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tQWRkcmVzc1JlZ0V4cCI+bmFnaW9zQGV4YW1wbGUuY29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVJlZ0V4cCI+XHMqU3RhdGU6XHMrKFxTKyk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikhvc3RSZWdFeHAiPlxzKkhvc3Q6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZVJlZ0V4cCI+XHMqU2VydmljZTpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOZXdUaWNrZXRSZWdFeHAiPkNSSVRJQ0FMfERPV048L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlVGlja2V0UmVnRXhwIj5PS3xVUDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VBY3Rpb25TdGF0ZSI+Y2xvc2VkIHN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlUGVuZGluZ1RpbWUiPjE3MjgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFNlcnZpY2UiPkhvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0SG9zdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTZXJ2aWNlIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZW5kZXJUeXBlIj5zeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVUeXBlIj5ub3RlLXJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN5c3RlbU1vbml0b3Jpbmc6OlNldEluY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXQgdGhlIGluY2lkZW50IHN0YXRlIG9mIGEgQ0kgYXV0b21hdGljYWxseSB3aGVuIGEgc3lzdGVtIG1vbml0b3JpbmcgZW1haWwgYXJyaXZlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXV0b21hdGlzY2hlcyBzZXR6ZW4gZGVzIEluY2lkZW50IFN0YXRlIGVpbmVzIENJLCB3ZW5uIGVpbmUgU3lzdGVtIE1vbml0b3JpbmcgRW1haWwgZWludHJpZmZ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpDb25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3lzdGVtTW9uaXRvcmluZzo6TGlua1RpY2tldFdpdGhDSSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkxpbmsgYW4gYWxyZWFkeSBvcGVuZW5kIGluY2lkZW50IHRpY2tldCB3aXRoIHRoZSBhZmZlY3RlZCBDSS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gYSBzdWJzZXF1ZW50IHN5c3RlbSBtb25pdG9yaW5nIGVtYWlsIGFycml2ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlZlcmtu/HBmZW4gZWluZXMgYmVyZWl0cyBnZfZmZm5ldGVuIEluY2lkZW50IFRpY2tldHMgbWl0IGRlbSBiZXRyb2ZmZW5lbiBDSS4gRGllcyBpc3QgbnVyIG32Z2xpY2ggd2VubiBlaW5lIHdlaXRlcmUgU3lzdGVtIE1vbml0b3JpbmcgRW1haWwgZWludHJpZmZ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpDb25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZSBvZiBUaWNrZXRGcmVlRmllbGQgZm9yIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWUgZGVzIFRpY2tldCBGcmVpIEZlbGRlczogSG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+VGlja2V0RnJlZVRleHQxPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpTZXJ2aWNlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZSBvZiBUaWNrZXRGcmVlRmllbGQgZm9yIFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWUgZGVzIFRpY2tldCBGcmVpIEZlbGRlczogU2VydmljZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+VGlja2V0RnJlZVRleHQyPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSBOYWdpb3MgYWNrbm93bGVkZ2UgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBpcGUiPnBpcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imh0dHAiPmh0dHA8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6Q01EIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZWQgcGlwZSBhY2tub3dsZWRnZSBjb21tYW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYW1lZCBwaXBlIEFja25vd2xlZGdlIEJlZmVobC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+ZWNobyAnJmx0O09VVFBVVFNUUklORyZndDsnID4gL3Vzci9sb2NhbC9uYWdpb3MvdmFyL3J3L25hZ2lvcy5jbWQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6Okhvc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3IgaG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9IT1NUX1BST0JMRU07Jmx0O0hPU1RfTkFNRSZndDs7MTsxOzE7Jmx0O0xPR0lOJmd0OzsmbHQ7YSBocmVmPSImbHQ7Q09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtDT05GSUdfRlFETiZndDsvJmx0O0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tJmFtcDtUaWNrZXRJRD0mbHQ7VGlja2V0SUQmZ3Q7IiZndDsmbHQ7Q09ORklHX1RpY2tldDo6SG9vayZndDsmbHQ7VGlja2V0TnVtYmVyJmd0OyZsdDsvYSZndDs8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OlNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3Igc2VydmljZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9TVkNfUFJPQkxFTTsmbHQ7SE9TVF9OQU1FJmd0OzsmbHQ7U0VSVklDRV9OQU1FJmd0OzsxOzE7MTsmbHQ7TE9HSU4mZ3Q7OyZsdDthIGhyZWY9IiZsdDtDT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O0NPTkZJR19GUUROJmd0Oy8mbHQ7Q09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb20mYW1wO1RpY2tldElEPSZsdDtUaWNrZXRJRCZndDsiJmd0OyZsdDtDT05GSUdfVGlja2V0OjpIb29rJmd0OyZsdDtUaWNrZXROdW1iZXImZ3Q7Jmx0Oy9hJmd0OzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOS1OYWdpb3NBY2tub3dsZWRnZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhbiBhY2tub3dsYWdlIHRvIE5hZ2lvcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VGlja2V0IEV2ZW50IE1vZHVsIGb8ciBhdXRvbWF0aXNjaGVzIHNlbmRlbiBlaW5lcyBBY2tub3dsZWRnZSBhbiBOYWdpb3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRMb2NrVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXJsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBVUkwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9uYWdpb3MuZXhhbXBsZS5jb20vbmFnaW9zL2NnaS1iaW4vY21kLmNnaT9jbWRfdHlwPSZsdDtDTURfVFlQJmd0OyZhbXA7Y21kX21vZD0yJmFtcDtob3N0PSZsdDtIT1NUX05BTUUmZ3Q7JmFtcDtzZXJ2aWNlPSZsdDtTRVJWSUNFX05BTUUmZ3Q7JmFtcDtzdGlja3lfYWNrPW9uJmFtcDtzZW5kX25vdGlmaWNhdGlvbj1vbiZhbXA7cGVyc2lzdGVudD1vbiZhbXA7Y29tX2RhdGE9Jmx0O1RpY2tldE51bWJlciZndDsmYW1wO2J0blN1Ym1pdD1Db21taXQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIGh0dHAgQWNrbm93bGVkZ2UgQmVudXR6ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkpvaG48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBodHRwIGFja25vd2xlZGdlIHBhc3N3b3JkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBQYXNzd29ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+c29tZV9wYXNzPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9Db25maWcvTmFnaW9zQ2hlY2sucG0uZXhhbXBsZSAtIEV4YW1wbGUgQ29uZmlnZmlsZSBmb3Igb3Rycy5OYWdpb3NDaGVjayAtIE9UUlMgTmFnaW9zIGNoZWNrZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5hZ2lvc0NoZWNrLnBtLmV4YW1wbGUsdiAxLjMgMjAxMC8wMi8xNSAxODoxNjowNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KIyBGb3IgcG9zc2libGUgc2VhcmNoIG9wdGlvbnMgc2VlOgojIGh0dHA6Ly9kZXYub3Rycy5vcmcvY3ZzL0tlcm5lbC9TeXN0ZW0vVGlja2V0Lmh0bWwgLT4gVGlja2V0U2VhcmNoKCkKIyBFeGFtcGxlcyBzZWUgYmVsb3cKIyAtLQoKJUNvbmZpZyA9ICgKICAgU2VhcmNoID0+IHsKCiAgICAgICAjIHRpY2tldHMgY3JlYXRlZCBpbiB0aGUgbGFzdCAxMjAgbWludXRlcwogICAgICAgVGlja2V0Q3JlYXRlVGltZU5ld2VyTWludXRlcyA9PiAxMjAsCgogICAgICAgIyB0aWNrZXQgbnVtYmVyIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgojICAgICAgICBUaWNrZXROdW1iZXIgPT4gJyUxMjM1NDYlJywKIyAgICAgICAgVGlja2V0TnVtYmVyID0+IFsnJTEyMzU0NiUnLCAnJTEyMzY2NiUnXSwKCiAgICAgICAjIHRpY2tldCBxdWV1ZXMKIyAgICAgICAgUXVldWVzICAgPT4gWydzeXN0ZW0gcXVldWUnLCAnb3RoZXIgcXVldWUnXSwKCiAgICAgICAjIHRpY2tldCB0eXBlcwojICAgICAgICBUeXBlcyAgID0+IFsnbm9ybWFsJywgJ2NoYW5nZScsICdpbmNpZGVudCddLAoKICAgICAgICMgdGlja2V0IHByaW9yaXRpZXMKIyAgICAgICAgUHJpb3JpdGllcyAgPT4gWycxIHZlcnkgbG93JywgJzIgbG93JywgJzMgbm9ybWFsJ10sCgogICAgICAgIyB0aWNrZXQgc2VydmljZXMKIyAgICAgICAgU2VydmljZXMgICA9PiBbJ1NlcnZpY2UgQScsICdTZXJ2aWNlIEInXSwKCiAgICAgICAjIHRpY2tldCBsb2NrcwojICAgICAgICBMb2NrcyAgID0+IFsndW5sb2NrJ10sCgogICAgICAgIyB0aWNrZXQgY3VzdG9tZXJzCiMgICAgICAgIEN1c3RvbWVySUQgPT4gJzEyMycsCiMgICAgICAgIEN1c3RvbWVySUQgPT4gWycxMjMnLCAnQUJDJ10sCgogICAgICAgIyAxLi4xNiBmcmVlIHRleHQgZmllbGRzCiMgICAgICAgIFRpY2tldEZyZWVLZXkxICA9PiAnUHJvZHVjdCcsCiMgICAgICAgIFRpY2tldEZyZWVUZXh0MSA9PiAnYWRhc2QnLAoKICAgICAgICMgb3Igd2l0aCBtdWx0aSBvcHRpb25zIGFzIGFycmF5IHJlZiBvciBzdHJpbmcgcG9zc2libGUKIyAgICAgICAgVGlja2V0RnJlZUtleTIgID0+IFsnUHJvZHVjdCcsICdQcm9kdWN0MiddLAojICAgICAgICBUaWNrZXRGcmVlVGV4dDIgPT4gWydCcm93c2VyJywgJ1NvdW5kJywgJ01vdXNlJ10sCiAgIH0sCgojIERlY2xhcmF0aW9uIG9mIHRyZXNob2xkcwojIG1pbl93YXJuX3RyZXNob2xkID4gTnVtYmVyIG9mIHRpY2tldHMgLT4gV0FSTklORwojIG1heF93YXJuX3RyZXNob2xkIDwgTnVtYmVyIG9mIHRpY2tldHMgLT4gV0FSTklORwojIG1pbl9jcml0X3RyZXNob2xkID4gTnVtYmVyIG9mIHRpY2tldHMgLT4gQUxBUk0KIyBtYXhfd2Fybl90cmVzaG9sZCA8IE51bWJlciBvZiB0aWNrZXRzIC0+IEFMQVJNCgogICBtaW5fd2Fybl90cmVzaG9sZCA9PiA1LAogICBtYXhfd2Fybl90cmVzaG9sZCA9PiAxMCwKICAgbWluX2NyaXRfdHJlc2hvbGQgPT4gMiwKICAgbWF4X2NyaXRfdHJlc2hvbGQgPT4gMjAsCgojIEluZm9ybWF0aW9uIHVzZWQgYnkgTmFnaW9zCiMgTmFtZSBvZiBjaGVjayBzaG93biBpbiBOYWdpb3MgU3RhdHVzIEluZm9ybWF0aW9uCiAgIGNoZWNrbmFtZSA9PiAnT1RSUyBDaGVja2VyJywKCiMgVGV4dCBzaG93biBpbiBTdGF0dXMgSW5mb3JtYXRpb24gaWYgZXZlcnl0aGluZyBpcyBvawogICBPS19UWFQgICAgPT4gJ2Vuam95ICAgdGlja2V0czonLAoKIyBUZXh0IHNob3duIGluIFN0YXR1cyBJbmZvcm1hdGlvbiBpZiB3YXJuaW5nIHRocmVzaGhvbGQgcmVhY2hlZAogICBXQVJOX1RYVCAgPT4gJ251bWJlciBvZiB0aWNrZXRzOicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGNyaXRpY2FsIHRocmVzaGhvbGQgcmVhY2hlZAogICBDUklUX1RYVCAgPT4gJ2NyaXRpY2FsIG51bWJlciBvZiB0aWNrZXRzOicsCgopOwoK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUG9zdE1hc3Rlci9GaWx0ZXIvU3lzdGVtTW9uaXRvcmluZy5wbSAtIEJhc2ljIFN5c3RlbSBNb25pdG9yaW5nIEludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU3lzdGVtTW9uaXRvcmluZy5wbSx2IDEuMTAgMjAxMC8wMi8yMCAwMDo1ODowNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGNoZWNrIGlmIENJIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzZXQgYXV0b21hdGljYWxseQogICAgIyB0aGlzIHJlcXVpcmVzIHRoZSBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQgbW9kdWxlIHRvIGJlIGluc3RhbGxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzdGVtTW9uaXRvcmluZzo6U2V0SW5jaWRlbnRTdGF0ZScpICkgewoKICAgICAgICAjIHJlcXVpcmUgdGhlIGdlbmVyYWwgY2F0YWxvZyBtb2R1bGUKICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgICAgIH0KCiAgICAgICAgIyByZXF1aXJlIHRoZSBjb25maWcgaXRlbSBtb2R1bGUKICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gb2JqZWN0CiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBEZWZhdWx0IFNldHRpbmdzCiAgICAkU2VsZi0+e0NvbmZpZ30gPSB7CiAgICAgICAgU3RhdGVSZWdFeHAgICAgICAgPT4gJ1xzKlN0YXRlOlxzKyhcUyspJywKICAgICAgICBGcm9tQWRkcmVzc1JlZ0V4cCA9PiAnc3lzbW9uQGV4YW1wbGUuY29tJywKICAgICAgICBOZXdUaWNrZXRSZWdFeHAgICA9PiAnQ1JJVElDQUx8RE9XTicsCiAgICAgICAgQ2xvc2VUaWNrZXRSZWdFeHAgPT4gJ09LfFVQJywKICAgICAgICBDbG9zZUFjdGlvblN0YXRlICA9PiAnY2xvc2VkIHN1Y2Nlc3NmdWwnLAogICAgICAgIENsb3NlUGVuZGluZ1RpbWUgID0+IDYwICogNjAgKiAyNCAqIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAjIDIgZGF5cwogICAgICAgIEhvc3RSZWdFeHAgICAgICAgID0+ICdccypBZGRyZXNzOlxzKyhcZCtcLlxkK1wuXGQrXC5cZCspXHMqJywKICAgICAgICBGcmVlVGV4dEhvc3QgICAgICA9PiAnMScsCiAgICAgICAgRnJlZVRleHRTZXJ2aWNlICAgPT4gJzInLAogICAgICAgIEZyZWVUZXh0U3RhdGUgICAgID0+ICcxJywKICAgICAgICBTZXJ2aWNlUmVnRXhwICAgICA9PiAnXHMqU2VydmljZTpccysoLiopXHMqJywKICAgICAgICBEZWZhdWx0U2VydmljZSAgICA9PiAnSG9zdCcsCiAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgPT4gJ3N5c3RlbScsCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgPT4gJ25vdGUtcmVwb3J0JywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgbG9nIG1lc3NhZ2UKICAgIG15ICRMb2dNZXNzYWdlOwoKICAgICMgZ2V0IGNvbmZpZyBvcHRpb25zLCB1c2UgZGVmYXVsdHMgdW5sZXNzIHZhbHVlIHNwZWNpZmllZAogICAgaWYgKCAkUGFyYW17Sm9iQ29uZmlnfSAmJiByZWYgJFBhcmFte0pvYkNvbmZpZ30gZXEgJ0hBU0gnICkgewogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMoICV7ICRQYXJhbXtKb2JDb25maWd9IH0gKSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRTZWxmLT57Q29uZmlnfS0+eyRLZXl9OwogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPnskS2V5fSA9ICRQYXJhbXtKb2JDb25maWd9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgc2VuZGVyIGlzIG9mIGludGVyZXN0CiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0dldFBhcmFtfS0+e0Zyb219OwogICAgcmV0dXJuIDEgaWYgJFBhcmFte0dldFBhcmFtfS0+e0Zyb219ICF+IC8kU2VsZi0+e0NvbmZpZ30tPntGcm9tQWRkcmVzc1JlZ0V4cH0vaTsKCiAgICAjIFRyeSB0byBnZXQgU3RhdGUsIEhvc3QgYW5kIFNlcnZpY2UgZnJvbSBlbWFpbCBzdWJqZWN0CiAgICBteSBAU3ViamVjdExpbmVzID0gc3BsaXQgL1xuLywgJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9OwogICAgZm9yIG15ICRMaW5lIChAU3ViamVjdExpbmVzKSB7CiAgICAgICAgZm9yIChxdyhTdGF0ZSBIb3N0IFNlcnZpY2UpKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gLyRTZWxmLT57Q29uZmlnfS0+eyAkXyAuICdSZWdFeHAnIH0vICkgewogICAgICAgICAgICAgICAgJFNlbGYtPnskX30gPSAkMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFRyeSB0byBnZXQgU3RhdGUsIEhvc3QgYW5kIFNlcnZpY2UgZnJvbSBlbWFpbCBib2R5CiAgICBteSBAQm9keUxpbmVzID0gc3BsaXQgL1xuLywgJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9OwogICAgZm9yIG15ICRMaW5lIChAQm9keUxpbmVzKSB7CiAgICAgICAgZm9yIChxdyhTdGF0ZSBIb3N0IFNlcnZpY2UpKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gLyRTZWxmLT57Q29uZmlnfS0+eyAkXyAuICdSZWdFeHAnIH0vICkgewogICAgICAgICAgICAgICAgJFNlbGYtPnskX30gPSAkMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHdlIG5lZWQgU3RhdGUgYW5kIEhvc3QgdG8gcHJvY2VlZAogICAgaWYgKCAhJFNlbGYtPntTdGF0ZX0gfHwgISRTZWxmLT57SG9zdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1N5c3RlbU1vbml0b3JpbmcgTWFpbDogJwogICAgICAgICAgICAgICAgLiAnU3lzdGVtTW9uaXRvcmluZzogQ291bGQgbm90IGZpbmQgaG9zdCBhZGRyZXNzICcKICAgICAgICAgICAgICAgIC4gJ2FuZC9vciBzdGF0ZSBpbiBtYWlsID0+IElnbm9yaW5nJywKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgQ2hlY2sgZm9yIFNlcnZpY2UKICAgICRTZWxmLT57U2VydmljZX0gfHw9ICRTZWxmLT57Q29uZmlnfS0+e0RlZmF1bHRTZXJ2aWNlfTsKCiAgICAjIGRlZmluZSBsb2cgbWVzc2FnZQogICAgJExvZ01lc3NhZ2UgPSAiIC0gIgogICAgICAgIC4gIkhvc3Q6ICRTZWxmLT57SG9zdH0sICIKICAgICAgICAuICJTdGF0ZTogJFNlbGYtPntTdGF0ZX0sICIKICAgICAgICAuICJTZXJ2aWNlOiAkU2VsZi0+e1NlcnZpY2V9IjsKCiAgICAjIElzIHRoZXJlIGEgdGlja2V0IGZvciB0aGlzIEhvc3QvU2VydmljZSBwYWlyPwogICAgbXkgJVF1ZXJ5ID0gKAogICAgICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgIFN0YXRlVHlwZSA9PiAnT3BlbicsCiAgICApOwogICAgZm9yIG15ICRUeXBlIChxdyhIb3N0IFNlcnZpY2UpKSB7CiAgICAgICAgJFF1ZXJ5eyAnVGlja2V0RnJlZUtleScgLiAkU2VsZi0+e0NvbmZpZ30tPnsgJ0ZyZWVUZXh0JyAuICRUeXBlIH0gfSA9ICRUeXBlOwogICAgICAgICRRdWVyeXsgJ1RpY2tldEZyZWVUZXh0JyAuICRTZWxmLT57Q29uZmlnfS0+eyAnRnJlZVRleHQnIC4gJFR5cGUgfSB9CiAgICAgICAgICAgID0gJFNlbGYtPnskVHlwZX07CiAgICB9CgogICAgIyBzZWFyY2ggdGlja2V0cwogICAgbXkgQFRpY2tldElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKCVRdWVyeSk7CgogICAgIyBnZXQgdGhlIGZpcnN0IGFuZCBvbmx5IHRpY2tldCBpZAogICAgbXkgJFRpY2tldElEID0gc2hpZnQgQFRpY2tldElEczsKCiAgICAjIE9LLCBmb3VuZCB0aWNrZXQgdG8gZGVhbCB3aXRoCiAgICBpZiAoJFRpY2tldElEKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBudW1iZXIKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHN1YmplY3QKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc2VuZGVyIHR5cGUgYW5kIGFydGljbGUgdHlwZQogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUZvbGxvd1VwLVNlbmRlclR5cGUnfSAgPSAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1BcnRpY2xlVHlwZSd9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9OwoKICAgICAgICAjIFNldCBBcnRpY2xlIEZyZWUgRmllbGQgZm9yIFN0YXRlCiAgICAgICAgbXkgJEFydGljbGVGcmVlVGV4dE51bWJlciA9ICRTZWxmLT57Q29uZmlnfS0+eydGcmVlVGV4dFN0YXRlJ307CiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eyAnWC1PVFJTLUZvbGxvd1VwLUFydGljbGVLZXknIC4gJEFydGljbGVGcmVlVGV4dE51bWJlciB9CiAgICAgICAgICAgID0gJ1N0YXRlJzsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtRm9sbG93VXAtQXJ0aWNsZVZhbHVlJyAuICRBcnRpY2xlRnJlZVRleHROdW1iZXIgfQogICAgICAgICAgICA9ICRTZWxmLT57U3RhdGV9OwoKICAgICAgICBpZiAoICRTZWxmLT57U3RhdGV9ID1+IC8kU2VsZi0+e0NvbmZpZ30tPntDbG9zZVRpY2tldFJlZ0V4cH0vICkgewoKICAgICAgICAgICAgIyBDbG9zZSBUaWNrZXQgQ29uZGl0aW9uIC0+IFRha2UgQ2xvc2UgQWN0aW9uCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2xvc2VBY3Rpb25TdGF0ZX0gbmUgJ09MRCcgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1TdGF0ZSd9ID0gJFNlbGYtPntDb25maWd9LT57Q2xvc2VBY3Rpb25TdGF0ZX07CgogICAgICAgICAgICAgICAgbXkgJFRpbWVTdGFtcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICsgJFNlbGYtPntDb25maWd9LT57Q2xvc2VQZW5kaW5nVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtU3RhdGUtUGVuZGluZ1RpbWUnfSA9ICRUaW1lU3RhbXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGxvZyBtZXNzYWdlCiAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ1JlY292ZXJlZCcgLiAkTG9nTWVzc2FnZTsKCiAgICAgICAgICAgICMgaWYgdGhlIENJIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzZXQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzdGVtTW9uaXRvcmluZzo6U2V0SW5jaWRlbnRTdGF0ZScpICkgewoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBDSSBpbmNpZGVudCBzdGF0ZSB0byAnT3BlcmF0aW9uYWwnCiAgICAgICAgICAgICAgICAkU2VsZi0+X1NldEluY2lkZW50U3RhdGUoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkU2VsZi0+e0hvc3R9LAogICAgICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIEF0dGFjaCBub3RlIHRvIGV4aXN0aW5nIHRpY2tldAogICAgICAgICAgICAkTG9nTWVzc2FnZSA9ICdOZXcgTm90aWNlJyAuICRMb2dNZXNzYWdlOwogICAgICAgIH0KCiAgICAgICAgIyBsaW5rIHRpY2tldCB3aXRoIENJLCB0aGlzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHRpY2tldCBhbHJlYWR5IGV4aXN0cywKICAgICAgICAjIGUuZy4gaW4gYSBzdWJzZXF1ZW50IGVtYWlsIHJlcXVlc3QsIGJlY2F1c2Ugd2UgbmVlZCBhIHRpY2tldCBpZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N5c3RlbU1vbml0b3Jpbmc6OkxpbmtUaWNrZXRXaXRoQ0knKSApIHsKCiAgICAgICAgICAgICMgbGluayB0aWNrZXQgd2l0aCBDSQogICAgICAgICAgICAkU2VsZi0+X0xpbmtUaWNrZXRXaXRoQ0koCiAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAkU2VsZi0+e0hvc3R9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3RhdGV9ID1+IC8kU2VsZi0+e0NvbmZpZ30tPntOZXdUaWNrZXRSZWdFeHB9LyApIHsKCiAgICAgICAgIyBDcmVhdGUgVGlja2V0IENvbmRpdGlvbiAtPiBDcmVhdGUgbmV3IFRpY2tldCBhbmQgcmVjb3JkIEhvc3QgYW5kIFNlcnZpY2UKICAgICAgICBmb3IgKHF3KEhvc3QgU2VydmljZSkpIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBmcmVldGV4dCBudW1iZXIgZnJvbSBjb25maWcKICAgICAgICAgICAgbXkgJFRpY2tldEZyZWVUZXh0TnVtYmVyID0gJFNlbGYtPntDb25maWd9LT57ICdGcmVlVGV4dCcgLiAkXyB9OwoKICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eyAnWC1PVFJTLVRpY2tldEtleScgLiAkVGlja2V0RnJlZVRleHROdW1iZXIgfSAgID0gJF87CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsgJ1gtT1RSUy1UaWNrZXRWYWx1ZScgLiAkVGlja2V0RnJlZVRleHROdW1iZXIgfSA9ICRTZWxmLT57JF99OwogICAgICAgIH0KCiAgICAgICAgIyBTZXQgQXJ0aWNsZSBGcmVlIEZpZWxkIGZvciBTdGF0ZQogICAgICAgIG15ICRBcnRpY2xlRnJlZVRleHROdW1iZXIgPSAkU2VsZi0+e0NvbmZpZ30tPnsnRnJlZVRleHRTdGF0ZSd9OwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsgJ1gtT1RSUy1BcnRpY2xlS2V5JyAuICRBcnRpY2xlRnJlZVRleHROdW1iZXIgfSAgID0gJ1N0YXRlJzsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtQXJ0aWNsZVZhbHVlJyAuICRBcnRpY2xlRnJlZVRleHROdW1iZXIgfSA9ICRTZWxmLT57U3RhdGV9OwoKICAgICAgICAjIHNldCBzZW5kZXIgdHlwZSBhbmQgYXJ0aWNsZSB0eXBlCiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtU2VuZGVyVHlwZSd9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9OwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUFydGljbGVUeXBlJ30gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX07CgogICAgICAgICMgc2V0IGxvZyBtZXNzYWdlCiAgICAgICAgJExvZ01lc3NhZ2UgPSAnTmV3IFRpY2tldCcgLiAkTG9nTWVzc2FnZTsKCiAgICAgICAgIyBpZiB0aGUgQ0kgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNldAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N5c3RlbU1vbml0b3Jpbmc6OlNldEluY2lkZW50U3RhdGUnKSApIHsKCiAgICAgICAgICAgICMgc2V0IHRoZSBDSSBpbmNpZGVudCBzdGF0ZSB0byAnSW5jaWRlbnQnCiAgICAgICAgICAgICRTZWxmLT5fU2V0SW5jaWRlbnRTdGF0ZSgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFNlbGYtPntIb3N0fSwKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBObyBleGlzdGluZyB0aWNrZXQgYW5kIG5vIG9wZW4gY29uZGl0aW9uIC0+IGRyb3Agc2lsZW50bHkKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1JZ25vcmUnfSA9ICd5ZXMnOwogICAgICAgICRMb2dNZXNzYWdlID0gJ01haWwgRHJvcHBlZCwgbm8gbWF0Y2hpbmcgdGlja2V0IGZvdW5kLCcKICAgICAgICAgICAgLiAnIG5vIG9wZW4gb24gdGhpcyBzdGF0ZSAnIC4gJExvZ01lc3NhZ2U7CiAgICB9CgogICAgIyBsb2dnaW5nCiAgICBpZiAoJExvZ01lc3NhZ2UpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTeXN0ZW1Nb25pdG9yaW5nIE1haWw6ICcgLiAkTG9nTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NldEluY2lkZW50U3RhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBJbmNpZGVudFN0YXRlICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjb25maWdpdGVtIG9iamVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9OwoKICAgICMgc2VhcmNoIGNvbmZpZ2l0ZW0KICAgIG15ICRDb25maWdJdGVtSURzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICAjIGlmIG5vIGNvbmZpZyBpdGVtIHdpdGggdGhpcyBuYW1lIHdhcyBmb3VuZAogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRHMgfHwgcmVmICRDb25maWdJdGVtSURzIG5lICdBUlJBWScgfHwgIUB7JENvbmZpZ0l0ZW1JRHN9ICkgewoKICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGZpbmQgYW55IENJIHdpdGggdGhlIG5hbWUgJyRQYXJhbXtOYW1lfScuICIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBtb3JlIHRoYW4gb25lIGNvbmZpZyBpdGVtIHdpdGggdGhpcyBuYW1lIHdhcyBmb3VuZAogICAgaWYgKCBzY2FsYXIgQHskQ29uZmlnSXRlbUlEc30gPiAxICkgewoKICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBzZXQgaW5jaWRlbnQgc3RhdGUgZm9yIENJIHdpdGggdGhlIG5hbWUgJyRQYXJhbXtOYW1lfScuICIKICAgICAgICAgICAgICAgIC4gIk1vcmUgdGhhbiBvbmUgQ0kgd2l0aCB0aGlzIG5hbWUgd2FzIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3ZSBvbmx5IGZvdW5kIG9uZSBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9IHNoaWZ0IEB7JENvbmZpZ0l0ZW1JRHN9OwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgICMgZ2V0IGxhdGVzdCB2ZXJzaW9uIGRhdGEgb2YgY29uZmlnIGl0ZW0KICAgIG15ICRWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVmVyc2lvbjsKICAgIHJldHVybiBpZiByZWYgJFZlcnNpb24gbmUgJ0hBU0gnOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW5jaVN0YXRlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgcmV2ZXJzZSB0aGUgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJVJldmVyc2VJbmNpU3RhdGVMaXN0ID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKCiAgICAjIGNoZWNrIGlmIGluY2lkZW50IHN0YXRlIGlzIHZhbGlkCiAgICBpZiAoICEkUmV2ZXJzZUluY2lTdGF0ZUxpc3R7ICRQYXJhbXtJbmNpZGVudFN0YXRlfSB9ICkgewoKICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBpbmNpZGVudCBzdGF0ZSAnJFBhcmFte0luY2lkZW50U3RhdGV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIGEgbmV3IHZlcnNpb24gd2l0aCB0aGUgbmV3IGluY2lkZW50IHN0YXRlCiAgICBteSAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICBJbmNpU3RhdGVJRCA9PiAkUmV2ZXJzZUluY2lTdGF0ZUxpc3R7ICRQYXJhbXtJbmNpZGVudFN0YXRlfSB9LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkVmVyc2lvbklEOwp9CgpzdWIgX0xpbmtUaWNrZXRXaXRoQ0kgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBUaWNrZXRJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29uZmlnaXRlbSBvYmplY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fTsKCiAgICAjIHNlYXJjaCBjb25maWdpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICBOYW1lID0+ICRQYXJhbXtOYW1lfSwKICAgICk7CgogICAgIyBpZiBubyBjb25maWcgaXRlbSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQKICAgIGlmICggISRDb25maWdJdGVtSURzIHx8IHJlZiAkQ29uZmlnSXRlbUlEcyBuZSAnQVJSQVknIHx8ICFAeyRDb25maWdJdGVtSURzfSApIHsKCiAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBmaW5kIGFueSBDSSB3aXRoIHRoZSBuYW1lICckUGFyYW17TmFtZX0nLiAiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgbW9yZSB0aGFuIG9uZSBjb25maWcgaXRlbSB3aXRoIHRoaXMgbmFtZSB3YXMgZm91bmQKICAgIGlmICggc2NhbGFyIEB7JENvbmZpZ0l0ZW1JRHN9ID4gMSApIHsKCiAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3Qgc2V0IGluY2lkZW50IHN0YXRlIGZvciBDSSB3aXRoIHRoZSBuYW1lICckUGFyYW17TmFtZX0nLiAiCiAgICAgICAgICAgICAgICAuICJNb3JlIHRoYW4gb25lIENJIHdpdGggdGhpcyBuYW1lIHdhcyBmb3VuZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd2Ugb25seSBmb3VuZCBvbmUgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtSUQgPSBzaGlmdCBAeyRDb25maWdJdGVtSURzfTsKCiAgICAjIGxpbmsgdGhlIHRpY2tldCB3aXRoIHRoZSBDSQogICAgbXkgJExpbmtSZXN1bHQgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ1JlbGV2YW50VG8nLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJExpbmtSZXN1bHQ7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMTAvMDIvMjAgMDA6NTg6MDUgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L05hZ2lvc0Fja25vd2xlZGdlLnBtIC0gYWNrbm93bGVnZSBuYWdpb3MgdGlja2V0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTmFnaW9zQWNrbm93bGVkZ2UucG0sdiAxLjkgMjAxMC8wMi8xNSAxODoxNjowNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBMV1A6OlVzZXJBZ2VudDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgQ3VzdG9tZXJVc2VyT2JqZWN0IFNlbmRtYWlsT2JqZWN0IFRpbWVPYmplY3QgRW5jb2RlT2JqZWN0IFVzZXJPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgZ2V0IGNvcnJlY3QgRnJlZUZpZWxkcwogICAgJFNlbGYtPntGaG9zdH0gICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0Jyk7CiAgICAkU2VsZi0+e0ZzZXJ2aWNlfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpGcmVlRmllbGQ6OlNlcnZpY2UnKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWNrbm93bGVkZ2UgaXMgYWN0aXZlCiAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpUeXBlJyk7CiAgICByZXR1cm4gMSBpZiAhJFR5cGU7CgogICAgIyBjaGVjayBpZiBpdCdzIGEgTmFnaW9zIHJlbGF0ZWQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gKTsKICAgIGlmICggISRUaWNrZXR7ICRTZWxmLT57Rmhvc3R9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gIk5vIE5hZ2lvcyBUaWNrZXQhIiApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2hlY2sgaWYgaXQncyBhbiBhY2tub3dsZWRnZQogICAgcmV0dXJuIDEgaWYgJFRpY2tldHtMb2NrfSBuZSAnbG9jayc7CgogICAgIyBhZ2VudCBsb29rdXAKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLCAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCAtPiAwfDEgKGRlZmF1bHQgMCkKICAgICk7CgogICAgbXkgJFJldHVybjsKICAgIGlmICggJFR5cGUgZXEgJ3BpcGUnICkgewogICAgICAgICRSZXR1cm4gPSAkU2VsZi0+X1BpcGUoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlciAgID0+IFwlVXNlciwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnaHR0cCcgKSB7CiAgICAgICAgJFJldHVybiA9ICRTZWxmLT5fSFRUUCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gTmFnaW9zIGFja25vd2xlZGdlIHR5cGUgKCRUeXBlKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKCRSZXR1cm4pIHsKICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlNlbnQgQWNrbm93bGVkZ2UgdG8gTmFnaW9zICgkVHlwZSkuIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIldhcyBub3QgYWJsZSB0byBzZW5kIEFja25vd2xlZGdlIHRvIE5hZ2lvcyAoJFR5cGUpISIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KfQoKc3ViIF9QaXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlVXNlciAgID0gJXsgJFBhcmFte1VzZXJ9IH07CgogICAgIyBzZW5kIGFja25vd2xlZGdlIHRvIG5hZ2lvcwogICAgbXkgJENNRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCcpOwogICAgbXkgJERhdGE7CiAgICBpZiAoICRUaWNrZXR7ICRTZWxmLT57RnNlcnZpY2V9IH0gIX4gL15ob3N0JC9pICkgewogICAgICAgICREYXRhID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6U2VydmljZScpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpIb3N0Jyk7CiAgICB9CgogICAgIyByZXBsYWNlIHRpY2tldCB0YWdzCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICREYXRhICAgICAgICAgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJERhdGEgPX4gc3s8Q09ORklHXyguKz8pPn17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKCiAgICAjIHJlcGxhY2UgbG9naW4KICAgICREYXRhID1+IHMvPExPR0lOPi8kVXNlcntVc2VyTG9naW59L2c7CgogICAgIyByZXBsYWNlIGhvc3QKICAgICREYXRhID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJERhdGEgPX4gcy88U0VSVklDRV9OQU1FPi8kVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICBteSAkVGltZSA9IHRpbWUoKTsKICAgICREYXRhID1+IHMvPFVOSVhUSU1FPi8kVGltZS9nOwoKICAgICMgcmVwbGFjZSBPVVRQVVRTVFJJTkcKICAgICRDTUQgPX4gcy88T1VUUFVUU1RSSU5HPi8kRGF0YS9nOwoKICAgICNwcmludCBTVERPVVQgIiRDTURcbiI7CiAgICBzeXN0ZW0oJENNRCApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0hUVFAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXQgVXNlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyICAgPSAleyAkUGFyYW17VXNlcn0gfTsKCiAgICBteSAkVVJMICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVUkwnKTsKICAgIG15ICRVc2VyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlVzZXInKTsKICAgIG15ICRQdyAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkhUVFA6OlBhc3N3b3JkJyk7CgogICAgaWYgKCAkVGlja2V0eyAkU2VsZi0+e0ZzZXJ2aWNlfSB9ICF+IC9eaG9zdCQvaSApIHsKICAgICAgICAkVVJMID1+IHMvPENNRF9UWVA+LzM0L2c7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVVJMID1+IHMvPENNRF9UWVA+LzMzL2c7CiAgICB9CgogICAgIyByZXBsYWNlIGhvc3QKICAgICRVUkwgPX4gcy88SE9TVF9OQU1FPi8kVGlja2V0eyRTZWxmLT57Rmhvc3R9fS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICAkVVJMID1+IHMvPFNFUlZJQ0VfTkFNRT4vJFRpY2tldHskU2VsZi0+e0ZzZXJ2aWNlfX0vZzsKCiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICRVUkwgICAgICAgICAgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJFVSTCA9fiBzezxDT05GSUdfKC4rPyk+fXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMSl9ZWd4OwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCk7CiAgICAkVXNlckFnZW50LT50aW1lb3V0KDE1KTsKCiAgICBteSAkUmVxdWVzdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyggR0VUID0+ICRVUkwgKTsKICAgICRSZXF1ZXN0LT5hdXRob3JpemF0aW9uX2Jhc2ljKCAkVXNlciwgJFB3ICk7CiAgICBteSAkUmVzcG9uc2UgPSAkVXNlckFnZW50LT5yZXF1ZXN0KCRSZXF1ZXN0KTsKICAgIGlmICggISRSZXNwb25zZS0+aXNfc3VjY2VzcygpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVxdWVzdCAkVVJMOiAiIC4gJFJlc3BvbnNlLT5zdGF0dXNfbGluZSgpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgICAgcmV0dXJuICRSZXNwb25zZS0+Y29udGVudCgpOwoKICAgIHJldHVybiAxOwp9CjE7Cg==
IyAtLQojIFN5c3RlbU1vbml0b3JpbmcudCAtIFN5c3RlbU1vbml0b3JpbmcgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN5c3RlbU1vbml0b3JpbmcudCx2IDEuMiAyMDEwLzAyLzE1IDE4OjE2OjA2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOwoKbXkgJEZpbGVBcnJheSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgTG9jYXRpb24gPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS9TeXN0ZW1Nb25pdG9yaW5nMS5ib3gnLAogICAgUmVzdWx0ID0+ICdBUlJBWScsICAgICMgb3B0aW9uYWwgLSBTQ0FMQVJ8QVJSQVkKKTsKCm15ICRQb3N0TWFzdGVyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXItPm5ldygKICAgICV7JFNlbGZ9LAogICAgRW1haWwgPT4gJEZpbGVBcnJheSwKKTsKCm15IEBSZXR1cm4gPSAkUG9zdE1hc3Rlck9iamVjdC0+UnVuKCk7CiRTZWxmLT5JcygKICAgICRSZXR1cm5bMF0gfHwgMCwKICAgIDEsCiAgICAiUnVuKCkgLSBOZXdUaWNrZXQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRSZXR1cm5bMV0gfHwgMCwKICAgICJSdW4oKSAtIE5ld1RpY2tldC9UaWNrZXRJRCIsCik7CgpteSAkVGlja2V0T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwpteSAlVGlja2V0ICAgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFJldHVyblsxXSwKKTsKCiRTZWxmLT5JcygKICAgICRUaWNrZXR7VGlja2V0RnJlZVRleHQxfSwKICAgICdkZWxwaGluJywKICAgICJIb3N0IGNoZWNrIiwKKTsKCiRTZWxmLT5JcygKICAgICRUaWNrZXR7VGlja2V0RnJlZVRleHQyfSwKICAgICdIb3N0JywKICAgICJTZXJ2aWNlIGNoZWNrIiwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtTdGF0ZX0sCiAgICAnbmV3JywKICAgICJSdW4oKSAtIFRpY2tldCBTdGF0ZSIsCik7CgokRmlsZUFycmF5ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICBMb2NhdGlvbiA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL3Rlc3Qvc2FtcGxlL1N5c3RlbU1vbml0b3JpbmcyLmJveCcsCiAgICBSZXN1bHQgPT4gJ0FSUkFZJywgICAgIyBvcHRpb25hbCAtIFNDQUxBUnxBUlJBWQopOwoKJFBvc3RNYXN0ZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlci0+bmV3KAogICAgJXskU2VsZn0sCiAgICBFbWFpbCA9PiAkRmlsZUFycmF5LAopOwoKQFJldHVybiA9ICRQb3N0TWFzdGVyT2JqZWN0LT5SdW4oKTsKJFNlbGYtPklzKAogICAgJFJldHVyblswXSB8fCAwLAogICAgMiwKICAgICJSdW4oKSAtIE5ld1RpY2tldCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFJldHVyblsxXSA9PSAkVGlja2V0e1RpY2tldElEfSwKICAgICJSdW4oKSAtIE5ld1RpY2tldC9UaWNrZXRJRCIsCik7CgokVGlja2V0T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwolVGlja2V0ICAgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFJldHVyblsxXSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtTdGF0ZX0sCiAgICAnY2xvc2VkIHN1Y2Nlc3NmdWwnLAogICAgIlJ1bigpIC0gVGlja2V0IFN0YXRlIiwKKTsKCiMgZGVsZXRlIHRpY2tldApteSAkRGVsZXRlID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgVGlja2V0SUQgPT4gJFJldHVyblsxXSwKICAgIFVzZXJJRCAgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJERlbGV0ZSB8fCAwLAogICAgIlRpY2tldERlbGV0ZSgpIiwKKTsKCjE7Cg==
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFBST0JMRU0gYWxlcnQgMSAtIGRlbHBoaW4gaG9zdCBpcyBET1dOICoqCk1lc3NhZ2UtSWQ6IDwyMDA3MDMxNzIzMTU0Ni4wREZENTVEQzAwRkBoNTM3OTUuZXhhbXBsZS5jb20+CkRhdGU6IFN1biwgMTggTWFyIDIwMDcgMDA6MTU6NDYgKzAxMDAgKENFVCkKRnJvbTogbmFnaW9zQGV4YW1wbGUuY29tCk1pbWUtVmVyc2lvbjogMS4wCgoqKioqKiBOYWdpb3MgICoqKioqCgpOb3RpZmljYXRpb24gVHlwZTogUFJPQkxFTQpIb3N0OiBkZWxwaGluClN0YXRlOiBET1dOIGZvciAwZCAwaCAwbSAwcwpBZGRyZXNzOiAxMjcuMS4xLjEKSW5mbzoKCkNSSVRJQ0FMIC0gVGltZSB0byBsaXZlIGV4Y2VlZGVkICgxMjcuMS4xLjEpCgpEYXRlL1RpbWU6IFN1biBNYXIgMTggMDA6MTg6MzAgQ0VUIDIwMDcKCkFDSyBieTogCkNvbW1lbnQ6CiAKCgo=
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFJFQ09WRVJZIGFsZXJ0IDIgLSBkZWxwaGluIGhvc3QgaXMgVVAgKioKTWVzc2FnZS1JZDogPDIwMDcwMzE3MjMxOTQ2LjBERkQ1NURDMDBGQGg1Mzc5NS5leGFtcGxlLmNvbT4KRGF0ZTogU3VuLCAxOCBNYXIgMjAwNyAwMDoxOTo0NiArMDEwMCAoQ0VUKQpGcm9tOiBuYWdpb3NAZXhhbXBsZS5jb20KTWltZS1WZXJzaW9uOiAxLjAKCioqKioqIE5hZ2lvcyAgKioqKioKCk5vdGlmaWNhdGlvbiBUeXBlOiBSRUNPVkVSWQpIb3N0OiBkZWxwaGluClN0YXRlOiBVUCBmb3IgMGQgMGggMG0gMHMKQWRkcmVzczogMTcyLjEuMS4xCkluZm86CgpQSU5HIE9LIC0gUGFja2V0IGxvc3MgPSAwJSwgUlRBID0gMTUuMDkgbXMKCkRhdGUvVGltZTogU3VuIE1hciAxOCAwMDoxOTo0NiBDRVQgMjAwNwoKQUNLIGJ5OiAKQ29tbWVudDogCg==