# smd_random_banner 0.2 # Random image by category with a few extra advertising options # Stef Dawson # http://www.stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTc6InNtZF9yYW5kb21fYmFubmVyIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6MzoiMC4yIjtzOjExOiJkZXNjcmlwdGlvbiI7czo2MToiUmFuZG9tIGltYWdlIGJ5IGNhdGVnb3J5IHdpdGggYSBmZXcgZXh0cmEgYWR2ZXJ0aXNpbmcgb3B0aW9ucyI7czo0OiJoZWxwIjtzOjEzNDgxOiI8aDE+PGI+c21kX3JhbmRvbV9iYW5uZXI8L2I+PC9oMT4NCjxwIGNsYXNzPSJzbWFsbCI+W3JlcXVpcmVzIHNtZF9saWIgdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWRdPHA+DQo8Yj5HZW5lcmFsIGlkZWE8L2I+DQoNCjxwPkJhc2VkIHNoYW1lbGVzc2x5IG9uIGRydV9yYW5kb21faW1hZ2UgKHRoYW5rcyEpIHRoaXMgcGx1Z2luIGV4dGVuZHMgdGhlIGlkZWEuIFRoZSBjb25jZXB0IGlzOiB3aGF0IGlmIHlvdSB3YW50IHRvIGFkdmVydGlzZSBvdGhlciBwYXJ0cyBvZiB5b3VyIHNpdGUgKGUuZy4gb3RoZXIgcHJvZHVjdHMvc2VydmljZXMpIHVzaW5nIGEgYmFubmVyIGFkPyBZb3Ugd2FudCBhbiBpbWFnZS9hbmltYXRlZCBnaWYvd2hhdGV2ZXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBhbmQgd2hlbiBwZW9wbGUgY2xpY2sgb24gdGhlIGJhbm5lcnMsIHRoZXkgc2hvdWxkIGJlIHRha2VuIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIHNpdGUuIFRoZSBjcnVjaWFsIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBsb29rcyB2ZXJ5IGFtYXRldXIgdG8gYWR2ZXJ0aXNlIHRoZSBwcm9kdWN0IHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGxvb2tpbmcgYXQgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJvZHVjdCBpdHNlbGYuPC9wPg0KDQo8cD5UaGlzIHBsdWdpbiBhbGxvd3MgeW91IHRvIHJhbmRvbWx5IGluY2x1ZGUvZXhjbHVkZSBjbGlja2FibGUgaW1hZ2VzIGJhc2VkIG9uIGZpeGVkIHRleHQgc3RyaW5ncyBvciB0aGUgY29udGVudHMgb2YgYXJ0aWNsZSBmaWVsZHMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc2ltcGx5IHNwcnVjZSB1cCBhIHBhZ2UgYW5kIHNob3cgYSByYW5kb20gaW1hZ2UgZWFjaCB0aW1lLjwvcD4NCg0KPGI+T3B0aW9ucyBhdCBhIGdsYW5jZTwvYj4NCg0KPHA+SW4gaXRzIGJhc2UgZm9ybSwgdGhpcyBwbHVnaW4gZnVuY3Rpb25zIGV4YWN0bHkgYXMgZHJ1X3JhbmRvbV9pbWFnZSwgaS5lLjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciAvJmd0OzwvY29kZT48L3A+DQoNCjxwPndpbGwgY2hvb3NlIGEgcmFuZG9tIGltYWdlIGZyb20gYWxsIGltYWdlcyB1cGxvYWRlZCB2aWEgdGV4dHBhdHRlcm4ncyBpbWFnZSBpbnRlcmZhY2UuIE1vZGlmeSBpdCB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvcD4NCg0KPHVsPg0KPGxpPjxiPmNhdGVnb3J5PC9iPiA6IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGltYWdlIGNhdGVnb3JpZXMgdG8gY2hvb3NlIGZyb208L2xpPg0KPGxpPjxiPnN1YmNhdHM9IjEiPC9iPiA6IHdoZXRoZXIgdG8gbG9vayBpbiBzdWItY2F0ZWdvcmllcyBvciBub3QuIERlZmF1bHQ6IG5vIHN1YmNhdHM8L2xpPg0KPGxpPjxiPm1hdGNoX3RleHQ8L2I+IDogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGV4dCBzdHJpbmdzIHRvIGxvb2sgZm9yIGluIHRoZSBpbWFnZTwvbGk+DQo8bGk+PGI+YXZvaWRfdGV4dDwvYj4gOiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXh0IHN0cmluZ3MgdG8gYXZvaWQgaW4gdGhlIGltYWdlPC9saT4NCjxsaT48Yj5jb21wYXJlX3RvPC9iPiA6IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBsYWNlcyB0byBsb29rIGZvciBtYXRjaC9hdm9pZCB0ZXh0IGluIHRoZSBpbWFnZS4gQ2FuIGJlIGVpdGhlcjogbmFtZSAodGhlIGRlZmF1bHQpLCBpZCwgY2FwdGlvbiwgYWx0IG9yIGNhdGVnb3J5PC9saT4NCjxsaT48Yj5pZF9wcmVmaXg8L2I+IDogd2hlbiBzZWFyY2hpbmcgZm9yIGFuIElEIG1hdGNoIChzZWUgYmVsb3cpLCB0aGlzIHN0cmluZyBpcyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBJRCBudW1iZXIuIERlZmF1bHQ6ICJhcnRpY2xlLSI8L2xpPg0KPGxpPjxiPmFsd2F5c19kaXNwbGF5PSIxIjwvYj4gOiBpZiBubyBtYXRjaGluZyBpbWFnZXMgYXJlIGZvdW5kIHRoZSBwbHVnaW4gdXN1YWxseSByZXR1cm5zIG5vdGhpbmcuIFRoaXMgZm9yY2VzIGl0IHRvIHRyeSBhZ2FpbiB3aXRob3V0IGFueSBtYXRjaF90ZXh0L2F2b2lkX3RleHQuIERlZmF1bHQ6IG9mZjwvbGk+DQo8bGk+PGI+dGh1bWI9IjEiPC9iPiA6IHRvIGRpc3BsYXkgdGh1bWJuYWlscyBpbnN0ZWFkIG9mIGZ1bGxzaXplIGltYWdlcy4gRGVmYXVsdDogb2ZmPC9saT4NCjxsaT48Yj5saW1pdDwvYj4gOiB0aGUgbnVtYmVyIG9mIGltYWdlcyB0byBkaXNwbGF5LiBEZWZhdWx0OiAxPC9saT4NCjxsaT48Yj5pbWdjbGFzczwvYj4gOiB0aGUgQ1NTIGNsYXNzIHRvIGFkZCB0byBlYWNoIGltYWdlLiBEZWZhdWx0OiBubyBjbGFzczwvbGk+DQo8bGk+PGI+bGlua19pbjwvYj4gOiBtYWtlcyB0aGUgaW1hZ2UgY2xpY2thYmxlLiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgaW4gd2hpY2ggcGFydCBvZiB0aGUgaW1hZ2UgdGhlIFVSTCBpcyBzdG9yZWQuIENhbiBiZSBlaXRoZXIgYWx0IG9yIGNhcHRpb24uIERlZmF1bHQ6IG5vIGxpbms8L2xpPg0KPGxpPjxiPmxpbmtfcHJlZml4PC9iPiA6IHN0cmluZyB0byBwcmVwZW5kIHRvIGV2ZXJ5IFVSTC4gVXNlZnVsIGlmIHlvdSByZW9yZ2FuaXNlIHlvdXIgc2l0ZTogdXNlIHRoaXMgaW5zdGVhZCBvZiB2aXNpdGluZyBlYWNoIGltYWdlIGFuZCBhbHRlcmluZyB0aGUgY2FwdGlvbi9hbHQgdGV4dDwvbGk+DQo8bGk+PGI+cmVmZXJlcjwvYj4gOiAoc2ljISkgZWFjaCBpbWFnZSBoYXMgP2JpZD0naW1hZ2VJRCcgYWRkZWQgdG8gaXQgc28gY2xpY2tzIGNhbiBiZSB0cmFja2VkIGluIHRoZSBsb2dzIHRvIHNlZSB3aGljaCBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlIGFkcy4gQ2hhbmdlIHRoZSAnYmlkJyB0ZXh0IGhlcmUgdG8gc29tZXRoaW5nIG9mIHlvdXIgY2hvb3NpbmcsIG9yIHVzZSByZWZlcmVyPSIiIHRvIGRpc2FibGUgdHJhY2tpbmcuIERlZmF1bHQ6IGJpZCAod2hlbiBsaW5rX2luIGlzIHVzZWQpPC9saT4NCjwvdWw+DQoNCjxiPk9wdGlvbnMgaW4gZGV0YWlsPC9iPg0KDQo8cD5UbyBoaWdobGlnaHQgdGhlIG9wdGlvbnMsIHdlIGFyZSBnb2luZyB0byB1c2UgYW4gZXhhbXBsZSBvZiBhIHpvbyB3ZWIgc2l0ZS4gWW91IGhhdmUgdGhyZWUgc2VjdGlvbnMgY2FsbGVkICJhYm91dCIsICJhbmltYWxzIiBhbmQgInRvdXJzIi4gWW91IGhhdmUgaW1hZ2VzIG9mIHZhcmlvdXMgYW5pbWFscyB1bmRlciBhbiBpbWFnZSBjYXRlZ29yeSBjYWxsZWQgImFuaW1hbHMiLiBCZWxvdyB0aGF0IHRoZXkgYXJlIHNlcGFyYXRlZCBpbnRvICJtYW1tYWxzIiwgInJlcHRpbGVzIiwgYW5kICJiaXJkcyIuIFlvdXIgYWx0IHRleHQgaG9sZHMgc3VpdGFibGUgYWx0ZXJuYXRlIGRlc2NyaXB0aW9ucyBvZiB0aGUgYW5pbWFscyBhbmQgdGhlIGNhcHRpb24gdGV4dCBpcyBhIHVybCB0byBhbiBhcnRpY2xlIGFib3V0IGVhY2ggYW5pbWFsLiBZb3UgYWxzbyBoYXZlIG90aGVyIGltYWdlIGNhdGVnb3JpZXMgZm9yIHRoZSByZXN0IG9mIHlvdXIgc2l0ZS48L3A+DQoNCjxiPjxpPkZpeGVkIGNhdGVnb3J5IGxpc3RzPC9pPjwvYj4NCjxwPlRoZSBpbWFnZSBjYXRlZ29yaWVzIHRvIGNob29zZSBmcm9tIGNhbiBlaXRoZXIgYmUgYSBzdHJhaWdodGZvcndhcmQgbGlzdCBvciBjYW4gaGF2ZSBzb21lIHNwZWNpYWwgdG9rZW5zIHRoYXQgYWRkIGluZm9ybWF0aW9uIHJlYWQgZnJvbSB0aGUgYXJ0aWNsZS4gQW4gZXhhbXBsZTo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIGxpbWl0PSI0IiBzdWJjYXRzPSIxIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPnRvIHB1bGwgb3V0IGZvdXIgcGljdHVyZXMgb2YgYW55IGFuaW1hbCB0byBzaG93IG9uIHlvdXIgZnJvbnQgcGFnZS4gSWYgeW91IHdhbnRlZCB0byBiZSBtb3JlIHNwZWNpZmljIHlvdSBjb3VsZCB0cnk6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJtYW1tYWxzLCByZXB0aWxlcyIgbGlua19pbj0iY2FwdGlvbiIgLyZndDs8L2NvZGU+PC9wPg0KDQo8cD53aGljaCB3b3VsZCBkaXNwbGF5IGEgcmFuZG9tIHBpY3R1cmUgZnJvbSBlaXRoZXIgdGhlIG1hbW1hbHMgb3IgcmVwdGlsZXMgY2F0ZWdvcmllcy4gRWFjaCBpbWFnZSB3b3VsZCBiZSBjbGlja2FibGUgYW5kIHRoZSBsaW5rIHdvdWxkIHRha2UgeW91IHRvIHRoZSBVUkwgZ2l2ZW4gaW4gdGhlIGNhcHRpb24gZmllbGQgb2YgdGhhdCBpbWFnZS48L3A+DQoNCjxiPjxpPkR5bmFtaWMgY2F0ZWdvcnkgbGlzdHM8L2k+PC9iPg0KPHA+SGFyZC1jb2RpbmcgdGhlIGNhdGVnb3JpZXMgaXMgZmluZSwgYnV0IGluIFRYUCBmb3JtcyB5b3Ugb2Z0ZW4gd2FudCB0byBiZSBtb3JlIGdlbmVyaWMuIElmIHlvdSBhcnJhbmdlZCB5b3VyIHNpdGUgc28gdGhhdCB5b3UgaGFkIGFydGljbGUgY2F0ZWdvcmllcyBzdWNoIGFzICJtYW1tYWxzIiBhbmQgInJlcHRpbGVzIiAobWlycm9yaW5nIHlvdXIgaW1hZ2UgY2F0ZWdvcmllcyksIHlvdSBjb3VsZCBkbyB0aGlzOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iP2MiIGxpbmtfaW49ImNhcHRpb24iIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+VGhlICc/JyB0ZWxscyB0aGUgcGx1Z2luIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIChpbWFnZSkgY2F0ZWdvcnkgaXMgZ29pbmcgdG8gYmUgd2hlbiB5b3UgY29kZSB0aGUgZm9ybSwgYnV0IHlvdSB3YW50IGl0IHRvIGJlIHJlYWQgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlIHRoYXQgYSB2aXNpdG9yIGlzIHZpZXdpbmcuIFNpbmNlIG91ciBhcnRpY2xlIGNhdGVnb3JpZXMgbWltaWMgb3VyIGltYWdlIGNhdGVnb3JpZXMgaW4gdGhpcyBjYXNlLCAnP2MnIG1lYW5zICJyZWFkIHRoZSBhcnRpY2xlIGNhdGVnb3J5IGFuZCB1c2UgdGhhdCBhcyB0aGUgaW1hZ2UgY2F0ZWdvcnkiLjwvcD4NCg0KPHA+U28gaWYgeW91ciB2aXNpdG9yIHdhcyB2aWV3aW5nIGEgcGFnZSBhYm91dCBhIHJlcHRpbGUsIHRoZSByYW5kb20gaW1hZ2UgZGlzcGxheWVkIG9uIHRoZSBwYWdlIHdvdWxkIGJlIG9mIGFub3RoZXIgcmVwdGlsZSAocG9zc2libHkgdGhlIHNhbWUgb25lLCBzZWUgbGF0ZXIgaG93IHRvIGZpeCB0aGlzKS4gT3RoZXIgb3B0aW9ucyBhcmU6ICc/cycgZm9yIHNlY3Rpb247ICc/dCcgZm9yIGFydGljbGUgVVJMIHRpdGxlOyAnP2lkJyBmb3IgYXJ0aWNsZSBJRC48L3A+DQoNCjxwPklmIHlvdSB1c2UgJz9pZCcsIHRoZSA8Y29kZT5pZF9wcmVmaXg8L2NvZGU+IG9wdGlvbiBjb21lcyBpbnRvIHBsYXkuIFdoYXRldmVyIGlzIHNwZWNpZmllZCBpbiBpZF9wcmVmaXggKGRlZmF1bHQ6ICJhcnRpY2xlLSIpIGlzIHB1dCBpbiBmcm9udCBvZiB0aGUgSUQgbnVtYmVyLiBUaGlzIGhlbHBzIHdoZW4gY3JlYXRpbmcgcGVyLWFydGljbGUgaW1hZ2UgY2F0ZWdvcmllcyBhbmQgbWVhbnMgeW91IGRvbid0IGhhdmUgdG8gaGF2ZSBjYXRlZ29yeSBuYW1lcyB0aGF0IGFyZSBzaW1wbHkgbnVtYmVycy48L3A+DQoNCjxiPjxpPkV4Y2x1c2lvbiBsaXN0czwvaT48L2I+DQo8cD5CYWNrIHRvIG91ciByZXB0aWxlIHBhZ2UsIHdoYXQgaWYgeW91IHdhbnRlZCB0byBzaG93IGEgcGljdHVyZSBmcm9tIGFueSBvdGhlciBjYXRlZ29yeT8gSW4gdGhhdCBjYXNlIHlvdSBjYW4gdXNlOjwvcD4NCg0KPHA+PGNvZGU+Jmx0O3R4cDpzbWRfcmFuZG9tX2Jhbm5lciBjYXRlZ29yeT0iYW5pbWFscywgIWMiIGxpbmtfaW49ImNhcHRpb24iIHN1YmNhdHM9IjEiIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPHA+VGhlIGV4Y2xhbWF0aW9uIG1hcmsgbWVhbnMgImV4Y2x1ZGUiLCBzbyB0aGF0IGV4YW1wbGUgZGlzcGxheXMgYSByYW5kb20gYW5pbWFsIHBpY3R1cmUgZnJvbSBhbnkgY2F0ZWdvcnkgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgYmVpbmcgcmVhZC4gWW91IGNhbiBleGNsdWRlIGNhdGVnb3JpZXMgKCFjKSwgc2VjdGlvbnMgKCFzKSwgdGl0bGVzICghdCkgb3IgSURzICghaWQsIGFnYWluIHByZXBlbmRlZCB3aXRoIGlkX3ByZWZpeCkuIEFuZCB5b3UgY2FuIG1peCBhbmQgbWF0Y2ggdGhlIG9wdGlvbnMgYXMgeW91IHNlZSBmaXQuPC9wPg0KDQo8Yj48aT5DdXN0b20gZmllbGRzPC9pPjwvYj4NCjxwPlRoZSBmdW4gZG9lc24ndCBzdG9wIHRoZXJlLiBZb3UgY2FuIHVzZSBhbnkgZmllbGQgaW4gdGhlIGFydGljbGUgYXMgYW4gaW5jbHVkZSBvciBleGNsdWRlIGxpc3QuIFNheSB5b3UgY2hvc2UgY3VzdG9tXzE6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJyZXB0aWxlcywgP2N1c3RvbV8xIiBsaW5rX2luPSJjYXB0aW9uIiBzdWJjYXRzPSIxIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPllvdSB3b3VsZCBnZXQgYSByYW5kb20gaW1hZ2UgY2hvc2VuIGZyb20gdGhlICdyZXB0aWxlcycgaW1hZ2UgY2F0ZWdvcnkgYW5kIGFsc28gdGhlIGNhdGVnb3JpZXMgbGlzdGVkIGluIGN1c3RvbV8xIG9mIHRoZSBjdXJyZW50bHkgdmlld2VkIGFydGljbGUuIElmIHlvdSBwdXQgIm1hbW1hbHMsIGJpcmRzLCBwZW5ndWlucyIgaW4gY3VzdG9tXzEgeW91IHdvdWxkIGdldCBhbiBpbWFnZSBjaG9zZW4gZnJvbSBhbGwgZm91ciBjYXRlZ29yaWVzIChhbmQgdGhlaXIgc3ViLWNhdGVnb3JpZXMgaW4gdGhpcyBjYXNlKS4gVGhpcyBzb3J0IG9mIGlkZWEgY2FuIGJlIHVzZWQgd2l0aCA8Y29kZT5jYXRlZ29yeT0iP2tleXdvcmRzIjwvY29kZT4gdG8gZ2V0IGEgbGlzdCBvZiAicmVsYXRlZCBpbWFnZSBjYXRlZ29yaWVzIi4uLjwvcD4NCg0KPHA+WW91IGNhbiBhbHNvIGV4Y2x1ZGUgYXJ0aWNsZSBmaWVsZHMgYnkgdXNpbmcgJyEnIGluc3RlYWQgb2YgJz8nLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBzaG93aW5nIHJhbmRvbSBwaWN0dXJlcyBvZiBhbnkgYW5pbWFscyBpbiB0aGUgY3VycmVudCBjYXRlZ29yeSBleGNlcHQgdGhlIG9uZSB5b3UgYXJlIHZpZXdpbmc6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSI/YywgIWFydGljbGVfaW1hZ2UiIGxpbmtfaW49ImNhcHRpb24iIC8mZ3Q7PC9jb2RlPjwvcD4NCg0KPGI+PGk+TWF0Y2hpbmcvYXZvaWRpbmcgdGV4dDwvaT48L2I+DQo8cD5DYXRlZ29yaWVzIG9uIHRoZWlyIG93biBvbmx5IHRlbGwgaGFsZiB0aGUgc3RvcnkuIFRoZXJlIGFyZSB0aW1lcyB5b3UgbWlnaHQgd2FudCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgc3BlY2lmaWMgcGllY2VzIG9mIHRleHQgZnJvbSB5b3VyIGltYWdlcy4gVGhlIHRleHQgY291bGQgYmUgaW4gdGhlIGZpbGVuYW1lLCB0aGUgaWQsIHRoZSBjYXB0aW9uLCB0aGUgYWx0IHRleHQsIG9yIHRoZSBjYXRlZ29yeSBuYW1lLjwvcD4NCg0KPHA+SW1hZ2luZSB5b3VyIHZpc2l0b3IgY2xpY2tlZCBhIHBpY3R1cmUgb2YgYSBjcm9jb2RpbGUgYW5kIHRoZXkgYXJlIHZpZXdpbmcgdGhlIGdyaXNseSBkZXRhaWxzIG9uIGFuIGFydGljbGUgcGFnZS4gWW91IG1pZ2h0IHdhbnQgdG8gcHV0ICJJZiB5b3UgbGlrZWQgdGhpcywgZmluZCBvdXQgYWJvdXQgdGhlc2UgYW5pbWFscyB0b286IiBhbmQgc2hvdyBhIGZldyByYW5kb20gaW1hZ2VzIHRoYXQgYWxsb3cgdGhlbSB0byBzZWUgc3R1ZmYgYWJvdXQgb3RoZXIgYW5pbWFscy4gT2J2aW91c2x5LCB3ZSBkb24ndCB3YW50IGEgcGljdHVyZSBvZiBhIGNyb2NvZGlsZSB0byBzaG93IHVwLiBBbmQgbWF5YmUgd2UgZG9uJ3Qgd2FudCB0byBzaG93IGFsbGlnYXRvcnMgZWl0aGVyIGJlY2F1c2UgdGhleSdyZSBxdWl0ZSBzaW1pbGFyLiBTbyB3ZSBjYW4gZG8gdGhpczo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIHN1YmNhdHM9IjEiIGxpbmtfaW49ImNhcHRpb24iIGF2b2lkX3RleHQ9ImNyb2MsIGNyb2NvZGlsZSwgYWxsaWdhdG9yIiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPlRoYXQgd291bGQgY2hvb3NlIGFueSBwaWN0dXJlIGZyb20gdGhlIGFuaW1hbHMgY2F0ZWdvcnkgKGFuZCBhbGwgaXRzIHN1Yi1jYXRlZ29yaWVzKSBhcyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZSA8aT5kaWRuJ3Q8L2k+IGNvbnRhaW4gJ2Nyb2MnIG9yICdjcm9jb2RpbGUnIG9yICdhbGxpZ2F0b3InLiBJZiB5b3VyIGZpbGVuYW1lcyB3ZXJlIGEgbGl0dGxlIHVuc3RydWN0dXJlZCwgbWF5YmUgeW91J2Qgd2FudCB0byBjaGVjayB0aGUgYWx0IHRleHQgYW5kIGNhcHRpb24gdGV4dCBmb3IgYSBtYXRjaCBhcyB3ZWxsLiBVc2UgPGNvZGU+Y29tcGFyZV90bzwvY29kZT4gZm9yIHRoaXM6PC9wPg0KDQo8cD48Y29kZT4mbHQ7dHhwOnNtZF9yYW5kb21fYmFubmVyIGNhdGVnb3J5PSJhbmltYWxzIiBzdWJjYXRzPSIxIiBsaW5rX2luPSJjYXB0aW9uIiBhdm9pZF90ZXh0PSJjcm9jLCBjcm9jb2RpbGUsIGFsbGlnYXRvciIgY29tcGFyZV90bz0ibmFtZSwgYWx0LCBjYXB0aW9uIiAvJmd0OzwvY29kZT48L3A+DQoNCjxiPjxpPkR5bmFtaWNhbGx5IG1hdGNoaW5nL2F2b2lkaW5nIHRleHQ8L2k+PC9iPg0KPHA+T24gYW4gYXJ0aWNsZSBwYWdlLCBoYXJkLWNvZGluZyBsaXN0cyBvZiB0aGluZ3MgdG8gaW5jbHVkZS9leGNsdWRlIGlzIGFjY2VwdGFibGUuIEJ1dCBpZiB5b3UncmUgdXNpbmcgYSBmb3JtIHlvdSBkb24ndCB3YW50IHRvIGRvIHRoYXQsIHNvIHlvdSBjYW4gdXNlICc/JyBwbGFjZWhvbGRlcnMgdGhhdCB3aWxsIHJlYWQgc3R1ZmYgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlLiBTYXkgeW91IHdhbnRlZCB0byBwaWNrIGFueSByYW5kb20gYW5pbWFsIGV4Y2VwdCBvbmVzIGZyb20gdGhlIGN1cnJlbnQgYXJ0aWNsZSBjYXRlZ29yeTo8L3A+DQoNCjxwPjxjb2RlPiZsdDt0eHA6c21kX3JhbmRvbV9iYW5uZXIgY2F0ZWdvcnk9ImFuaW1hbHMiIHN1YmNhdHM9IjEiIGF2b2lkX3RleHQ9Ij9jIiBjb21wYXJlX3RvPSJuYW1lLCBhbHQsIGNhcHRpb24sIGNhdGVnb3J5IiAvJmd0OzwvY29kZT48L3A+DQoNCjxwPk5vdGljZSB0aGF0LCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLCB3ZSdyZSB1c2luZyA8Y29kZT5jb21wYXJlX3RvPC9jb2RlPiwgdGVsbGluZyB0aGUgcGx1Z2luIHRvIGxvb2sgaW4gdGhlIG5hbWUsIGFsdCB0ZXh0LCBjYXB0aW9uIHRleHQgYW5kIGNhdGVnb3J5IG5hbWUgZm9yIGEgbWF0Y2guIElmIGFueSBvZiB0aG9zZSBpdGVtcyBtYXRjaGVzIHRoZSBjdXJyZW50IGNhdGVnb3J5LCB0aGUgaW1hZ2Ugd2lsbCBiZSBleGNsdWRlZDsgYW55IG90aGVyIHBpY3R1cmUgaXMgZmFpciBnYW1lIGZvciBiZWluZyBzaG93biBvbiB0aGUgcGFnZS48L3A+DQoNCjxwPllvdSBjYW4gYWxzbyB1c2UgPGNvZGU+bWF0Y2hfdGV4dDwvY29kZT4gdG8gaW5jbHVkZSBpbWFnZXMgdGhhdCBvbmx5IGNvbnRhaW4gc3BlY2lmaWMgd29yZHMuIElmIHlvdSBzcGVjaWZ5IGJvdGggbWF0Y2hfdGV4dCBhbmQgYXZvaWRfdGV4dCwgeW91ciAncG9zaXRpdmUnIG1hdGNoZXMgd2lsbCBiZSBjaG9zZW4gZmlyc3QgdG8gZ2l2ZSBhICdwb29sJyBvZiBhdmFpbGFibGUgaW1hZ2VzIGFuZCB0aGVuIGFueSB0aGF0IG1lZXQgdGhlIGF2b2lkX3RleHQgY3JpdGVyaWEgd2lsbCBiZSB0aHJvd24gYXdheS48L3A+DQoNCjxwPkFzIHdpdGggdGhlIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBvcHRpb24sIHlvdSBjYW4gc3BlY2lmeSAnP2MnLCAnP3MnLCAnP3QnLCAnP2lkJyAoaW5jbHVkaW5nIHRoZSBpZF9wcmVmaXggb3B0aW9uKSBvciAnP2ZpZWxkbmFtZScgd2hlcmUgZmllbGRuYW1lIGlzIHNvbWV0aGluZyBsaWtlIGN1c3RvbV8xLCBjdXN0b21fMiwgYXJ0aWNsZV9pbWFnZSwga2V5d29yZHMsIGV4Y2VycHQsIGV0Yy4gWW91IGFyZSBub3QgbGltaXRlZCB0byBhbnkgcGFydGljdWxhciBmaWVsZHM7IHlvdSBjYW4gZXZlbiB1c2UgP2JvZHkgYnV0IGJlIHdhcm5lZCB0aGF0IHlvdXIgc2l0ZSBtYXkgZXhwbG9kZSE8L3A+DQoNCjxiPjxpPkxpbmtzPC9pPjwvYj4NCjxwPlNldmVyYWwgZXhhbXBsZXMgaGF2ZSBhbHJlYWR5IGludHJvZHVjZWQgdGhlIDxjb2RlPmxpbmtfaW48L2NvZGU+IG9wdGlvbi4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgVGV4dHBhdHRlcm4gd2UgYXJlIGxpbWl0ZWQgdG8gcHV0dGluZyBhIFVSTCBsaW5rIGVpdGhlciBpbiB0aGUgYWx0IG9yIHRoZSBjYXB0aW9uLiBGb3IgYWNjZXNzaWJpbGl0eSwgdGhlIGNhcHRpb24gaXMgcHJvYmFibHkgYSBiZXR0ZXIgY2hvaWNlIGJ1dCBpdCdzIHlvdXIgY2FsbC48L3A+DQoNCjxwPlRvIGRpcmVjdCB2aXNpdG9ycyB0byBhIHdlYiBwYWdlIHdoZW4gdGhleSBjbGljayBvbiBhbiBpbWFnZSwgdHlwZSB0aGUgVVJMIGluIGVpdGhlciB0aGUgY2FwdGlvbiBvciBhbHQgYXJlYSBvZiB0aGUgaW1hZ2UgYW5kIHRoZW4gdXNlIDxjb2RlPmxpbmtfaW49ImNhcHRpb24iPC9jb2RlPiBvciA8Y29kZT5saW5rX2luPSJhbHQiPC9jb2RlPiB0byByZWFkIHRoZSBsaW5rIGFuZCBhdHRhY2ggaXQgdG8gdGhlIGltYWdlLiBJZiB0aGUgbGluayBpcyBhIGZ1bGwgVVJMIHN0YXJ0aW5nIHdpdGggaHR0cDovLyBpdCB3aWxsIGJlIHVzZWQgdmVyYmF0aW0gZm9yIHRoZSBpbWFnZSBsaW5rLiBJZiBpdCBzdGFydHMgd2l0aCBhICcvJyBpdCB3aWxsIGJlIGh1bmcgb2ZmIHRoZSByb290IHNpdGVfdXJsIGRpcmVjdGx5LiBJZiBpdCBzdGFydHMgd2l0aCBhbnl0aGluZyBlbHNlIGl0IGlzIGFzc3VtZWQgYSAncmVsYXRpdmUnIGxpbmsgYW5kIGluaGVyaXRzIHRoZSBjdXJyZW50IHNlY3Rpb24uPC9wPg0KDQo8cD5Gb3IgY29udmVuaWVuY2UsIHlvdSBtYXkgc3BlY2lmeSA8Y29kZT5saW5rX3ByZWZpeDwvY29kZT4gd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGxpbmsuIFRoaXMgYWxsb3dzIHlvdSB0byBkaXJlY3QgYWxsIGxpbmtzIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24gb2YgeW91ciBzaXRlIGVhc2lseSwgYW5kIGhlbHBzIGlmIHlvdSBoYXZlIHJlb3JnYW5pc2VkIHlvdXIgc2l0ZTsgeW91IHdvbid0IGhhdmUgdG8gcmV2aXNpdCBhbGwgdGhlIGltYWdlcyBhbmQgY2hhbmdlIGVhY2ggbGluay4gQWdhaW4sIGlmIDxjb2RlPmxpbmtfcHJlZml4PC9jb2RlPiBiZWdpbnMgd2l0aCBodHRwOi8vIGl0IGlzIGFzc3VtZWQgYSBmdWxsIFVSTCB0byBhbm90aGVyIHNpdGU7IGlmIGl0IGJlZ2lucyB3aXRoICcvJyBpdCBpcyBhIHJvb3QgbGluazsgYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlY3Rpb24uIE5vdGUgdGhhdCBpZiB5b3UgdXNlIGFuIGh0dHA6Ly8gZnVsbCBVUkwgaW4gdGhlIGltYWdlIGl0c2VsZiwgYW55IGxpbmtfcHJlZml4IHdpbGwgYmUgaWdub3JlZC48L3A+DQoNCjxiPjxpPlRyYWNraW5nIGNsaWNrczwvaT48L2I+DQo8cD5XaGVuIHVzaW5nIDxjb2RlPmxpbmtfaW48L2NvZGU+LCBhbGwgbGlua3MgYXJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgd2l0aCA8Y29kZT5iaWQ9aW1hZ2VJRDwvY29kZT4sIHdoZXJlIGltYWdlSUQgaXMgdGhlIGlkIG9mIHRoZSBpbWFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoZSB3b3JkICdiaWQnIHN0YW5kcyBmb3IgJ2Jhbm5lciBpZCcgYW5kIGlzIHNpbXBseSBhZGRlZCBzbyB0aGF0IGl0IHNob3dzIHVwIGluIHRoZSBsb2dzLiBQcm92aWRpbmcgeW91IGhhdmUgbG9ncyB0dXJuZWQgb24sIHlvdSBjYW4gZmlsdGVyIHRoZSBsb2cgZmlsZSBhbmQgc2VlIHdoaWNoIGltYWdlcyBhcmUgbW9zdCBmcmVxdWVudGx5IGNsaWNrZWQsIHBlcmhhcHMgZW5hYmxpbmcgeW91IHRvIGp1ZGdlIGhvdyBlZmZlY3RpdmUgcGFydGljdWxhciBpbWFnZXMgYXJlIGF0IGdlbmVyYXRpbmcgdHJhZmZpYy48L3A+DQoNCjxwPklmIHlvdSBkb24ndCBsaWtlIHRoZSB3b3JkICdiaWQnIHlvdSBjYW4gY2hhbmdlIGl0IHdpdGggdGhlIDxjb2RlPnJlZmVyZXI8L2NvZGU+IG9wdGlvbjsgbWlzLXNwZWxsZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIEhUVFAgc3BlYyB3YXMgYWxsIHRob3NlIHllYXJzIGFnbyA6LSkgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB0dXJuIG9mZiB0aGUgdHJhY2tpbmcgZmVhdHVyZSBieSB1c2luZyA8Y29kZT5yZWZlcmVyPSIiPC9jb2RlPi48L3A+DQoNCjxiPlRyb3VibGVzaG9vdGluZzwvYj4NCg0KPHA+V2l0aCBzbyBtYW55IGNyYXp5IGNvbWJpbmF0aW9ucyBvZiBvcHRpb25zLCBpdCdzIGVhc3kgdG8gZ2V0IGxvc3QuIEtlZXBpbmcgeW91ciBpbWFnZXMgZ3JvdXBlZCBpbnRvIGxvZ2ljYWwgc3ViLWNhdGVnb3JpZXMgY2FuIGhlbHAgaW1tZW5zZWx5LiBBbHNvLCB1c2luZyBhIGdvb2QgbmFtaW5nIGNvbnZlbnRpb24gZm9yIGltYWdlIGZpbGVuYW1lcyBvciB1c2luZyBzdGFuZGFyZCB3b3JkcyBmb3IgdGhpbmdzIHRocm91Z2hvdXQgeW91ciBzaXRlIGlzIGEgYm9udXMuPC9wPg0KDQo8cD5JZiB0aGUgcGx1Z2luIGlzIG5vdCBkaXNwbGF5aW5nIGFueSBpbWFnZXMsIGNoZWNrIHlvdXIgY2F0ZWdvcnkgbmFtZXMgYXJlIGNvcnJlY3QsIGFuZCB0aGF0IHlvdSBhcmUgdXNpbmcgPGNvZGU+c3ViY2F0cz0iMSI8L2NvZGU+IGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIGNhdGVnb3J5IHRyZWUuIFRyeSBhZGRpbmcgPGNvZGU+YWx3YXlzX2Rpc3BsYXk9IjEiPC9jb2RlPiBhbmQgc2VlIGlmIGFuIGltYWdlIHNob3dzIHVwLiBJZiBpdCBkb2Vzbid0LCBub25lIG9mIHlvdXIgY2hvc2VuIGNhdGVnb3JpZXMgZXhpc3QgKHRyeSByZW1vdmluZyB0aGUgY2F0ZWdvcnkgb3B0aW9uIHRvIGNoZWNrKS48L3A+DQoNCjxwPlRoZXJlIGlzIGEgY2hhbmNlIHRoYXQsIHVuZGVyIHR4cCB2NC4wLjQsIHlvdSB3aWxsIGdldCB0aGUgc2FtZSBpbWFnZSBiYWNrIGVhY2ggdGltZS4gVGhpcyBjb3VsZCBiZSBiZWNhdXNlIG9mIHlvdXIgb3B0aW9ucyAoY2hlY2sgPGNvZGU+bWF0Y2hfdGV4dDwvY29kZT4sIDxjb2RlPmF2b2lkX3RleHQ8L2NvZGU+LCA8Y29kZT5jb21wYXJlX3RvPC9jb2RlPiBhbmQgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IGNhcmVmdWxseSkgYnV0IG1heSBhbHNvIGJlIGJlY2F1c2UgdGhlIGltYWdlIGlzIGJlaW5nIGNhY2hlZC4gSWYgdGhlIHNlcnZlciB0aGlua3MgdGhlIGN1cnJlbnQgcGFnZSByZXF1ZXN0IGlzIGlkZW50aWNhbCB0byB0aGUgbGFzdCwgaXQgaW5zdHJ1Y3RzIHRoZSBicm93c2VyIHRvIHNob3cgdGhlIHNhbWUgcGFnZSBhcyBsYXN0IHRpbWUuIEludGVybmV0IEV4cGxvcmVyIGlzIHBhcnRpY3VsYXJseSBhZGVwdCBhdCB0aGlzLjwvcD4NCg0KPHA+SWYgdGhpcyBpcyBjYXVzaW5nIGEgcHJvYmxlbSwgdHJ5IHNldHRpbmcgdGhlIHZhbHVlIG9mICJTZW5kIExhc3QtTW9kaWZpZWQgaGVhZGVyIiB0byAibm8iIHVuZGVyIGFkbWluLT5wcmVmZXJlbmNlcy0+YWR2YW5jZWQuIEl0IG1heSBpbmNyZWFzZSBzZXJ2ZXIgbG9hZCBiZWNhdXNlIGV2ZXJ5IHBhZ2UgYW5kIGltYWdlIHdpbGwgYWx3YXlzIGJlIHNlbnQgZnJvbSB0aGUgc2VydmVyLCBidXQgYXQgbGVhc3QgeW91J2xsIGdldCBhIHJhbmRvbSBpbWFnZSBlYWNoIHRpbWUgOi0pPC9wPiI7czo0OiJjb2RlIjtzOjgyOTA6Ii8vIHYwLjEgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjExIEFkZGVkIFBGWCB0byBxdWVyeSAodGhhbmtzIG1lcmN1cnkpDQovLyB2MC4xMiBGaXhlZCBoZWxwIHRvIGluY2x1ZGUgdHJhaWxpbmcgc2xhc2hlcyAodGhhbmtzIHZpdHRvcmlvKQ0KLy8gdjAuMTMgVW5yZWxlYXNlZC4gQWRkZWQgbG9va19pbj1jYXRlZ29yeSBhbmQgcmVmZXJlcg0KLy8gdjAuMTQgQWRkZWQgbWF0Y2hfdGV4dCBhbmQgdXNlX2FsdCAodGhhbmtzIGx1a2VwZXJtc24pDQovLyB2MC4xNSBBZGRlZCBhbHdheXNfZGlzcGxheSBhbmQgbGltaXQgKHRoYW5rcyBsdWtlcGVybXNuKQ0KLy8gdjAuMTVhIEJ1Z2ZpeCBmb3IgbGlua2NhcHRpb24gKHRoYW5rcyBtZXJjdXJ5KQ0KLy8gdjAuMTYgVGlnaHRlbmVkIGltYWdlKCkgcGFyYW1zIGZvciB0eHAgdjQuMC40IGNvbXBsaWFuY2UNCi8vIHYwLjE3IEFkZGVkIHRodW1iLCBsaW5rcHJlZml4IGFuZCBsaW5rYWx0IG9wdGlvbnMNCi8vIHYwLjE3YSBiaWQgb3B0aW9uIG5vdyB3b3JrcyB3aXRoIGV4aXN0aW5nIHVybCBwYXJhbXMgKHRoYW5rcyBQYXB1YXNzKQ0KLy8gdjAuMTggQWRkZWQgaW1nY2xhc3Mgb3B0aW9uICh0aGFua3MgRGlnaXRhbFJlYWxtKQ0KLy8gdjAuMiAgTWFqb3Igb3ZlcmhhdWwuIEFkZGVkIHN1YmNhdGVnb3J5IHN1cHBvcnQgKHRoYW5rcyBsdWtlcGVybXNuIGFuZCBzYW50aGVvKS4gVXNlcyBzbWRfbGliLiBFbmhhbmNlZCBtYXRjaF90ZXh0L2F2b2lkX3RleHQgc28gbG9va19pbiBpcyBubyBsb25nZXIgbmVlZGVkOyBkcm9wcGVkIHVzZV9hbHQgYW5kIGFkZGVkIGNvbXBhcmVfdG87IHJlcGxhY2VkIGxpbmtjYXB0aW9uL2xpbmthbHQgd2l0aCBsaW5rX2luOyBhZGRlZCBpZF9wcmVmaXg7IGxpbmtwcmVmaXggaXMgbm93IGxpbmtfcHJlZml4DQoNCmZ1bmN0aW9uIHNtZF9yYW5kb21fYmFubmVyKCRhdHRzKSB7DQoJcmVxdWlyZV9wbHVnaW4oJ3NtZF9saWInKTsNCg0KCS8vICoqIGFsbG93YWJsZSBvcHRpb25zIChkZWZhdWx0IGxpc3RlZCBmaXJzdCkNCgkkY29tcGFyZVRvID0gYXJyYXkoIm5hbWUiLCJpZCIsImFsdCIsImNhcHRpb24iLCJjYXRlZ29yeSIpOw0KCSRsaW5rSW4gPSBhcnJheSgiIiwiY2FwdGlvbiIsImFsdCIpOw0KDQoJLy8gKiogcGx1Z2luIG9wdGlvbnMNCglpZiAoaXNfYXJyYXkoJGF0dHMpKSBleHRyYWN0KCRhdHRzKTsNCgkkY2F0ZWdvcnkgPSBpc3NldCgkY2F0ZWdvcnkpID8gKCgkY2F0ZWdvcnk9PSIiKSA/ICIlIiA6IGRvU2xhc2goJGNhdGVnb3J5KSkgOiAiJSI7DQoJJG1hdGNoX3RleHQgPSBpc3NldCgkbWF0Y2hfdGV4dCkgPyAkbWF0Y2hfdGV4dCA6ICIiOw0KCSRhdm9pZF90ZXh0ID0gaXNzZXQoJGF2b2lkX3RleHQpID8gJGF2b2lkX3RleHQgOiAiIjsNCgkkcmVmZXJlciA9IGlzc2V0KCRyZWZlcmVyKSA/ICRyZWZlcmVyIDogImJpZCI7DQoJJGxpbWl0ID0gaXNzZXQoJGxpbWl0KSA/ICRsaW1pdDogIjEiOw0KCSRpbWdjbGFzcyA9IGlzc2V0KCRpbWdjbGFzcykgPyAkaW1nY2xhc3MgOiAiIjsNCgkkaWRfcHJlZml4ID0gaXNzZXQoJGlkX3ByZWZpeCkgPyAkaWRfcHJlZml4IDogImFydGljbGUtIjsNCgkkbGlua19wcmVmaXggPSBpc3NldCgkbGlua19wcmVmaXgpID8gJGxpbmtfcHJlZml4IDogIiI7DQoJJGxpbmtfaW4gPSAoaXNzZXQoJGxpbmtfaW4pICYmIGluX2FycmF5KCRsaW5rX2luLCRsaW5rSW4pKSA/ICRsaW5rX2luIDogJGxpbmtJblswXTsNCgkkc3ViY2F0cyA9IGlzc2V0KCRzdWJjYXRzKSA/IHRydWUgOiBmYWxzZTsNCgkkdGh1bWIgPSBpc3NldCgkdGh1bWIpID8gdHJ1ZSA6IGZhbHNlOw0KCSRhbHdheXNfZGlzcGxheSA9IGlzc2V0KCRhbHdheXNfZGlzcGxheSkgPyB0cnVlIDogZmFsc2U7DQoNCgkkY29tcGFyZVRvT3B0cyA9IGFycmF5KCk7DQoJaWYgKGlzc2V0KCRjb21wYXJlX3RvKSkgew0KCQkkY3RMaXN0ID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8nLCRjb21wYXJlX3RvLC0xLFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGN0TGlzdCk7ICRpZHgrKykgew0KCQkJaWYoaW5fYXJyYXkoJGN0TGlzdFskaWR4XSwkY29tcGFyZVRvKSkgew0KCQkJCSRjb21wYXJlVG9PcHRzW10gPSAkY3RMaXN0WyRpZHhdOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmKGNvdW50KCRjb21wYXJlVG9PcHRzKSA8PSAwKSB7DQoJCSRjb21wYXJlVG9PcHRzW10gPSAkY29tcGFyZVRvWzBdOw0KCX0NCg0KCS8vICoqIGluaXQgdmFyaWFibGVzDQoJJHdoZXJlID0gIiI7DQoJJGZpZWxkcyA9ICJpZCwgY2FwdGlvbiwgYWx0IjsNCgkkbWF0Y2hBcnJheSA9IGFycmF5KCk7DQoJJGF2b2lkQXJyYXkgPSBhcnJheSgpOw0KCSRtYXRjaFZhcnMgPSBhcnJheSgiP2MiLCAiP3MiLCAiP3QiLCAiP2lkIiwgIj9maWVsZCIpOw0KCSR3aGVyZUFORCA9IGFycmF5KCk7DQoNCgkvLyAqKiBwcm9jZXNzIG1hdGNoX3RleHQNCglpZiAoJG1hdGNoX3RleHQgIT0gIiIgKSB7DQoJCS8vIENvbnZlcnQgdGhlIHN0cmluZyBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCS8vIFByb2Nlc3MgdGhlIHNwZWNpYWwgKCc/c29tZXRoaW5nJykgY2FzZXMgdG9vLg0KCQkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkbWF0Y2hfdGV4dCwgJG1hdGNoVmFycywgJGlkX3ByZWZpeCk7DQoJCSRtYXRjaEFycmF5ID0gJHJldEFycmF5WzBdOw0KDQoJCS8vIE1ha2UgdXAgdGhlIFdIRVJFIHN0YXRlbWVudCBmcm9tIHRoZSBjb21iaW5lZCBsaXN0IG9mIG1hdGNoZXMuDQoJCS8vIFRoZSBjYXRlZ29yaWVzL2ltYWdlIElEcyBhcmUgT1JlZCB0b2dldGhlciBpbiBicmFja2V0cyBmaXJzdA0KCQkvLyBiZWZvcmUgdGhlIG5lZ2F0aW9uIG9wdGlvbnMgYXJlIHRhY2tlZCBvbiBhcyBBTkRzIGFmdGVyd2FyZHMNCgkJJHdoZXJlVG1wID0gIiI7DQoJCSR3aGVyZU9SID0gYXJyYXkoKTsNCg0KCQlpZiAoY291bnQoJG1hdGNoQXJyYXkpID4gMCkgew0KCQkJZm9yZWFjaCAoJGNvbXBhcmVUb09wdHMgYXMgJGNvbXApIHsNCgkJCQkkaG9sZCA9IGFycmF5KCk7DQoJCQkJZm9yICgkaWR4ID0gY291bnQoJG1hdGNoQXJyYXkpOyAkaWR4ID49MDsgJGlkeC0tKSB7DQoJCQkJCWlmIChlbXB0eSgkbWF0Y2hBcnJheVskaWR4XSkpIHsNCgkJCQkJCXVuc2V0KCRtYXRjaEFycmF5WyRpZHhdKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRob2xkW10gPSAkY29tcCAuICIgTElLRSAnJSIgLiRtYXRjaEFycmF5WyRpZHhdLiAiJSciOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCSR3aGVyZVRtcCA9IGltcGxvZGUoIiBPUiAiLCRob2xkKTsNCg0KCQkJCWlmICh0cmltKCR3aGVyZVRtcCkgIT0gIiIpIHsNCgkJCQkJJHdoZXJlT1JbXSA9ICR3aGVyZVRtcDsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZiAoY291bnQoJHdoZXJlT1IpID4gMCkgew0KCQkJJHdoZXJlQU5EW10gPSAnKCcgLmltcGxvZGUoIiBPUiAiLCR3aGVyZU9SKS4gJyknOw0KCQl9DQoJfQ0KDQoJLy8gKiogZG8gdGhlIHNhbWUgZm9yIGF2b2lkX3RleHQNCglpZiAoJGF2b2lkX3RleHQgIT0gIiIgKSB7DQoJCS8vIENvbnZlcnQgdGhlIHN0cmluZyBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCS8vIFByb2Nlc3MgdGhlIHNwZWNpYWwgKCc/c29tZXRoaW5nJykgY2FzZXMgdG9vLg0KCQkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkYXZvaWRfdGV4dCwgJG1hdGNoVmFycywgJGlkX3ByZWZpeCk7DQoJCSRhdm9pZEFycmF5ID0gJHJldEFycmF5WzBdOw0KDQoJCS8vIE1ha2UgdXAgdGhlIFdIRVJFIHN0YXRlbWVudCBmcm9tIHRoZSBjb21iaW5lZCBsaXN0IG9mIE5PVCBtYXRjaGVzLg0KCQkkd2hlcmVUbXAgPSAiIjsNCgkJJHdoZXJlT1IgPSBhcnJheSgpOw0KDQoJCWlmIChjb3VudCgkYXZvaWRBcnJheSkgPiAwKSB7DQoJCQlmb3JlYWNoICgkY29tcGFyZVRvT3B0cyBhcyAkY29tcCkgew0KCQkJCSRob2xkID0gYXJyYXkoKTsNCgkJCQlmb3IgKCRpZHggPSBjb3VudCgkYXZvaWRBcnJheSk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQkJaWYgKGVtcHR5KCRhdm9pZEFycmF5WyRpZHhdKSkgew0KCQkJCQkJdW5zZXQoJGF2b2lkQXJyYXlbJGlkeF0pOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGhvbGRbXSA9ICRjb21wIC4gIiBMSUtFICclIiAuJGF2b2lkQXJyYXlbJGlkeF0uICIlJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHdoZXJlVG1wID0gaW1wbG9kZSgiIE9SICIsJGhvbGQpOw0KDQoJCQkJaWYgKHRyaW0oJHdoZXJlVG1wKSAhPSAiIikgew0KCQkJCQkkd2hlcmVPUltdID0gJHdoZXJlVG1wOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPUikgPiAwKSB7DQoJCQkkd2hlcmVBTkRbXSA9ICdOT1QgKCcgLmltcGxvZGUoIiBPUiAiLCR3aGVyZU9SKS4gJyknOw0KCQl9DQoJfQ0KDQoJLy8gV29yayBvdXQgdGhlIGltYWdlIGNhdGVnb3JpZXMgdG8gc2VhcmNoDQoJJGNhdHNpbiA9IGFycmF5KCk7DQoJJGZ1bGxDYXRMaXN0ID0gYXJyYXkoKTsNCgkkbm90Q2F0TGlzdCA9IGFycmF5KCk7DQoJJGNhdFZhcnMgPSBhcnJheSgiP2MiLCI/aWQiLCI/cyIsIj90IiwiP2ZpZWxkIiwiIWMiLCIhaWQiLCIhcyIsIiF0IiwiIWZpZWxkIik7DQoNCgkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkY2F0ZWdvcnksICRjYXRWYXJzLCAkaWRfcHJlZml4KTsNCgkkZnVsbENhdExpc3QgPSAkcmV0QXJyYXlbMF07DQoJJG5vdENhdExpc3QgPSAkcmV0QXJyYXlbMV07DQoNCgkvLyBpbmNsdWRlZCBjYXRlZ29yaWVzDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbENhdExpc3QpOyAkaWR4KyspIHsNCgkJaWYgKCRzdWJjYXRzKSB7DQoJCQkkY2F0ZWdzID0gc21kX2dldFN1YkNhdHMoJGZ1bGxDYXRMaXN0WyRpZHhdLCdpbWFnZScpOw0KCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkdG1wYVtdID0gIiciIC4kZnVsbENhdExpc3RbJGlkeF0uICInIjsNCgkJfQ0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkY2F0c2luW10gPSAiY2F0ZWdvcnkgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgl9DQoNCgkvLyBleGNsdWRlZCBjYXRlZ29yaWVzDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90Q2F0TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoJHN1YmNhdHMpIHsNCgkJCSRjYXRlZ3MgPSBzbWRfZ2V0U3ViQ2F0cygkbm90Q2F0TGlzdFskaWR4XSwnaW1hZ2UnKTsNCgkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJaWYgKCRjYXRlZ3NbJGpkeF1bJ25hbWUnXSAhPSAicm9vdCIpIHsNCgkJCQkJJHRtcGFbXSA9ICInIiAuJGNhdGVnc1skamR4XVsnbmFtZSddLiAiJyI7DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJJHRtcGFbXSA9ICInIiAuJG5vdENhdExpc3RbJGlkeF0uICInIjsNCgkJfQ0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkY2F0c2luW10gPSAiY2F0ZWdvcnkgTk9UIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJfQ0KDQoJaWYgKCgkY2F0ZWdvcnkgPT0gIiUiKSB8fCAoY291bnQoJGNhdHNpbikgPD0gMCkpIHsNCgkJJHdoZXJlQ2F0ID0gImNhdGVnb3J5IExJS0UgJyUnIjsNCgl9IGVsc2Ugew0KCQkkd2hlcmVDYXQgPSBpbXBsb2RlKCIgQU5EICIsICRjYXRzaW4pOw0KCX0NCg0KCS8vICoqIG1ha2UgdXAgdGhlIGZpbmFsIFdIRVJFIHN0YXRlbWVudA0KCSR3aGVyZU9CID0gIiBPUkRFUiBCWSBSQU5EKCkgTElNSVQgJGxpbWl0IjsNCgkkd2hlcmUgPSAkd2hlcmVDYXQgLiAoKGNvdW50KCR3aGVyZUFORCk+MCkgPyAiIEFORCAiIC5pbXBsb2RlKCIgQU5EICIsJHdoZXJlQU5EKSA6ICIiKSAuICR3aGVyZU9COw0KDQoJLy8gKiogcHVsbCBvdXQgdGhlIHJlcXVlc3RlZCBpbWFnZXMNCgkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSk7DQoJaWYgKCEkcnMpIHsNCgkJaWYgKCRhbHdheXNfZGlzcGxheSkgew0KCQkJJHJzID0gc2FmZV9yb3dzKCRmaWVsZHMsICd0eHBfaW1hZ2UnLCAkd2hlcmVDYXQgLiAkd2hlcmVPQik7DQoJCX0NCgl9DQoNCgkvLyAqKiBkaXNwbGF5IHRoZW0NCgkkc3RhdGljcHJlZml4ID0gImh0dHA6Ly8iOw0KCSRvdXRTdHIgPSAnJzsNCglpZigkcnMpIHsNCgkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJJGxpbmtOYW1lPXRyaW0oKCRsaW5rX2luPT0iYWx0IikgPyAkcm93WydhbHQnXSA6ICgoJGxpbmtfaW49PSJjYXB0aW9uIikgPyAkcm93WydjYXB0aW9uJ10gOiAiIikpOw0KCQkJJGxpbmt1cmwgPSAnJzsNCg0KCQkJLy8gKiogaGFuZGxlIGxpbmtzDQoJCQlpZiAoc3RybGVuKCRsaW5rTmFtZSkgPiAwKSB7DQoJCQkJaWYgKHN1YnN0cigkbGlua05hbWUsIDAsIHN0cmxlbigkc3RhdGljcHJlZml4KSkgPT09ICRzdGF0aWNwcmVmaXgpIHsNCgkJCQkJJGxpbmtUeXBlID0gIkZVTEwiOw0KCQkJCX0gZWxzZSBpZiAoJGxpbmtOYW1lWzBdID09ICcvJykgew0KCQkJCQlpZiAoJGxpbmtfcHJlZml4ID09ICcnKSB7DQoJCQkJCQkkbGlua1R5cGUgPSAiUk9PVF9OT19QUkVGSVgiOw0KCQkJCQl9IGVsc2UgaWYgKHN1YnN0cigkbGlua19wcmVmaXgsIDAsIHN0cmxlbigkc3RhdGljcHJlZml4KSkgPT09ICRzdGF0aWNwcmVmaXgpIHsNCgkJCQkJCSRsaW5rVHlwZSA9ICJGVUxMX1BSRUZJWCI7DQoJCQkJCX0gZWxzZSBpZiAoJGxpbmtfcHJlZml4WzBdID09ICcvJykgew0KCQkJCQkJJGxpbmtUeXBlID0gIlJPT1QiOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJGxpbmtUeXBlID0gIlJFTEFUSVZFIjsNCgkJCQkJfQ0KCQkJCX0gZWxzZSBpZiAoJGxpbmtfcHJlZml4ID09ICcnKSB7DQoJCQkJCSRsaW5rVHlwZSA9ICJSRUxBVElWRSI7DQoJCQkJfSBlbHNlIGlmICgkbGlua19wcmVmaXhbMF0gPT0gJy8nKSB7DQoJCQkJCSRsaW5rVHlwZSA9ICJST09UIjsNCgkJCQl9IGVsc2UgaWYgKHN1YnN0cigkbGlua19wcmVmaXgsIDAsIHN0cmxlbigkc3RhdGljcHJlZml4KSkgPT09ICRzdGF0aWNwcmVmaXgpIHsNCgkJCQkJJGxpbmtUeXBlID0gIkZVTExfUFJFRklYIjsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkbGlua1R5cGUgPSAiUkVMQVRJVkUiOw0KCQkJCX0NCgkJCQlzd2l0Y2ggKCRsaW5rVHlwZSkgew0KCQkJCQljYXNlICJGVUxMIjoNCgkJCQkJCSRsaW5rdXJsID0gJGxpbmtOYW1lOw0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgIlJPT1RfTk9fUFJFRklYIjoNCgkJCQkJCSRsaW5rdXJsID0gc2l0ZV91cmwoJGF0dHMpIC4gc3Vic3RyKCRsaW5rTmFtZSwxKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJST09UIjoNCgkJCQkJCSRsaW5rdXJsID0gc2l0ZV91cmwoJGF0dHMpIC4gc3Vic3RyKCRsaW5rX3ByZWZpeCwxKSAuICRsaW5rTmFtZTsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICJSRUxBVElWRSI6DQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQkkbGlua3VybCA9ICRsaW5rX3ByZWZpeCAuICRsaW5rTmFtZTsNCgkJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJCS8vICoqIHRocm93IGltYWdlIG91dCB0byB0aGUgcGFnZQ0KCQkJJGltZ09wdGlvbnMgPSBhcnJheSgiaWQiID0+ICRyb3dbJ2lkJ10pOw0KCQkJaWYgKCRpbWdjbGFzcyAhPSAnJykgew0KCQkJCSRpbWdPcHRpb25zWyJjbGFzcyJdID0gJGltZ2NsYXNzOw0KCQkJfQ0KCQkJaWYgKCgkbGlua19pbiAhPSAiIikgJiYgKHN0cmxlbigkbGlua3VybCkgPiAwKSkgew0KCQkJCWlmICgkcmVmZXJlciAhPSAiIikgew0KCQkJCQkkcmVmZXJ0eHQgPSBzbWRfYWRkUVNWYXIoJGxpbmt1cmwsICRyZWZlcmVyLCAkcm93WydpZCddKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcmVmZXJ0eHQgPSAkbGlua3VybDsNCgkJCQl9DQoJCQkJJG91dFN0ciAuPSAnPGEgaHJlZj0iJyAuJHJlZmVydHh0LiAnIj4nIC4gKCgkdGh1bWIpID8gdGh1bWJuYWlsKCRpbWdPcHRpb25zKSA6IGltYWdlKCRpbWdPcHRpb25zKSkuICc8L2E+JzsNCgkJCX0gZWxzZSB7DQoJCQkJJG91dFN0ciAuPSAoKCR0aHVtYikgPyB0aHVtYm5haWwoJGltZ09wdGlvbnMpIDogaW1hZ2UoJGltZ09wdGlvbnMpKTsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybjsNCgl9DQoNCglyZXR1cm4gJG91dFN0cjsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiMDRjYWMzZjIwZDA2ZDJhM2JjZjI5MTZjMTYyMWRhYjAiO30=