<?php
/* VPOX Clean Installer V18 - real layout diversity, MU guard only on failure */
@ini_set('display_errors','1'); @ini_set('display_startup_errors','1'); @ini_set('memory_limit','768M'); @set_time_limit(28); error_reporting(E_ALL);
define('VPOX_PAYLOAD_B64','eyJ2ZXJzaW9uIjoiY2xlYW4td3BvcmctcmVhbC1wYXJlbnQtZGlyZWN0LXYxOC1yZWFsLWxheW91dC1kaXZlcnNpdHkiLCJkb21haW4iOiJoaWphdWlkcm9zZS5jb20iLCJzaXRlX3VybCI6Imh0dHBzOi8vaGlqYXVpZHJvc2UuY29tIiwiYnJhbmQiOiJIaWphdWlkcm9zZSIsIm5pY2hlIjoiTG9jYWwgR3VpZGUiLCJzaXRlX3Byb2ZpbGUiOiJzaG9wIiwicHJvZmlsZV9sYWJlbCI6IlNob3AgY2F0YWxvZyIsInZpc3VhbF92YXJpYW50IjoiY2F0YWxvZyIsInRvbmVfdmFyaWFudCI6ImNyZWF0aXZlIiwiY29udGFjdCI6eyJlbWFpbCI6ImhlbGxvQGhpamF1aWRyb3NlLmNvbSIsInBob25lIjoiKzEgNDUyIDMzMSA1MDI5IiwiYWRkcmVzcyI6IjYxNiBIaWxsY3Jlc3QgUm9hZCwgUmFsZWlnaCwgTkMifSwicGFyZW50X3RoZW1lIjp7InNsdWciOiJwcm9mZXNzaW9uYWwtdmlkZW8tdmxvZ2dlciIsIm5hbWUiOiJQcm9mZXNzaW9uYWwgVmlkZW8gVmxvZ2dlciIsImRvd25sb2FkX2xpbmsiOiJodHRwczovL2Rvd25sb2Fkcy53b3JkcHJlc3Mub3JnL3RoZW1lL3Byb2Zlc3Npb25hbC12aWRlby12bG9nZ2VyLmxhdGVzdC1zdGFibGUuemlwIiwic2NyZWVuc2hvdF91cmwiOiIvL3RzLncub3JnL3dwLWNvbnRlbnQvdGhlbWVzL3Byb2Zlc3Npb25hbC12aWRlby12bG9nZ2VyL3NjcmVlbnNob3QucG5nP3Zlcj02LjEuNCIsInJhdGluZyI6MCwiZG93bmxvYWRlZCI6MTg3NzAsImRlc2NyaXB0aW9uIjoiUHJvZmVzc2lvbmFsIFZpZGVvIFZsb2dnZXIgaXMgYSBwcmVtaXVtIFdvcmRQcmVzcyB0aGVtZSB0aG91Z2h0ZnVsbHkgZGVzaWduZWQgZm9yIHZpZGVvIGJsb2dnaW5nLCBwb2RjYXN0aW5nLCB2aWRlbyBjb3Vyc2VzLCBhbmQgdmlyYWwgdmlkZW8gc2hhcmluZyBwbGF0Zm9ybXMsIG1ha2luZyBpdCBhbiBleGNlbGxlbnQgY2hvaWNlIGZvciBhbnlvbmUgZm9jdXNlZCBvbiBjcmVhdGluZyBhbmQgc2hvd2Nhc2luZyB2aWRlbyBjb250ZW50LiBJdCBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggbWFqb3IgdmlkZW8gcGxhdGZvcm1zIGxpa2UgWW91VHViZSwgVmltZW8sIGFuZCBEYWlseW1vdGlvbiwgZW5zdXJpbmcgc2VhbWxlc3MgaW50ZWdyYXRpb24gYW5kIGZsZXhpYmlsaXR5IGZvciBwdWJsaXNoaW5nIGVuZ2FnaW5nIHZpZGVvIGV4cGVyaWVuY2VzLiBUaGUgdGhlbWUgcHJvdmlkZXMgZXh0ZW5zaXZlIGN1c3RvbWl6YXRpb24gb3B0aW9ucywgYWxsb3dpbmcgdXNlcnMgdG8gYWRhcHQgZmVhdHVyZXMgZm9yIGEgd2lkZSByYW5nZSBvZiBuaWNoZXMgc3VjaCBhcyBjbGFzc2ljIGJsb2dzLCBjcmVhdGl2ZSBwb3J0Zm9saW9zLCBmYXNoaW9uLCBmb29kLCBhbmQgbGlmZXN0eWxlLiBXaXRoIGFkdmFuY2VkIHBlcnNvbmFsaXphdGlvbiB0b29scyBhbmQgdHJhbnNsYXRpb24tcmVhZHkgZnVuY3Rpb25hbGl0eSwgUHJvZmVzc2lvbmFsIFZpZGVvIFZsb2dnZXIgaGVscHMgeW91IHJlYWNoIGEgZ2xvYmFsIGF1ZGllbmNlIHdpdGggZWFzZS4gSXRzIGZ1bGx5IHJlc3BvbnNpdmUgYW5kIG1vYmlsZS1mcmllbmRseSBkZXNpZ24gZ3VhcmFudGVlcyBhIHNtb290aCBhbmQgY29uc2lzdGVudCB2aWRlbyB2aWV3aW5nIGV4cGVyaWVuY2UgYWNyb3NzIGFsbCBkZXZpY2VzLCBpbmNsdWRpbmcgc21hcnRwaG9uZXMsIHRhYmxldHMsIGFuZCBkZXNrdG9wcy4gQWRkaXRpb25hbGx5LCB0aGUgdGhlbWUgaW50ZWdyYXRlcyB3aXRoIFdvb0NvbW1lcmNlIGFuZCBpcyBvcHRpbWl6ZWQgZm9yIFNFTywgZW5hYmxpbmcgYmV0dGVyIHNlYXJjaCBlbmdpbmUgdmlzaWJpbGl0eSBhbmQgZWZmb3J0bGVzcyBtYW5hZ2VtZW50IG9mIGUtY29tbWVyY2UgZmVhdHVyZXMuIEl0IGFsc28gaW5jbHVkZXMgc29jaWFsIG1lZGlhIGludGVncmF0aW9uLCBvcHRpbWl6ZWQgY29kZSBmb3IgZmFzdGVyIGxvYWRpbmcgc3BlZWRzLCBhbmQgYSBjbGVhbiwgc2VjdXJlIGNvZGViYXNlLCBlbnN1cmluZyBoaWdoIHBlcmZvcm1hbmNlLiBXaGV0aGVyIHlvdXIgZm9jdXMgaXMgb24gYWR2ZW50dXJlLCBwZXJzb25hbCBibG9nZ2luZywgdG91cmlzbSwgb3IgYW55IG90aGVyIG5pY2hlLCBQcm9mZXNzaW9uYWwgVmlkZW8gVmxvZ2dlciBvZmZlcnMgYSBjb21wbGV0ZSBhbmQgZW5nYWdpbmcgc29sdXRpb24gZm9yIGJ1aWxkaW5nIGEgcG93ZXJmdWwgdmlkZW8tYmFzZWQgd2Vic2l0ZS4iLCJ0YWdzIjp7ImJsb2ciOiJCbG9nIiwiY3VzdG9tLWJhY2tncm91bmQiOiJDdXN0b20gYmFja2dyb3VuZCIsImN1c3RvbS1jb2xvcnMiOiJDdXN0b20gY29sb3JzIiwiY3VzdG9tLWhlYWRlciI6IkN1c3RvbSBoZWFkZXIiLCJjdXN0b20tbG9nbyI6IkN1c3RvbSBsb2dvIiwiY3VzdG9tLW1lbnUiOiJDdXN0b20gbWVudSIsImVkaXRvci1zdHlsZSI6IkVkaXRvciBzdHlsZSIsImZlYXR1cmVkLWltYWdlLWhlYWRlciI6IkZlYXR1cmVkIGltYWdlIGhlYWRlciIsImZlYXR1cmVkLWltYWdlcyI6IkZlYXR1cmVkIGltYWdlcyIsImZvb3Rlci13aWRnZXRzIjoiRm9vdGVyIHdpZGdldHMiLCJmb3VyLWNvbHVtbnMiOiJGb3VyIGNvbHVtbnMiLCJmdWxsLXdpZHRoLXRlbXBsYXRlIjoiRnVsbCB3aWR0aCB0ZW1wbGF0ZSIsImdyaWQtbGF5b3V0IjoiR3JpZCBsYXlvdXQiLCJsZWZ0LXNpZGViYXIiOiJMZWZ0IHNpZGViYXIiLCJvbmUtY29sdW1uIjoiT25lIGNvbHVtbiIsInBob3RvZ3JhcGh5IjoiUGhvdG9ncmFwaHkiLCJwb3J0Zm9saW8iOiJQb3J0Zm9saW8iLCJwb3N0LWZvcm1hdHMiOiJQb3N0IGZvcm1hdHMiLCJyaWdodC1zaWRlYmFyIjoiUmlnaHQgc2lkZWJhciIsInN0aWNreS1wb3N0IjoiU3RpY2t5IHBvc3QiLCJ0aGVtZS1vcHRpb25zIjoiVGhlbWUgb3B0aW9ucyIsInRocmVhZGVkLWNvbW1lbnRzIjoiVGhyZWFkZWQgY29tbWVudHMiLCJ0aHJlZS1jb2x1bW5zIjoiVGhyZWUgY29sdW1ucyIsInRyYW5zbGF0aW9uLXJlYWR5IjoiVHJhbnNsYXRpb24gcmVhZHkiLCJ0d28tY29sdW1ucyI6IlR3byBjb2x1bW5zIiwid2lkZS1ibG9ja3MiOiJXaWRlIGJsb2NrcyJ9LCJzY29yZSI6MzIsImhvbWVfbW9kZSI6ImFydGljbGUifSwiYWx0ZXJuYXRlX3RoZW1lcyI6W3sic2x1ZyI6InJlc3BvbnNpdmUiLCJuYW1lIjoiUmVzcG9uc2l2ZSIsImRvd25sb2FkX2xpbmsiOiJodHRwczovL2Rvd25sb2Fkcy53b3JkcHJlc3Mub3JnL3RoZW1lL3Jlc3BvbnNpdmUubGF0ZXN0LXN0YWJsZS56aXAiLCJzY3JlZW5zaG90X3VybCI6IiIsInJhdGluZyI6MCwiZG93bmxvYWRlZCI6MCwiZGVzY3JpcHRpb24iOiIiLCJ0YWdzIjpbXSwic2NvcmUiOjIwMCwiaG9tZV9tb2RlIjoibWl4ZWQifSx7InNsdWciOiJwYWdlLWJ1aWxkZXItZnJhbWV3b3JrIiwibmFtZSI6IlBhZ2UgQnVpbGRlciBGcmFtZXdvcmsiLCJkb3dubG9hZF9saW5rIjoiaHR0cHM6Ly9kb3dubG9hZHMud29yZHByZXNzLm9yZy90aGVtZS9wYWdlLWJ1aWxkZXItZnJhbWV3b3JrLmxhdGVzdC1zdGFibGUuemlwIiwic2NyZWVuc2hvdF91cmwiOiIiLCJyYXRpbmciOjAsImRvd25sb2FkZWQiOjAsImRlc2NyaXB0aW9uIjoiIiwidGFncyI6W10sInNjb3JlIjoyMDAsImhvbWVfbW9kZSI6Im1peGVkIn0seyJzbHVnIjoic2luYXRyYSIsIm5hbWUiOiJTaW5hdHJhIiwiZG93bmxvYWRfbGluayI6Imh0dHBzOi8vZG93bmxvYWRzLndvcmRwcmVzcy5vcmcvdGhlbWUvc2luYXRyYS5sYXRlc3Qtc3RhYmxlLnppcCIsInNjcmVlbnNob3RfdXJsIjoiIiwicmF0aW5nIjowLCJkb3dubG9hZGVkIjowLCJkZXNjcmlwdGlvbiI6IiIsInRhZ3MiOltdLCJzY29yZSI6MjAwLCJob21lX21vZGUiOiJtaXhlZCJ9LHsic2x1ZyI6ImNvbG9ybWFnIiwibmFtZSI6IkNvbG9yTWFnIiwiZG93bmxvYWRfbGluayI6Imh0dHBzOi8vZG93bmxvYWRzLndvcmRwcmVzcy5vcmcvdGhlbWUvY29sb3JtYWcubGF0ZXN0LXN0YWJsZS56aXAiLCJzY3JlZW5zaG90X3VybCI6IiIsInJhdGluZyI6MCwiZG93bmxvYWRlZCI6MCwiZGVzY3JpcHRpb24iOiIiLCJ0YWdzIjpbXSwic2NvcmUiOjIwMCwiaG9tZV9tb2RlIjoibWl4ZWQifSx7InNsdWciOiJodWVtYW4iLCJuYW1lIjoiSHVlbWFuIiwiZG93bmxvYWRfbGluayI6Imh0dHBzOi8vZG93bmxvYWRzLndvcmRwcmVzcy5vcmcvdGhlbWUvaHVlbWFuLmxhdGVzdC1zdGFibGUuemlwIiwic2NyZWVuc2hvdF91cmwiOiIiLCJyYXRpbmciOjAsImRvd25sb2FkZWQiOjAsImRlc2NyaXB0aW9uIjoiIiwidGFncyI6W10sInNjb3JlIjoyMDAsImhvbWVfbW9kZSI6Im1peGVkIn1dLCJjaGlsZF9zbHVnIjoidnBveC1oaWphdWlkcm9zZS1jb20iLCJzZXR0aW5ncyI6eyJhcnRpY2xlX2NvdW50IjoxNiwiZ2VtaW5pX2tleSI6IkFRLkFiOFJONkl2clhWOUJVWGV6U1RNX3VhT0JDYlk1NWN1SGZLZ3hzSDJjMDlyR1pYamZBIiwicGl4YWJheV9rZXkiOiI1NjE2MTkzMC03NmJhNTczMmE2MWUwMjY3OGYyY2RiZmM0Iiwid3BfY2h1bmsiOjEwNDg1NzYsImV4dHJhY3RfYmF0Y2giOjEyMCwicG9zdF9iYXRjaCI6MSwiZGF0ZV9zdGFydCI6IjIwMTYtMDEtMDEgMDA6MDA6MDEiLCJkYXRlX2VuZCI6IjIwMjYtMDktMjAgMjM6NTk6NTkifSwicG9zdHMiOlt7InRpdGxlIjoiSG93IHRvIHRoaW5rIGNsZWFybHkgYWJvdXQgcHJlcGFyaW5nIGEgYnV5aW5nIGd1aWRlIiwiY2F0ZWdvcnkiOiJFZGl0b3JpYWwiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCBmaWVsZF9ub3RlIGFydGljbGUgYWJvdXQgcHJlcGFyaW5nIGEgYnV5aW5nIGd1aWRlIGZvciByZWFkZXJzIGludGVyZXN0ZWQgaW4gTG9jYWwgR3VpZGUuIiwiY29udGVudCI6IjxwPjxzdHJvbmc+SGlqYXVpZHJvc2U8L3N0cm9uZz4gcHVibGlzaGVzIHRoaXMgYXJ0aWNsZSBmb3IgcmVhZGVycyB3aG8gbmVlZCBtb3JlIHRoYW4gYSBxdWljayBhbnN3ZXIgYWJvdXQgcHJlcGFyaW5nIGEgYnV5aW5nIGd1aWRlLiBUaGUgYWltIGlzIHRvIGV4cGxhaW4gdGhlIHRvcGljIHNsb3dseSwgc2hvdyB3aGVyZSBtaXN0YWtlcyB1c3VhbGx5IGhhcHBlbiwgYW5kIGdpdmUgdGhlIHJlYWRlciBhIHVzYWJsZSBtZXRob2QgdGhhdCBjYW4gYmUgY2hlY2tlZCBhZ2FpbiBsYXRlci48L3A+PGgyPk9ic2VydmF0aW9uIG9uZTwvaDI+PHA+UGVvcGxlIG9mdGVuIGJlZ2luIHdpdGggYSBicm9hZCBzZWFyY2ggYW5kIHRoZW4gc2F2ZSB0b28gbWFueSBzaW1pbGFyIHBhZ2VzLiBUaGUgdXNlZnVsIHN0ZXAgaXMgdG8gZ3JvdXAgdGhvc2UgcGFnZXMgYnkgcHVycG9zZTogZXhwbGFuYXRpb24sIGNvbXBhcmlzb24sIGV4YW1wbGUsIGFuZCBjb250YWN0LjwvcD48aDI+T2JzZXJ2YXRpb24gdHdvPC9oMj48cD5TcGVjaWZpYyBleGFtcGxlcyBhcmUgbW9yZSB2YWx1YWJsZSB0aGFuIGdlbmVyaWMgY2xhaW1zLiBJZiBhbiBhcnRpY2xlIGV4cGxhaW5zIGhvdyBhIGNob2ljZSB3b3JrcyBpbiBvbmUgcmVhbGlzdGljIHNpdHVhdGlvbiwgdGhlIHJlYWRlciBjYW4gYWRhcHQgdGhhdCBsZXNzb24gbW9yZSBlYXNpbHkuPC9wPjxoMj5PYnNlcnZhdGlvbiB0aHJlZTwvaDI+PHA+VGhlIGJlc3QgcGFnZXMgbGVhdmUgcm9vbSBmb3IgZG91YnQuIFRoZXkgZXhwbGFpbiB3aGF0IGlzIGtub3duLCB3aGF0IGlzIHVuY2xlYXIsIGFuZCB3aGF0IHNob3VsZCBiZSBjaGVja2VkIGFnYWluIGJlZm9yZSBtYWtpbmcgYSBmaW5hbCBkZWNpc2lvbi48L3A+PGgyPkZpbmFsIHByYWN0aWNhbCBub3RlczwvaDI+PHA+Rm9yIHJlYWRlcnMgb2YgSGlqYXVpZHJvc2UsIHRoZSBtb3N0IHVzZWZ1bCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNwZWNpZmljLiBBIHNwZWNpZmljIG5vdGUgaXMgZWFzaWVyIHRvIHZlcmlmeSwgZWFzaWVyIHRvIHVwZGF0ZSwgYW5kIGVhc2llciB0byBjb25uZWN0IHdpdGggcmVsYXRlZCBhcnRpY2xlcyBpbiB0aGUgRWRpdG9yaWFsIHNlY3Rpb24uPC9wPjxoMj5TaWduYWxzIG9mIGEgdHJ1c3R3b3J0aHkgcmVzb3VyY2U8L2gyPjxwPkEgdHJ1c3R3b3J0aHkgcmVzb3VyY2UgaXMgc3BlY2lmaWMuIEl0IGV4cGxhaW5zIGxpbWl0cywgdXNlcyBleGFtcGxlcywgYW5kIGF2b2lkcyBwcm9taXNpbmcgdGhhdCBvbmUgc29sdXRpb24gZml0cyBldmVyeSBzaXR1YXRpb24uIFdoZW4gYSByZWFkZXIgY29tcGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgTG9jYWwgR3VpZGUsIHRoZXNlIHNpZ25hbHMgbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcGFnZSB0aGF0IGxvb2tzIGNvbXBsZXRlIGFuZCBhIHBhZ2UgdGhhdCBhY3R1YWxseSBoZWxwcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkhvdyB0byBhcHBseSB0aGUgaWRlYSBpbiBub3JtYWwgdXNlPC9oMj48cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgYXJ0aWNsZSBpcyB0byB0dXJuIGl0IGludG8gYSBzbWFsbCBhY3Rpb24gbGlzdC4gU2F2ZSB0aGUgc3Ryb25nZXN0IHBvaW50LCBjb21wYXJlIGl0IHdpdGggb25lIG90aGVyIHNvdXJjZSwgdGhlbiBkZWNpZGUgd2hldGhlciB0aGUgYWR2aWNlIHN0aWxsIGZpdHMgdGhlIHJlYWRlciBnb2FsLiBUaGF0IG1ldGhvZCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gcHJhY3RpY2FsIGV2ZW4gd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPldoYXQgdG8gcmV2aWV3IGxhdGVyPC9oMj48cD5PbGRlciBub3RlcyBjYW4gc3RheSB1c2VmdWwgd2hlbiB0aGV5IGFyZSByZXZpZXdlZC4gRGF0ZXMsIGV4YW1wbGVzLCBsaW5rcywgcHJpY2VzLCBuYW1lcywgYW5kIGNvbnRhY3QgZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBmcm9tIHRpbWUgdG8gdGltZS4gSGlqYXVpZHJvc2UgdHJlYXRzIHRoaXMga2luZCBvZiByZXZpZXcgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYmVjYXVzZSBhIHBhZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGNhbiBzbG93bHkgYmVjb21lIGxlc3MgaGVscGZ1bC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkEgYmFsYW5jZWQgY2xvc2luZyBub3RlPC9oMj48cD5UaGUgcHVycG9zZSBvZiB0aGlzIGFydGljbGUgaXMgbm90IHRvIG1ha2UgdGhlIHRvcGljIGxvb2sgY29tcGxpY2F0ZWQuIFRoZSBwdXJwb3NlIGlzIHRvIHNsb3cgdGhlIHJlYWRlciBkb3duIGVub3VnaCB0byBtYWtlIGEgYmV0dGVyIGNob2ljZS4gQSBjbGVhciBhcnRpY2xlIGdpdmVzIGNvbnRleHQsIHNob3dzIHRyYWRlLW9mZnMsIGFuZCBsZWF2ZXMgdGhlIHZpc2l0b3Igd2l0aCBhIG5leHQgc3RlcCB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiRWRpdG9yaWFsIiwiZmllbGRfbm90ZSIsInByZXBhcmluZyBhIGJ1eWluZyBndWlkZSIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgcHJlcGFyaW5nIGEgYnV5aW5nIGd1aWRlIGZpZWxkIG5vdGUiLCJoYXNoIjoiYjgxMzE1ZjIwNWI1NjE4MjI0OWJmNTU5YWZiMTY2OTM0Yjk2OGU5OCJ9LHsidGl0bGUiOiJBIGRpZmZlcmVudCB3YXkgdG8gYXBwcm9hY2ggdHVybmluZyBub3RlcyBpbnRvIGFjdGlvbiIsImNhdGVnb3J5IjoiQ29tcGFyaXNvbnMiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCBzdGVwcyBhcnRpY2xlIGFib3V0IHR1cm5pbmcgbm90ZXMgaW50byBhY3Rpb24gZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+U29tZSB0b3BpY3MgbG9vayBzaW1wbGUgdW50aWwgYSByZWFkZXIgdHJpZXMgdG8gdXNlIHRoZW0uIHR1cm5pbmcgbm90ZXMgaW50byBhY3Rpb24gaXMgb25lIG9mIHRob3NlIGFyZWFzIHdoZXJlIGEgc2hvcnQgcGFyYWdyYXBoIGlzIHJhcmVseSBlbm91Z2gsIGJlY2F1c2UgdGhlIHVzZWZ1bCBhbnN3ZXIgZGVwZW5kcyBvbiBjb250ZXh0LCB0aW1pbmcsIGFuZCB0aGUgcXVhbGl0eSBvZiB0aGUgYXZhaWxhYmxlIGluZm9ybWF0aW9uLjwvcD48aDI+U3RlcCAxOiBkZWZpbmUgdGhlIG91dGNvbWU8L2gyPjxwPldyaXRlIHRoZSBvdXRjb21lIGluIHBsYWluIGxhbmd1YWdlLiBBIGNsZWFyIG91dGNvbWUga2VlcHMgdGhlIHJlc3Qgb2YgdGhlIHJlc2VhcmNoIGZvY3VzZWQgYW5kIHByZXZlbnRzIHRoZSByZWFkZXIgZnJvbSBjaGFzaW5nIHVucmVsYXRlZCBkZXRhaWxzLjwvcD48aDI+U3RlcCAyOiBjb2xsZWN0IHVzZWZ1bCBtYXRlcmlhbDwvaDI+PHA+U2F2ZSBleGFtcGxlcywgZGF0ZXMsIGNvbnRhY3QgcGFnZXMsIHByaWNlcywgaW5zdHJ1Y3Rpb25zLCBhbmQgY29tcGFyaXNvbiBwb2ludHMgdGhhdCBhY3R1YWxseSBoZWxwIHRoZSBkZWNpc2lvbi4gUmVtb3ZlIHJlcGVhdGVkIG5vdGVzIGVhcmx5LjwvcD48aDI+U3RlcCAzOiBjb21wYXJlIGFuZCB0ZXN0PC9oMj48dWw+PGxpPkNvbXBhcmUgdGhlIHN0cm9uZ2VzdCBvcHRpb25zLjwvbGk+PGxpPlRlc3QgdGhlIGFkdmljZSBhZ2FpbnN0IG9uZSByZWFsIHNpdHVhdGlvbi48L2xpPjxsaT5LZWVwIGEgYmFja3VwIGNob2ljZS48L2xpPjxsaT5SZXZpZXcgdGhlIHJlc3VsdCBhZnRlciBhIHNob3J0IHRpbWUuPC9saT48L3VsPjxoMj5TdGVwIDQ6IGtlZXAgdGhlIHBhZ2UgdXNlZnVsPC9oMj48cD5Hb29kIGluZm9ybWF0aW9uIGFib3V0IHR1cm5pbmcgbm90ZXMgaW50byBhY3Rpb24gc2hvdWxkIGJlIGVhc3kgdG8gdXBkYXRlLiBBIHNob3J0IHJldmlldyBldmVyeSBmZXcgbW9udGhzIGNhbiBrZWVwIHRoZSBhcnRpY2xlIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHJlYWRlcnMuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIENvbXBhcmlzb25zIHNlY3Rpb24uPC9wPjxoMj5TaWduYWxzIG9mIGEgdHJ1c3R3b3J0aHkgcmVzb3VyY2U8L2gyPjxwPkEgdHJ1c3R3b3J0aHkgcmVzb3VyY2UgaXMgc3BlY2lmaWMuIEl0IGV4cGxhaW5zIGxpbWl0cywgdXNlcyBleGFtcGxlcywgYW5kIGF2b2lkcyBwcm9taXNpbmcgdGhhdCBvbmUgc29sdXRpb24gZml0cyBldmVyeSBzaXR1YXRpb24uIFdoZW4gYSByZWFkZXIgY29tcGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgTG9jYWwgR3VpZGUsIHRoZXNlIHNpZ25hbHMgbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcGFnZSB0aGF0IGxvb2tzIGNvbXBsZXRlIGFuZCBhIHBhZ2UgdGhhdCBhY3R1YWxseSBoZWxwcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkhvdyB0byBhcHBseSB0aGUgaWRlYSBpbiBub3JtYWwgdXNlPC9oMj48cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgYXJ0aWNsZSBpcyB0byB0dXJuIGl0IGludG8gYSBzbWFsbCBhY3Rpb24gbGlzdC4gU2F2ZSB0aGUgc3Ryb25nZXN0IHBvaW50LCBjb21wYXJlIGl0IHdpdGggb25lIG90aGVyIHNvdXJjZSwgdGhlbiBkZWNpZGUgd2hldGhlciB0aGUgYWR2aWNlIHN0aWxsIGZpdHMgdGhlIHJlYWRlciBnb2FsLiBUaGF0IG1ldGhvZCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gcHJhY3RpY2FsIGV2ZW4gd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPldoYXQgdG8gcmV2aWV3IGxhdGVyPC9oMj48cD5PbGRlciBub3RlcyBjYW4gc3RheSB1c2VmdWwgd2hlbiB0aGV5IGFyZSByZXZpZXdlZC4gRGF0ZXMsIGV4YW1wbGVzLCBsaW5rcywgcHJpY2VzLCBuYW1lcywgYW5kIGNvbnRhY3QgZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBmcm9tIHRpbWUgdG8gdGltZS4gSGlqYXVpZHJvc2UgdHJlYXRzIHRoaXMga2luZCBvZiByZXZpZXcgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYmVjYXVzZSBhIHBhZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGNhbiBzbG93bHkgYmVjb21lIGxlc3MgaGVscGZ1bC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkEgYmFsYW5jZWQgY2xvc2luZyBub3RlPC9oMj48cD5UaGUgcHVycG9zZSBvZiB0aGlzIGFydGljbGUgaXMgbm90IHRvIG1ha2UgdGhlIHRvcGljIGxvb2sgY29tcGxpY2F0ZWQuIFRoZSBwdXJwb3NlIGlzIHRvIHNsb3cgdGhlIHJlYWRlciBkb3duIGVub3VnaCB0byBtYWtlIGEgYmV0dGVyIGNob2ljZS4gQSBjbGVhciBhcnRpY2xlIGdpdmVzIGNvbnRleHQsIHNob3dzIHRyYWRlLW9mZnMsIGFuZCBsZWF2ZXMgdGhlIHZpc2l0b3Igd2l0aCBhIG5leHQgc3RlcCB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlJlYWRlciBxdWVzdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFuc3dlcjwvaDI+PHA+QSB1c2VmdWwgcGFnZSBzaG91bGQgYW5zd2VyIHRoZSBxdWVzdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHBhcmFncmFwaCwgbm90IG9ubHkgdGhlIHF1ZXN0aW9uIGluIHRoZSB0aXRsZS4gUmVhZGVycyB3YW50IHRvIGtub3cgd2hhdCBtYXR0ZXJzIGZpcnN0LCB3aGF0IGNhbiB3YWl0LCBhbmQgd2hpY2ggZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgdGFraW5nIGFjdGlvbi4gVGhpcyBzZWN0aW9uIGFkZHMgdGhvc2UgcHJhY3RpY2FsIGNoZWNrcyBzbyB0aGUgYXJ0aWNsZSB3b3JrcyBhcyBhIHJlZmVyZW5jZSByYXRoZXIgdGhhbiBhIHNob3J0IG5vdGUuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5TaWduYWxzIG9mIGEgdHJ1c3R3b3J0aHkgcmVzb3VyY2U8L2gyPjxwPkEgdHJ1c3R3b3J0aHkgcmVzb3VyY2UgaXMgc3BlY2lmaWMuIEl0IGV4cGxhaW5zIGxpbWl0cywgdXNlcyBleGFtcGxlcywgYW5kIGF2b2lkcyBwcm9taXNpbmcgdGhhdCBvbmUgc29sdXRpb24gZml0cyBldmVyeSBzaXR1YXRpb24uIFdoZW4gYSByZWFkZXIgY29tcGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgTG9jYWwgR3VpZGUsIHRoZXNlIHNpZ25hbHMgbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcGFnZSB0aGF0IGxvb2tzIGNvbXBsZXRlIGFuZCBhIHBhZ2UgdGhhdCBhY3R1YWxseSBoZWxwcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkhvdyB0byBhcHBseSB0aGUgaWRlYSBpbiBub3JtYWwgdXNlPC9oMj48cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgYXJ0aWNsZSBpcyB0byB0dXJuIGl0IGludG8gYSBzbWFsbCBhY3Rpb24gbGlzdC4gU2F2ZSB0aGUgc3Ryb25nZXN0IHBvaW50LCBjb21wYXJlIGl0IHdpdGggb25lIG90aGVyIHNvdXJjZSwgdGhlbiBkZWNpZGUgd2hldGhlciB0aGUgYWR2aWNlIHN0aWxsIGZpdHMgdGhlIHJlYWRlciBnb2FsLiBUaGF0IG1ldGhvZCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gcHJhY3RpY2FsIGV2ZW4gd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPldoYXQgdG8gcmV2aWV3IGxhdGVyPC9oMj48cD5PbGRlciBub3RlcyBjYW4gc3RheSB1c2VmdWwgd2hlbiB0aGV5IGFyZSByZXZpZXdlZC4gRGF0ZXMsIGV4YW1wbGVzLCBsaW5rcywgcHJpY2VzLCBuYW1lcywgYW5kIGNvbnRhY3QgZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBmcm9tIHRpbWUgdG8gdGltZS4gSGlqYXVpZHJvc2UgdHJlYXRzIHRoaXMga2luZCBvZiByZXZpZXcgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYmVjYXVzZSBhIHBhZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGNhbiBzbG93bHkgYmVjb21lIGxlc3MgaGVscGZ1bC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkEgYmFsYW5jZWQgY2xvc2luZyBub3RlPC9oMj48cD5UaGUgcHVycG9zZSBvZiB0aGlzIGFydGljbGUgaXMgbm90IHRvIG1ha2UgdGhlIHRvcGljIGxvb2sgY29tcGxpY2F0ZWQuIFRoZSBwdXJwb3NlIGlzIHRvIHNsb3cgdGhlIHJlYWRlciBkb3duIGVub3VnaCB0byBtYWtlIGEgYmV0dGVyIGNob2ljZS4gQSBjbGVhciBhcnRpY2xlIGdpdmVzIGNvbnRleHQsIHNob3dzIHRyYWRlLW9mZnMsIGFuZCBsZWF2ZXMgdGhlIHZpc2l0b3Igd2l0aCBhIG5leHQgc3RlcCB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlJlYWRlciBxdWVzdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFuc3dlcjwvaDI+PHA+QSB1c2VmdWwgcGFnZSBzaG91bGQgYW5zd2VyIHRoZSBxdWVzdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHBhcmFncmFwaCwgbm90IG9ubHkgdGhlIHF1ZXN0aW9uIGluIHRoZSB0aXRsZS4gUmVhZGVycyB3YW50IHRvIGtub3cgd2hhdCBtYXR0ZXJzIGZpcnN0LCB3aGF0IGNhbiB3YWl0LCBhbmQgd2hpY2ggZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgdGFraW5nIGFjdGlvbi4gVGhpcyBzZWN0aW9uIGFkZHMgdGhvc2UgcHJhY3RpY2FsIGNoZWNrcyBzbyB0aGUgYXJ0aWNsZSB3b3JrcyBhcyBhIHJlZmVyZW5jZSByYXRoZXIgdGhhbiBhIHNob3J0IG5vdGUuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPiIsInRhZ3MiOlsiTG9jYWwgR3VpZGUiLCJDb21wYXJpc29ucyIsInN0ZXBzIiwidHVybmluZyBub3RlcyBpbnRvIGFjdGlvbiIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgdHVybmluZyBub3RlcyBpbnRvIGFjdGlvbiBzdGVwcyIsImhhc2giOiJhNjhlNmIzMDc1NjQ5NzRiNWJkNTZjMzA0ZmRhNDRmZjI5NDQ3YTEyIn0seyJ0aXRsZSI6IlF1ZXN0aW9ucyBhbmQgYW5zd2VycyBhYm91dCBtYWtpbmcgYSBjb21wbGV0ZSBjaGVja2xpc3QiLCJjYXRlZ29yeSI6IlJlc291cmNlcyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIG1pc3Rha2VzIGFydGljbGUgYWJvdXQgbWFraW5nIGEgY29tcGxldGUgY2hlY2tsaXN0IGZvciByZWFkZXJzIGludGVyZXN0ZWQgaW4gTG9jYWwgR3VpZGUuIiwiY29udGVudCI6IjxwPlRoaXMgYXJ0aWNsZSB0YWtlcyBhIHByYWN0aWNhbCBsb29rIGF0IG1ha2luZyBhIGNvbXBsZXRlIGNoZWNrbGlzdCBmb3IgdmlzaXRvcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4gSW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIHNhbWUgZ2VuZXJhbCBhZHZpY2UsIGl0IHNlcGFyYXRlcyB0aGUgdG9waWMgaW50byBkZWNpc2lvbnMsIGV4YW1wbGVzLCByaXNrcywgYW5kIHJldmlldyBwb2ludHMuPC9wPjxoMj5NaXN0YWtlIG9uZTogdHJ1c3RpbmcgdGhlIGZpcnN0IGFuc3dlcjwvaDI+PHA+VGhlIGZpcnN0IGFuc3dlciBtYXkgYmUgdXNlZnVsLCBidXQgaXQgc2hvdWxkIG5vdCBiZSB0aGUgb25seSBhbnN3ZXIuIENvbXBhcmUgaXQgd2l0aCBhdCBsZWFzdCBvbmUgZGlmZmVyZW50IHNvdXJjZSBvciBleGFtcGxlLjwvcD48aDI+TWlzdGFrZSB0d286IGlnbm9yaW5nIGNvbnRleHQ8L2gyPjxwPkFkdmljZSB0aGF0IHdvcmtzIGluIG9uZSBzZXR0aW5nIG1heSBmYWlsIGluIGFub3RoZXIuIENvbnRleHQgaW5jbHVkZXMgYnVkZ2V0LCBsb2NhdGlvbiwgdGltaW5nLCBza2lsbCBsZXZlbCwgYW5kIHRoZSByZWFkZXIgcGVyc29uYWwgZ29hbC48L3A+PGgyPk1pc3Rha2UgdGhyZWU6IHNhdmluZyBldmVyeXRoaW5nPC9oMj48cD5BIGxhcmdlIGNvbGxlY3Rpb24gb2Ygbm90ZXMgY2FuIGJlY29tZSBhIHByb2JsZW0uIFNhdmUgb25seSBtYXRlcmlhbCB0aGF0IGhlbHBzIGV4cGxhaW4sIGNvbXBhcmUsIG9yIGFjdC48L3A+PGgyPkEgYmV0dGVyIGhhYml0PC9oMj48cD5Vc2UgYSBzbWFsbCByZXZpZXcgc3lzdGVtOiBxdWVzdGlvbiwgZXZpZGVuY2UsIG9wdGlvbiwgcmlzaywgbmV4dCBhY3Rpb24uIFRoaXMgaGFiaXQgbWFrZXMgbWFraW5nIGEgY29tcGxldGUgY2hlY2tsaXN0IGVhc2llciB0byBoYW5kbGUuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIFJlc291cmNlcyBzZWN0aW9uLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiUmVzb3VyY2VzIiwibWlzdGFrZXMiLCJtYWtpbmcgYSBjb21wbGV0ZSBjaGVja2xpc3QiLCJyZXNvdXJjZXMiLCJndWlkZSJdLCJpbWFnZV9xdWVyeSI6IkxvY2FsIEd1aWRlIG1ha2luZyBhIGNvbXBsZXRlIGNoZWNrbGlzdCBtaXN0YWtlcyIsImhhc2giOiIyMTNjNzM5MzMxYjY4MmQzZDM1ZGZiMmY4Yjg3M2YzODExMDVmN2U3In0seyJ0aXRsZSI6IlRoZSBjYXJlZnVsIHJlYWRlciBndWlkZSB0byB0cmFja2luZyBvbGRlciByZWZlcmVuY2VzIiwiY2F0ZWdvcnkiOiJBcmNoaXZlIiwiZXhjZXJwdCI6IkEgZGV0YWlsZWQgcmVzb3VyY2Vfcm91bmR1cCBhcnRpY2xlIGFib3V0IHRyYWNraW5nIG9sZGVyIHJlZmVyZW5jZXMgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+QSBnb29kIHJlc291cmNlIHNob3VsZCBoZWxwIHRoZSByZWFkZXIgdGhpbmssIG5vdCBqdXN0IGZpbGwgc3BhY2UuIFRoZSBub3RlcyBiZWxvdyBleHBsYWluIHRyYWNraW5nIG9sZGVyIHJlZmVyZW5jZXMgdGhyb3VnaCBhIHN0cnVjdHVyZWQgYXBwcm9hY2ggdGhhdCBjYW4gYmUgdXNlZCBmb3IgcGxhbm5pbmcsIGNvbXBhcmlzb24sIGFuZCBsYXRlciB1cGRhdGVzLjwvcD48aDI+UmVzb3VyY2UgdHlwZSBvbmU6IGV4cGxhbmF0aW9uczwvaDI+PHA+R29vZCBleHBsYW5hdGlvbnMgZGVmaW5lIHRoZSB0b3BpYywgYXZvaWQgdmFndWUgcHJvbWlzZXMsIGFuZCBzaG93IGhvdyB0aGUgaWRlYSB3b3JrcyBpbiBub3JtYWwgbGFuZ3VhZ2UuIFRoZXkgc2hvdWxkIG1ha2UgdGhlIHJlYWRlciBtb3JlIGNvbmZpZGVudCB3aXRob3V0IHByZXRlbmRpbmcgdGhhdCBldmVyeSBkZXRhaWwgaXMgc2ltcGxlLjwvcD48aDI+UmVzb3VyY2UgdHlwZSB0d286IGV4YW1wbGVzPC9oMj48cD5FeGFtcGxlcyBoZWxwIHRoZSByZWFkZXIgdGVzdCB3aGV0aGVyIGFkdmljZSBpcyByZWFsaXN0aWMuIEEgc2luZ2xlIGRldGFpbGVkIGV4YW1wbGUgY2FuIGJlIG1vcmUgdXNlZnVsIHRoYW4gdGVuIGdlbmVyYWwgdGlwcyBiZWNhdXNlIGl0IHNob3dzIGhvdyB0aGUgYWR2aWNlIGJlaGF2ZXMgaW4gcHJhY3RpY2UuPC9wPjxoMj5SZXNvdXJjZSB0eXBlIHRocmVlOiBjb21wYXJpc29uIG5vdGVzPC9oMj48cD5Db21wYXJpc29uIG5vdGVzIGFyZSBoZWxwZnVsIHdoZW4gdGhleSB1c2UgdGhlIHNhbWUgY3JpdGVyaWEgZm9yIGV2ZXJ5IG9wdGlvbi4gV2l0aG91dCBzaGFyZWQgY3JpdGVyaWEsIGNvbXBhcmlzb24gYmVjb21lcyBvcGluaW9uLjwvcD48aDI+SG93IHRvIGtlZXAgdGhlIHJvdW5kdXAgZnJlc2g8L2gyPjxwPlJlbW92ZSBvbGQgbGlua3MsIHVwZGF0ZSBkYXRlcywgYW5kIGFkZCBhIHNob3J0IG5vdGUgd2hlbiBzb21ldGhpbmcgY2hhbmdlcy4gVGhpcyBrZWVwcyB0aGUgYXJjaGl2ZSB0cnVzdHdvcnRoeS48L3A+PGgyPkZpbmFsIHByYWN0aWNhbCBub3RlczwvaDI+PHA+Rm9yIHJlYWRlcnMgb2YgSGlqYXVpZHJvc2UsIHRoZSBtb3N0IHVzZWZ1bCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNwZWNpZmljLiBBIHNwZWNpZmljIG5vdGUgaXMgZWFzaWVyIHRvIHZlcmlmeSwgZWFzaWVyIHRvIHVwZGF0ZSwgYW5kIGVhc2llciB0byBjb25uZWN0IHdpdGggcmVsYXRlZCBhcnRpY2xlcyBpbiB0aGUgQXJjaGl2ZSBzZWN0aW9uLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiQXJjaGl2ZSIsInJlc291cmNlX3JvdW5kdXAiLCJ0cmFja2luZyBvbGRlciByZWZlcmVuY2VzIiwicmVzb3VyY2VzIiwiZ3VpZGUiXSwiaW1hZ2VfcXVlcnkiOiJMb2NhbCBHdWlkZSB0cmFja2luZyBvbGRlciByZWZlcmVuY2VzIHJlc291cmNlIHJvdW5kdXAiLCJoYXNoIjoiYjJiMjY0YjYwYjU0NTIyODY0ZDI0M2UyN2NhYWNmODFkMmUwNzQwNSJ9LHsidGl0bGUiOiJBIHByYWN0aWNhbCBndWlkZSB0byBjaG9vc2luZyBwcmFjdGljYWwgdG9vbHMiLCJjYXRlZ29yeSI6Ikd1aWRlcyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIGVkaXRvcmlhbCBhcnRpY2xlIGFib3V0IGNob29zaW5nIHByYWN0aWNhbCB0b29scyBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD48c3Ryb25nPkhpamF1aWRyb3NlPC9zdHJvbmc+IHB1Ymxpc2hlcyB0aGlzIGFydGljbGUgZm9yIHJlYWRlcnMgd2hvIG5lZWQgbW9yZSB0aGFuIGEgcXVpY2sgYW5zd2VyIGFib3V0IGNob29zaW5nIHByYWN0aWNhbCB0b29scy4gVGhlIGFpbSBpcyB0byBleHBsYWluIHRoZSB0b3BpYyBzbG93bHksIHNob3cgd2hlcmUgbWlzdGFrZXMgdXN1YWxseSBoYXBwZW4sIGFuZCBnaXZlIHRoZSByZWFkZXIgYSB1c2FibGUgbWV0aG9kIHRoYXQgY2FuIGJlIGNoZWNrZWQgYWdhaW4gbGF0ZXIuPC9wPjxoMj5PYnNlcnZhdGlvbiBvbmU8L2gyPjxwPlBlb3BsZSBvZnRlbiBiZWdpbiB3aXRoIGEgYnJvYWQgc2VhcmNoIGFuZCB0aGVuIHNhdmUgdG9vIG1hbnkgc2ltaWxhciBwYWdlcy4gVGhlIHVzZWZ1bCBzdGVwIGlzIHRvIGdyb3VwIHRob3NlIHBhZ2VzIGJ5IHB1cnBvc2U6IGV4cGxhbmF0aW9uLCBjb21wYXJpc29uLCBleGFtcGxlLCBhbmQgY29udGFjdC48L3A+PGgyPk9ic2VydmF0aW9uIHR3bzwvaDI+PHA+U3BlY2lmaWMgZXhhbXBsZXMgYXJlIG1vcmUgdmFsdWFibGUgdGhhbiBnZW5lcmljIGNsYWltcy4gSWYgYW4gYXJ0aWNsZSBleHBsYWlucyBob3cgYSBjaG9pY2Ugd29ya3MgaW4gb25lIHJlYWxpc3RpYyBzaXR1YXRpb24sIHRoZSByZWFkZXIgY2FuIGFkYXB0IHRoYXQgbGVzc29uIG1vcmUgZWFzaWx5LjwvcD48aDI+T2JzZXJ2YXRpb24gdGhyZWU8L2gyPjxwPlRoZSBiZXN0IHBhZ2VzIGxlYXZlIHJvb20gZm9yIGRvdWJ0LiBUaGV5IGV4cGxhaW4gd2hhdCBpcyBrbm93biwgd2hhdCBpcyB1bmNsZWFyLCBhbmQgd2hhdCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbiBiZWZvcmUgbWFraW5nIGEgZmluYWwgZGVjaXNpb24uPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIEd1aWRlcyBzZWN0aW9uLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiR3VpZGVzIiwiZWRpdG9yaWFsIiwiY2hvb3NpbmcgcHJhY3RpY2FsIHRvb2xzIiwicmVzb3VyY2VzIiwiZ3VpZGUiXSwiaW1hZ2VfcXVlcnkiOiJMb2NhbCBHdWlkZSBjaG9vc2luZyBwcmFjdGljYWwgdG9vbHMgZWRpdG9yaWFsIiwiaGFzaCI6Ijg5ZTA4YWQ5MmIyZGRmZjliNjE2OTg5ZjQzMTRlNjJmNzU0YjU1NDQifSx7InRpdGxlIjoiV2hhdCByZWFkZXJzIHNob3VsZCBrbm93IGJlZm9yZSBhdm9pZGluZyBjb21tb24gbWlzdGFrZXMiLCJjYXRlZ29yeSI6IlJlc2VhcmNoIiwiZXhjZXJwdCI6IkEgZGV0YWlsZWQgdGltZWxpbmUgYXJ0aWNsZSBhYm91dCBhdm9pZGluZyBjb21tb24gbWlzdGFrZXMgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+U29tZSB0b3BpY3MgbG9vayBzaW1wbGUgdW50aWwgYSByZWFkZXIgdHJpZXMgdG8gdXNlIHRoZW0uIGF2b2lkaW5nIGNvbW1vbiBtaXN0YWtlcyBpcyBvbmUgb2YgdGhvc2UgYXJlYXMgd2hlcmUgYSBzaG9ydCBwYXJhZ3JhcGggaXMgcmFyZWx5IGVub3VnaCwgYmVjYXVzZSB0aGUgdXNlZnVsIGFuc3dlciBkZXBlbmRzIG9uIGNvbnRleHQsIHRpbWluZywgYW5kIHRoZSBxdWFsaXR5IG9mIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24uPC9wPjxoMj5TdGFnZSBvbmU6IHRoZSBmaXJzdCBxdWVzdGlvbjwvaDI+PHA+VGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHVzdWFsbHkgYnJvYWQuIFRoZSByZWFkZXIgd2FudHMgb3JpZW50YXRpb24gYW5kIGRvZXMgbm90IHlldCBrbm93IHdoaWNoIGRldGFpbHMgbWF0dGVyLjwvcD48aDI+U3RhZ2UgdHdvOiBuYXJyb3dpbmcgdGhlIHRvcGljPC9oMj48cD5BZnRlciBhIHNob3J0IHJldmlldywgdGhlIHJlYWRlciBjYW4gcmVtb3ZlIHdlYWsgc291cmNlcyBhbmQgZm9jdXMgb24gdGhlIG9wdGlvbnMgdGhhdCBtYXRjaCB0aGUgYWN0dWFsIG5lZWQuPC9wPjxoMj5TdGFnZSB0aHJlZTogY2hlY2tpbmcgZXZpZGVuY2U8L2gyPjxwPlRoaXMgc3RhZ2UgbG9va3MgYXQgZXhhbXBsZXMsIGRhdGVzLCBsaW1pdHMsIGFuZCB3aGV0aGVyIHRoZSBhZHZpY2UgY2FuIGJlIHJlcGVhdGVkIGJ5IGEgbm9ybWFsIHZpc2l0b3IuPC9wPjxoMj5TdGFnZSBmb3VyOiB0YWtpbmcgYWN0aW9uPC9oMj48cD5UaGUgZmluYWwgc3RhZ2UgaXMgYSBtb2Rlc3QgYWN0aW9uOiBzYXZlIHRoZSBiZXN0IHNvdXJjZSwgY29udGFjdCB0aGUgcmlnaHQgcGVyc29uLCBjb21wYXJlIHRoZSBmaW5hbCBvcHRpb25zLCBvciB1cGRhdGUgdGhlIGFyY2hpdmUgbm90ZS48L3A+PGgyPkZpbmFsIHByYWN0aWNhbCBub3RlczwvaDI+PHA+Rm9yIHJlYWRlcnMgb2YgSGlqYXVpZHJvc2UsIHRoZSBtb3N0IHVzZWZ1bCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNwZWNpZmljLiBBIHNwZWNpZmljIG5vdGUgaXMgZWFzaWVyIHRvIHZlcmlmeSwgZWFzaWVyIHRvIHVwZGF0ZSwgYW5kIGVhc2llciB0byBjb25uZWN0IHdpdGggcmVsYXRlZCBhcnRpY2xlcyBpbiB0aGUgUmVzZWFyY2ggc2VjdGlvbi48L3A+PGgyPlJlYWRlciBxdWVzdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFuc3dlcjwvaDI+PHA+QSB1c2VmdWwgcGFnZSBzaG91bGQgYW5zd2VyIHRoZSBxdWVzdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHBhcmFncmFwaCwgbm90IG9ubHkgdGhlIHF1ZXN0aW9uIGluIHRoZSB0aXRsZS4gUmVhZGVycyB3YW50IHRvIGtub3cgd2hhdCBtYXR0ZXJzIGZpcnN0LCB3aGF0IGNhbiB3YWl0LCBhbmQgd2hpY2ggZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgdGFraW5nIGFjdGlvbi4gVGhpcyBzZWN0aW9uIGFkZHMgdGhvc2UgcHJhY3RpY2FsIGNoZWNrcyBzbyB0aGUgYXJ0aWNsZSB3b3JrcyBhcyBhIHJlZmVyZW5jZSByYXRoZXIgdGhhbiBhIHNob3J0IG5vdGUuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5TaWduYWxzIG9mIGEgdHJ1c3R3b3J0aHkgcmVzb3VyY2U8L2gyPjxwPkEgdHJ1c3R3b3J0aHkgcmVzb3VyY2UgaXMgc3BlY2lmaWMuIEl0IGV4cGxhaW5zIGxpbWl0cywgdXNlcyBleGFtcGxlcywgYW5kIGF2b2lkcyBwcm9taXNpbmcgdGhhdCBvbmUgc29sdXRpb24gZml0cyBldmVyeSBzaXR1YXRpb24uIFdoZW4gYSByZWFkZXIgY29tcGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgTG9jYWwgR3VpZGUsIHRoZXNlIHNpZ25hbHMgbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcGFnZSB0aGF0IGxvb2tzIGNvbXBsZXRlIGFuZCBhIHBhZ2UgdGhhdCBhY3R1YWxseSBoZWxwcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkhvdyB0byBhcHBseSB0aGUgaWRlYSBpbiBub3JtYWwgdXNlPC9oMj48cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgYXJ0aWNsZSBpcyB0byB0dXJuIGl0IGludG8gYSBzbWFsbCBhY3Rpb24gbGlzdC4gU2F2ZSB0aGUgc3Ryb25nZXN0IHBvaW50LCBjb21wYXJlIGl0IHdpdGggb25lIG90aGVyIHNvdXJjZSwgdGhlbiBkZWNpZGUgd2hldGhlciB0aGUgYWR2aWNlIHN0aWxsIGZpdHMgdGhlIHJlYWRlciBnb2FsLiBUaGF0IG1ldGhvZCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gcHJhY3RpY2FsIGV2ZW4gd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPldoYXQgdG8gcmV2aWV3IGxhdGVyPC9oMj48cD5PbGRlciBub3RlcyBjYW4gc3RheSB1c2VmdWwgd2hlbiB0aGV5IGFyZSByZXZpZXdlZC4gRGF0ZXMsIGV4YW1wbGVzLCBsaW5rcywgcHJpY2VzLCBuYW1lcywgYW5kIGNvbnRhY3QgZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBmcm9tIHRpbWUgdG8gdGltZS4gSGlqYXVpZHJvc2UgdHJlYXRzIHRoaXMga2luZCBvZiByZXZpZXcgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYmVjYXVzZSBhIHBhZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGNhbiBzbG93bHkgYmVjb21lIGxlc3MgaGVscGZ1bC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlJlYWRlciBxdWVzdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFuc3dlcjwvaDI+PHA+QSB1c2VmdWwgcGFnZSBzaG91bGQgYW5zd2VyIHRoZSBxdWVzdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIGZpcnN0IHBhcmFncmFwaCwgbm90IG9ubHkgdGhlIHF1ZXN0aW9uIGluIHRoZSB0aXRsZS4gUmVhZGVycyB3YW50IHRvIGtub3cgd2hhdCBtYXR0ZXJzIGZpcnN0LCB3aGF0IGNhbiB3YWl0LCBhbmQgd2hpY2ggZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgdGFraW5nIGFjdGlvbi4gVGhpcyBzZWN0aW9uIGFkZHMgdGhvc2UgcHJhY3RpY2FsIGNoZWNrcyBzbyB0aGUgYXJ0aWNsZSB3b3JrcyBhcyBhIHJlZmVyZW5jZSByYXRoZXIgdGhhbiBhIHNob3J0IG5vdGUuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5TaWduYWxzIG9mIGEgdHJ1c3R3b3J0aHkgcmVzb3VyY2U8L2gyPjxwPkEgdHJ1c3R3b3J0aHkgcmVzb3VyY2UgaXMgc3BlY2lmaWMuIEl0IGV4cGxhaW5zIGxpbWl0cywgdXNlcyBleGFtcGxlcywgYW5kIGF2b2lkcyBwcm9taXNpbmcgdGhhdCBvbmUgc29sdXRpb24gZml0cyBldmVyeSBzaXR1YXRpb24uIFdoZW4gYSByZWFkZXIgY29tcGFyZXMgaW5mb3JtYXRpb24gYWJvdXQgTG9jYWwgR3VpZGUsIHRoZXNlIHNpZ25hbHMgbWFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcGFnZSB0aGF0IGxvb2tzIGNvbXBsZXRlIGFuZCBhIHBhZ2UgdGhhdCBhY3R1YWxseSBoZWxwcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPkhvdyB0byBhcHBseSB0aGUgaWRlYSBpbiBub3JtYWwgdXNlPC9oMj48cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgYXJ0aWNsZSBpcyB0byB0dXJuIGl0IGludG8gYSBzbWFsbCBhY3Rpb24gbGlzdC4gU2F2ZSB0aGUgc3Ryb25nZXN0IHBvaW50LCBjb21wYXJlIGl0IHdpdGggb25lIG90aGVyIHNvdXJjZSwgdGhlbiBkZWNpZGUgd2hldGhlciB0aGUgYWR2aWNlIHN0aWxsIGZpdHMgdGhlIHJlYWRlciBnb2FsLiBUaGF0IG1ldGhvZCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gcHJhY3RpY2FsIGV2ZW4gd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPldoYXQgdG8gcmV2aWV3IGxhdGVyPC9oMj48cD5PbGRlciBub3RlcyBjYW4gc3RheSB1c2VmdWwgd2hlbiB0aGV5IGFyZSByZXZpZXdlZC4gRGF0ZXMsIGV4YW1wbGVzLCBsaW5rcywgcHJpY2VzLCBuYW1lcywgYW5kIGNvbnRhY3QgZGV0YWlscyBzaG91bGQgYmUgY2hlY2tlZCBmcm9tIHRpbWUgdG8gdGltZS4gSGlqYXVpZHJvc2UgdHJlYXRzIHRoaXMga2luZCBvZiByZXZpZXcgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYmVjYXVzZSBhIHBhZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGNhbiBzbG93bHkgYmVjb21lIGxlc3MgaGVscGZ1bC48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+IiwidGFncyI6WyJMb2NhbCBHdWlkZSIsIlJlc2VhcmNoIiwidGltZWxpbmUiLCJhdm9pZGluZyBjb21tb24gbWlzdGFrZXMiLCJyZXNvdXJjZXMiLCJndWlkZSJdLCJpbWFnZV9xdWVyeSI6IkxvY2FsIEd1aWRlIGF2b2lkaW5nIGNvbW1vbiBtaXN0YWtlcyB0aW1lbGluZSIsImhhc2giOiJlOWY0NmIwMDg1MDRkMzE0ZmM4ODg3YzQ4MGRmZmZiNWM0MWZkZTFlIn0seyJ0aXRsZSI6Ikluc2lkZSBpbXByb3ZpbmcgYSBjb250YWN0IHBhZ2U6IG5vdGVzLCBleGFtcGxlcyBhbmQgY2hlY2tzIiwiY2F0ZWdvcnkiOiJMb2NhbCBOb3RlcyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIGludGVydmlldyBhcnRpY2xlIGFib3V0IGltcHJvdmluZyBhIGNvbnRhY3QgcGFnZSBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD5UaGlzIGFydGljbGUgdGFrZXMgYSBwcmFjdGljYWwgbG9vayBhdCBpbXByb3ZpbmcgYSBjb250YWN0IHBhZ2UgZm9yIHZpc2l0b3JzIGludGVyZXN0ZWQgaW4gTG9jYWwgR3VpZGUuIEluc3RlYWQgb2YgcmVwZWF0aW5nIHRoZSBzYW1lIGdlbmVyYWwgYWR2aWNlLCBpdCBzZXBhcmF0ZXMgdGhlIHRvcGljIGludG8gZGVjaXNpb25zLCBleGFtcGxlcywgcmlza3MsIGFuZCByZXZpZXcgcG9pbnRzLjwvcD48aDI+UXVlc3Rpb246IHdoYXQgbWFrZXMgdGhpcyB0b3BpYyBkaWZmaWN1bHQ/PC9oMj48cD5UaGUgZGlmZmljdWx0eSBpcyBub3QgYWx3YXlzIHRoZSB0b3BpYyBpdHNlbGYuIEl0IGlzIHRoZSBhbW91bnQgb2Ygc2NhdHRlcmVkIGluZm9ybWF0aW9uIGFyb3VuZCBpdC4gUmVhZGVycyBuZWVkIGEgd2F5IHRvIHNlcGFyYXRlIHVzZWZ1bCBkZXRhaWwgZnJvbSBub2lzZS48L3A+PGgyPlF1ZXN0aW9uOiB3aGF0IHNob3VsZCBiZSBjaGVja2VkIGZpcnN0PzwvaDI+PHA+Q2hlY2sgd2hldGhlciB0aGUgYWR2aWNlIGV4cGxhaW5zIHdobyBpdCBpcyBmb3IuIEdvb2QgaW5mb3JtYXRpb24gdXN1YWxseSBoYXMgYSBjbGVhciBhdWRpZW5jZSwgYSBjbGVhciBsaW1pdCwgYW5kIGEgcmVhbGlzdGljIGV4YW1wbGUuPC9wPjxoMj5RdWVzdGlvbjogd2hhdCBzaG91bGQgYSByZWFkZXIgZG8gbmV4dD88L2gyPjxwPlRoZSBuZXh0IHN0ZXAgaXMgdG8gY29tcGFyZSB0d28gc291cmNlcyBhbmQgd3JpdGUgZG93biB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uIFRoYXQgc21hbGwgYWN0aW9uIG9mdGVuIHJldmVhbHMgd2hpY2ggc291cmNlIGlzIG1vcmUgdXNlZnVsLjwvcD48aDI+RmluYWwgcHJhY3RpY2FsIG5vdGVzPC9oMj48cD5Gb3IgcmVhZGVycyBvZiBIaWphdWlkcm9zZSwgdGhlIG1vc3QgdXNlZnVsIGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc3BlY2lmaWMuIEEgc3BlY2lmaWMgbm90ZSBpcyBlYXNpZXIgdG8gdmVyaWZ5LCBlYXNpZXIgdG8gdXBkYXRlLCBhbmQgZWFzaWVyIHRvIGNvbm5lY3Qgd2l0aCByZWxhdGVkIGFydGljbGVzIGluIHRoZSBMb2NhbCBOb3RlcyBzZWN0aW9uLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiTG9jYWwgTm90ZXMiLCJpbnRlcnZpZXciLCJpbXByb3ZpbmcgYSBjb250YWN0IHBhZ2UiLCJyZXNvdXJjZXMiLCJndWlkZSJdLCJpbWFnZV9xdWVyeSI6IkxvY2FsIEd1aWRlIGltcHJvdmluZyBhIGNvbnRhY3QgcGFnZSBpbnRlcnZpZXciLCJoYXNoIjoiYzA4NDUyYTJlMWRiMTI3ZWE2MTMxOTBkZGRkZGU4ZGJmZmJlMmViNyJ9LHsidGl0bGUiOiJUaGUgY29tcGxldGUgYnVpbGRpbmcgYSB1c2VmdWwgcm91dGluZSByZWZlcmVuY2UgZm9yIGV2ZXJ5ZGF5IHJlYWRlcnMiLCJjYXRlZ29yeSI6IlF1ZXN0aW9ucyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIGRlZXBfZGl2ZSBhcnRpY2xlIGFib3V0IGJ1aWxkaW5nIGEgdXNlZnVsIHJvdXRpbmUgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+QSBnb29kIHJlc291cmNlIHNob3VsZCBoZWxwIHRoZSByZWFkZXIgdGhpbmssIG5vdCBqdXN0IGZpbGwgc3BhY2UuIFRoZSBub3RlcyBiZWxvdyBleHBsYWluIGJ1aWxkaW5nIGEgdXNlZnVsIHJvdXRpbmUgdGhyb3VnaCBhIHN0cnVjdHVyZWQgYXBwcm9hY2ggdGhhdCBjYW4gYmUgdXNlZCBmb3IgcGxhbm5pbmcsIGNvbXBhcmlzb24sIGFuZCBsYXRlciB1cGRhdGVzLjwvcD48aDI+VGhlIGRlZXBlciBpc3N1ZTwvaDI+PHA+VGhlIGRlZXBlciBpc3N1ZSBiZWhpbmQgYnVpbGRpbmcgYSB1c2VmdWwgcm91dGluZSBpcyB0aGF0IHJlYWRlcnMgb2Z0ZW4gbmVlZCBhIHN5c3RlbSwgbm90IG9ubHkgYW4gYW5zd2VyLiBBIHN5c3RlbSBoZWxwcyB0aGVtIHJlcGVhdCB0aGUgc2FtZSBnb29kIGRlY2lzaW9uIHByb2Nlc3MgaW4gYSBuZXcgc2l0dWF0aW9uLjwvcD48aDI+SW1wb3J0YW50IGRldGFpbHMgdG8gc2VwYXJhdGU8L2gyPjxwPlNlcGFyYXRlIGZhY3RzIGZyb20gb3BpbmlvbnMsIGN1cnJlbnQgZGV0YWlscyBmcm9tIG9sZGVyIG5vdGVzLCBhbmQgZ2VuZXJhbCBhZHZpY2UgZnJvbSBpbnN0cnVjdGlvbnMuIFRoaXMgbWFrZXMgdGhlIGFydGljbGUgZWFzaWVyIHRvIHVwZGF0ZSBhbmQgZWFzaWVyIHRvIHRydXN0LjwvcD48aDI+V2h5IGV4YW1wbGVzIG1hdHRlcjwvaDI+PHA+RXhhbXBsZXMgdHVybiBhZHZpY2UgaW50byBzb21ldGhpbmcgdmlzaWJsZS4gVGhleSBzaG93IHdoYXQgdGhlIGlkZWEgbG9va3MgbGlrZSB3aGVuIGEgbm9ybWFsIHJlYWRlciB0cmllcyB0byB1c2UgaXQuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIFF1ZXN0aW9ucyBzZWN0aW9uLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiUXVlc3Rpb25zIiwiZGVlcF9kaXZlIiwiYnVpbGRpbmcgYSB1c2VmdWwgcm91dGluZSIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgYnVpbGRpbmcgYSB1c2VmdWwgcm91dGluZSBkZWVwIGRpdmUiLCJoYXNoIjoiMzVlYzI3ZDkyMDcyMzE4NTlmMDE4YzI5MGY4ODZkNDg2NTdjNzhlOCJ9LHsidGl0bGUiOiJIb3cgdG8gdGhpbmsgY2xlYXJseSBhYm91dCBwbGFubmluZyBhIHNlYXNvbmFsIHVwZGF0ZSIsImNhdGVnb3J5IjoiSWRlYXMiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCByb2FkbWFwIGFydGljbGUgYWJvdXQgcGxhbm5pbmcgYSBzZWFzb25hbCB1cGRhdGUgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+PHN0cm9uZz5IaWphdWlkcm9zZTwvc3Ryb25nPiBwdWJsaXNoZXMgdGhpcyBhcnRpY2xlIGZvciByZWFkZXJzIHdobyBuZWVkIG1vcmUgdGhhbiBhIHF1aWNrIGFuc3dlciBhYm91dCBwbGFubmluZyBhIHNlYXNvbmFsIHVwZGF0ZS4gVGhlIGFpbSBpcyB0byBleHBsYWluIHRoZSB0b3BpYyBzbG93bHksIHNob3cgd2hlcmUgbWlzdGFrZXMgdXN1YWxseSBoYXBwZW4sIGFuZCBnaXZlIHRoZSByZWFkZXIgYSB1c2FibGUgbWV0aG9kIHRoYXQgY2FuIGJlIGNoZWNrZWQgYWdhaW4gbGF0ZXIuPC9wPjxoMj5TdGFydCB3aXRoIHRoZSByZWFsIHB1cnBvc2U8L2gyPjxwPlRoZSBmaXJzdCBxdWVzdGlvbiBpcyBub3Qgd2hpY2ggb3B0aW9uIGxvb2tzIHBvcHVsYXIuIFRoZSBmaXJzdCBxdWVzdGlvbiBpcyB3aGF0IHRoZSByZWFkZXIgbmVlZHMgdG8gc29sdmUgdG9kYXkuIEZvciBwbGFubmluZyBhIHNlYXNvbmFsIHVwZGF0ZSwgdGhhdCBtZWFucyB3cml0aW5nIGRvd24gdGhlIGdvYWwsIHRoZSBhdmFpbGFibGUgdGltZSwgYW5kIHRoZSByZXN1bHQgdGhhdCB3b3VsZCBjb3VudCBhcyB1c2VmdWwuIEEgY2xlYXIgcHVycG9zZSBwcmV2ZW50cyB0aGUgYXJ0aWNsZSBmcm9tIGJlY29taW5nIGEgY29sbGVjdGlvbiBvZiB1bnJlbGF0ZWQgdGlwcy48L3A+PHA+UmVhZGVycyBvZnRlbiBza2lwIHRoaXMgc3RlcCBiZWNhdXNlIGl0IGZlZWxzIG9idmlvdXMuIEluIHByYWN0aWNlLCBpdCBpcyB0aGUgc3RlcCB0aGF0IGtlZXBzIHRoZSByZXN0IG9mIHRoZSBkZWNpc2lvbiBvcmdhbml6ZWQuIEEgcHVycG9zZSBjYW4gYmUgc2ltcGxlOiBjb21wYXJlIHR3byBzZXJ2aWNlcywgcHJlcGFyZSBhIGNvbnRhY3QgbGlzdCwgY2hlY2sgYSBidXlpbmcgZGVjaXNpb24sIG9yIHVuZGVyc3RhbmQgdGhlIGJhY2tncm91bmQgb2YgYSB0b3BpYyBiZWZvcmUgc3BlbmRpbmcgbW9uZXkuPC9wPjxoMj5CdWlsZCBhIHNob3J0IGRlY2lzaW9uIG1hcDwvaDI+PG9sPjxsaT5EZXNjcmliZSB0aGUgcHJvYmxlbSBpbiBvbmUgc2VudGVuY2UuPC9saT48bGk+U2VwYXJhdGUgbXVzdC1oYXZlIGRldGFpbHMgZnJvbSBuaWNlIGV4dHJhcy48L2xpPjxsaT5Db21wYXJlIHR3byBvciB0aHJlZSByZWFsaXN0aWMgb3B0aW9ucy48L2xpPjxsaT5LZWVwIGEgbm90ZSBvZiB3aGF0IGNvdWxkIGNoYW5nZSBsYXRlci48L2xpPjwvb2w+PHA+VGhpcyBtYXAgd29ya3MgYmVjYXVzZSBpdCBsaW1pdHMgbm9pc2UuIEEgcmVhZGVyIGRvZXMgbm90IG5lZWQgZXZlcnkgcG9zc2libGUgYW5zd2VyLiBBIHJlYWRlciBuZWVkcyBlbm91Z2ggc3RydWN0dXJlIHRvIG1ha2UgdGhlIG5leHQgY2hvaWNlIHNhZmVyIGFuZCBlYXNpZXIgdG8gZXhwbGFpbi48L3A+PGgyPkV4YW1wbGUgaW4gcHJhY3RpY2U8L2gyPjxwPkEgdmlzaXRvciBwcmVwYXJpbmcgcGxhbm5pbmcgYSBzZWFzb25hbCB1cGRhdGUgbWlnaHQgYmVnaW4gd2l0aCBhIHNpbXBsZSBsaXN0LCB0aGVuIGRpc2NvdmVyIHRoYXQgb25lIHNtYWxsIGRldGFpbCBjaGFuZ2VzIHRoZSB3aG9sZSBjaG9pY2UuIEEgcm9hZG1hcCBwcmV2ZW50cyB0aGF0IG1pc3Rha2UgYmVjYXVzZSBpdCBmb3JjZXMgZWFjaCBzdGVwIHRvIGJlIHZpc2libGUgYmVmb3JlIHRoZSBmaW5hbCBkZWNpc2lvbi4gSXQgYWxzbyBtYWtlcyB1cGRhdGVzIGVhc2llciB3aGVuIG5ldyBpbmZvcm1hdGlvbiBhcHBlYXJzLjwvcD48aDI+RmluYWwgcHJhY3RpY2FsIG5vdGVzPC9oMj48cD5Gb3IgcmVhZGVycyBvZiBIaWphdWlkcm9zZSwgdGhlIG1vc3QgdXNlZnVsIGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc3BlY2lmaWMuIEEgc3BlY2lmaWMgbm90ZSBpcyBlYXNpZXIgdG8gdmVyaWZ5LCBlYXNpZXIgdG8gdXBkYXRlLCBhbmQgZWFzaWVyIHRvIGNvbm5lY3Qgd2l0aCByZWxhdGVkIGFydGljbGVzIGluIHRoZSBJZGVhcyBzZWN0aW9uLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiSWRlYXMiLCJyb2FkbWFwIiwicGxhbm5pbmcgYSBzZWFzb25hbCB1cGRhdGUiLCJyZXNvdXJjZXMiLCJndWlkZSJdLCJpbWFnZV9xdWVyeSI6IkxvY2FsIEd1aWRlIHBsYW5uaW5nIGEgc2Vhc29uYWwgdXBkYXRlIHJvYWRtYXAiLCJoYXNoIjoiODYzMmIxYTE5MjlhM2EyYjAwZDVkNTA5MDBkMWJhY2JmMmU1ODI0OCJ9LHsidGl0bGUiOiJBIGRpZmZlcmVudCB3YXkgdG8gYXBwcm9hY2ggZmluZGluZyBiZXR0ZXIgZXhhbXBsZXMiLCJjYXRlZ29yeSI6IlJldmlld3MiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCBjYXNlX3N0dWR5IGFydGljbGUgYWJvdXQgZmluZGluZyBiZXR0ZXIgZXhhbXBsZXMgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+U29tZSB0b3BpY3MgbG9vayBzaW1wbGUgdW50aWwgYSByZWFkZXIgdHJpZXMgdG8gdXNlIHRoZW0uIGZpbmRpbmcgYmV0dGVyIGV4YW1wbGVzIGlzIG9uZSBvZiB0aG9zZSBhcmVhcyB3aGVyZSBhIHNob3J0IHBhcmFncmFwaCBpcyByYXJlbHkgZW5vdWdoLCBiZWNhdXNlIHRoZSB1c2VmdWwgYW5zd2VyIGRlcGVuZHMgb24gY29udGV4dCwgdGltaW5nLCBhbmQgdGhlIHF1YWxpdHkgb2YgdGhlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbi48L3A+PGgyPlRoZSBzaXR1YXRpb248L2gyPjxwPlRoaXMgY2FzZSBmb2xsb3dzIGEgcmVhbGlzdGljIHJlYWRlciB3aG8gaGFzIHNldmVyYWwgbm90ZXMgc2F2ZWQgaW4gZGlmZmVyZW50IHBsYWNlcywgYSBmZXcgcmVjb21tZW5kYXRpb25zIGZyb20gZnJpZW5kcywgYW5kIG5vdCBlbm91Z2ggdGltZSB0byBjb21wYXJlIGV2ZXJ5dGhpbmcuIFRoZSBwcm9ibGVtIGlzIGNvbW1vbjogdG9vIG11Y2ggaW5mb3JtYXRpb24sIG5vdCBlbm91Z2ggb3JkZXIuPC9wPjxwPlRoZSByZWFkZXIgYmVnaW5zIGJ5IHNvcnRpbmcgbm90ZXMgaW50byB0aHJlZSBncm91cHM6IGluZm9ybWF0aW9uIHRoYXQgZXhwbGFpbnMgdGhlIHRvcGljLCBpbmZvcm1hdGlvbiB0aGF0IGNvbXBhcmVzIG9wdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiB0aGF0IGdpdmVzIGRpcmVjdCBpbnN0cnVjdGlvbnMuIEFueXRoaW5nIHRoYXQgZG9lcyBub3QgZml0IG9uZSBvZiB0aG9zZSBncm91cHMgaXMgcGxhY2VkIGFzaWRlIHVudGlsIGl0IGJlY29tZXMgdXNlZnVsLjwvcD48aDI+V2hhdCB3YXMgY2hlY2tlZCBmaXJzdDwvaDI+PHA+VGhlIGZpcnN0IGNoZWNrIHdhcyByZWxpYWJpbGl0eS4gVGhlIHNlY29uZCBjaGVjayB3YXMgd2hldGhlciB0aGUgYWR2aWNlIG1hdGNoZWQgdGhlIHJlYWRlciBuZWVkcy4gVGhlIHRoaXJkIGNoZWNrIHdhcyB3aGV0aGVyIHRoZSBzb3VyY2UgZXhwbGFpbmVkIGxpbWl0cywgYmVjYXVzZSBjb25maWRlbnQgcGFnZXMgYXJlIG5vdCBhbHdheXMgYWNjdXJhdGUgcGFnZXMuIFRoZXNlIGNoZWNrcyByZWR1Y2VkIHRoZSBsaXN0IHF1aWNrbHkgd2l0aG91dCBsb3NpbmcgaW1wb3J0YW50IGRldGFpbC48L3A+PGgyPldoYXQgY2hhbmdlZCBhZnRlciByZXZpZXc8L2gyPjxwPkFmdGVyIHJlbW92aW5nIHJlcGVhdGVkIG5vdGVzIGFuZCB3ZWFrIGV4YW1wbGVzLCB0aGUgcmVhZGVyIGNvdWxkIGZvY3VzIG9uIGEgc21hbGxlciBzZXQgb2YgY2hvaWNlcy4gVGhhdCBtYWRlIGZpbmRpbmcgYmV0dGVyIGV4YW1wbGVzIGxlc3MgY29uZnVzaW5nIGFuZCBlYXNpZXIgdG8gYWN0IG9uLiBUaGUgZmluYWwgcmVzdWx0IHdhcyBub3QgYSBwZXJmZWN0IGFuc3dlciwgYnV0IGl0IHdhcyBhIGRlY2lzaW9uIHRoYXQgY291bGQgYmUgZXhwbGFpbmVkIGFuZCByZXZpZXdlZCBsYXRlci48L3A+PGgyPkZpbmFsIHByYWN0aWNhbCBub3RlczwvaDI+PHA+Rm9yIHJlYWRlcnMgb2YgSGlqYXVpZHJvc2UsIHRoZSBtb3N0IHVzZWZ1bCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNwZWNpZmljLiBBIHNwZWNpZmljIG5vdGUgaXMgZWFzaWVyIHRvIHZlcmlmeSwgZWFzaWVyIHRvIHVwZGF0ZSwgYW5kIGVhc2llciB0byBjb25uZWN0IHdpdGggcmVsYXRlZCBhcnRpY2xlcyBpbiB0aGUgUmV2aWV3cyBzZWN0aW9uLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiUmV2aWV3cyIsImNhc2Vfc3R1ZHkiLCJmaW5kaW5nIGJldHRlciBleGFtcGxlcyIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgZmluZGluZyBiZXR0ZXIgZXhhbXBsZXMgY2FzZSBzdHVkeSIsImhhc2giOiI5YTQ4MmM4ZDAxM2NjNmNhYzBjZDVkMjk5MGM3M2MyZjdmNGY3MTY4In0seyJ0aXRsZSI6IlF1ZXN0aW9ucyBhbmQgYW5zd2VycyBhYm91dCBzYXZpbmcgdGltZSBvbmxpbmUiLCJjYXRlZ29yeSI6IkhvdyBUbyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIGNvbXBhcmlzb24gYXJ0aWNsZSBhYm91dCBzYXZpbmcgdGltZSBvbmxpbmUgZm9yIHJlYWRlcnMgaW50ZXJlc3RlZCBpbiBMb2NhbCBHdWlkZS4iLCJjb250ZW50IjoiPHA+VGhpcyBhcnRpY2xlIHRha2VzIGEgcHJhY3RpY2FsIGxvb2sgYXQgc2F2aW5nIHRpbWUgb25saW5lIGZvciB2aXNpdG9ycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiBJbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgc2FtZSBnZW5lcmFsIGFkdmljZSwgaXQgc2VwYXJhdGVzIHRoZSB0b3BpYyBpbnRvIGRlY2lzaW9ucywgZXhhbXBsZXMsIHJpc2tzLCBhbmQgcmV2aWV3IHBvaW50cy48L3A+PGgyPkNvbXBhcmUgYnkgcHVycG9zZSwgbm90IGFwcGVhcmFuY2U8L2gyPjxwPkNvbXBhcmlzb24gYXJ0aWNsZXMgYXJlIHVzZWZ1bCB3aGVuIGEgdG9waWMgaGFzIHNldmVyYWwgcGF0aHMuIEZvciBzYXZpbmcgdGltZSBvbmxpbmUsIHRoZSBzdHJvbmdlc3QgYXBwcm9hY2ggaXMgdG8gY29tcGFyZSBvcHRpb25zIGJ5IHB1cnBvc2UgcmF0aGVyIHRoYW4gYnkgYXBwZWFyYW5jZS4gQSBwYWdlIGNhbiBsb29rIHBvbGlzaGVkIGFuZCBzdGlsbCBsZWF2ZSBvdXQgdGhlIGRldGFpbCB0aGF0IG1hdHRlcnMgbW9zdCB0byB0aGUgcmVhZGVyLjwvcD48aDI+Q29tcGFyaXNvbiB0YWJsZTwvaDI+PHRhYmxlPjx0aGVhZD48dHI+PHRoPk9wdGlvbjwvdGg+PHRoPkJlc3QgdXNlPC90aD48dGg+UmlzazwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPlF1aWNrIGNob2ljZTwvdGQ+PHRkPldoZW4gdGhlIHByb2JsZW0gaXMgc2ltcGxlIGFuZCBsb3cgcmlzazwvdGQ+PHRkPk1pc3NpbmcgaW1wb3J0YW50IGRldGFpbHM8L3RkPjwvdHI+PHRyPjx0ZD5EZXRhaWxlZCByZXZpZXc8L3RkPjx0ZD5XaGVuIGNvc3QsIHRydXN0LCBvciB0aW1lIG1hdHRlcnM8L3RkPjx0ZD5UYWtpbmcgdG9vIGxvbmcgd2l0aG91dCBkZWNpZGluZzwvdGQ+PC90cj48dHI+PHRkPkV4cGVydCBzb3VyY2U8L3RkPjx0ZD5XaGVuIHRoZSB0b3BpYyByZXF1aXJlcyBleHBlcmllbmNlPC90ZD48dGQ+QWNjZXB0aW5nIGFkdmljZSB3aXRob3V0IGNvbnRleHQ8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxoMj5Ib3cgdG8gZGVjaWRlPC9oMj48cD5UaGUgYmVzdCBvcHRpb24gaXMgdGhlIG9uZSB0aGF0IG1hdGNoZXMgdGhlIHJlYWRlciBnb2FsLCBub3QgdGhlIG9uZSB3aXRoIHRoZSBzdHJvbmdlc3QgbWFya2V0aW5nIGxhbmd1YWdlLiBBIGNhcmVmdWwgY29tcGFyaXNvbiBzaG91bGQgdXNlIHRoZSBzYW1lIGNyaXRlcmlhIGZvciBldmVyeSBvcHRpb24uIFRoYXQgbWFrZXMgdGhlIGZpbmFsIGNob2ljZSBlYXNpZXIgdG8gdHJ1c3QuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIEhvdyBUbyBzZWN0aW9uLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiSG93IFRvIiwiY29tcGFyaXNvbiIsInNhdmluZyB0aW1lIG9ubGluZSIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgc2F2aW5nIHRpbWUgb25saW5lIGNvbXBhcmlzb24iLCJoYXNoIjoiZDA4ZDkxNWIxOWQ2YzI0NjE2ZDlhZDA1Yzc0MzNmMjYxZWZmNTMwMyJ9LHsidGl0bGUiOiJUaGUgY2FyZWZ1bCByZWFkZXIgZ3VpZGUgdG8gcmV2aWV3aW5nIHRydXN0ZWQgcmVzb3VyY2VzIiwiY2F0ZWdvcnkiOiJQbGFubmluZyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIGZhcSBhcnRpY2xlIGFib3V0IHJldmlld2luZyB0cnVzdGVkIHJlc291cmNlcyBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD5BIGdvb2QgcmVzb3VyY2Ugc2hvdWxkIGhlbHAgdGhlIHJlYWRlciB0aGluaywgbm90IGp1c3QgZmlsbCBzcGFjZS4gVGhlIG5vdGVzIGJlbG93IGV4cGxhaW4gcmV2aWV3aW5nIHRydXN0ZWQgcmVzb3VyY2VzIHRocm91Z2ggYSBzdHJ1Y3R1cmVkIGFwcHJvYWNoIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHBsYW5uaW5nLCBjb21wYXJpc29uLCBhbmQgbGF0ZXIgdXBkYXRlcy48L3A+PGgyPkZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb25zPC9oMj48aDM+V2h5IGRvZXMgdGhpcyB0b3BpYyBuZWVkIG1vcmUgZGV0YWlsPzwvaDM+PHA+QmVjYXVzZSByZXZpZXdpbmcgdHJ1c3RlZCByZXNvdXJjZXMgb2Z0ZW4gZGVwZW5kcyBvbiBjb250ZXh0LiBBIHNob3J0IGFuc3dlciBjYW4gYmUgY29ycmVjdCBpbiBvbmUgc2l0dWF0aW9uIGFuZCB3ZWFrIGluIGFub3RoZXIuPC9wPjxoMz5XaGF0IHNob3VsZCBhIHJlYWRlciBjaGVjayBmaXJzdD88L2gzPjxwPlN0YXJ0IHdpdGggdGhlIGdvYWwsIHRoZW4gY2hlY2sgdGhlIHNvdXJjZSwgdGhlIGRhdGUsIHRoZSBleGFtcGxlLCBhbmQgdGhlIGxpbWl0cyBvZiB0aGUgYWR2aWNlLjwvcD48aDM+SG93IGNhbiB0aGUgaW5mb3JtYXRpb24gc3RheSB1c2VmdWw/PC9oMz48cD5LZWVwIHRoZSBhcnRpY2xlIHVwZGF0ZWQgd2l0aCBiZXR0ZXIgZXhhbXBsZXMsIGNsZWFyZXIgZXhwbGFuYXRpb25zLCBhbmQgbGlua3MgdG8gcmVsYXRlZCByZXNvdXJjZXMgd2hlbiB0aGUgdG9waWMgY2hhbmdlcy48L3A+PGgyPkEgcHJhY3RpY2FsIGFuc3dlcjwvaDI+PHA+VGhlIHByYWN0aWNhbCBhbnN3ZXIgaXMgdG8gdXNlIHRoaXMgYXJ0aWNsZSBhcyBhIGNoZWNrbGlzdCwgbm90IGFzIGEgcnVsZWJvb2suIFJlYWRlcnMgc2hvdWxkIGFkYXB0IGVhY2ggcG9pbnQgdG8gdGhlaXIgb3duIHNpdHVhdGlvbiBhbmQgY29tcGFyZSBpdCB3aXRoIGFub3RoZXIgcmVsaWFibGUgc291cmNlIGJlZm9yZSBhY3RpbmcuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIFBsYW5uaW5nIHNlY3Rpb24uPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPiIsInRhZ3MiOlsiTG9jYWwgR3VpZGUiLCJQbGFubmluZyIsImZhcSIsInJldmlld2luZyB0cnVzdGVkIHJlc291cmNlcyIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgcmV2aWV3aW5nIHRydXN0ZWQgcmVzb3VyY2VzIGZhcSIsImhhc2giOiI2N2RkN2EyNjg0ODJmMmNlMGU0N2I0NjZlOTBkMzU2Zjg2ZmE5YmY5In0seyJ0aXRsZSI6IkEgcHJhY3RpY2FsIGd1aWRlIHRvIG1haW50YWluaW5nIGEgc21hbGwgd2Vic2l0ZSIsImNhdGVnb3J5IjoiRWRpdG9yaWFsIiwiZXhjZXJwdCI6IkEgZGV0YWlsZWQgZmllbGRfbm90ZSBhcnRpY2xlIGFib3V0IG1haW50YWluaW5nIGEgc21hbGwgd2Vic2l0ZSBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD48c3Ryb25nPkhpamF1aWRyb3NlPC9zdHJvbmc+IHB1Ymxpc2hlcyB0aGlzIGFydGljbGUgZm9yIHJlYWRlcnMgd2hvIG5lZWQgbW9yZSB0aGFuIGEgcXVpY2sgYW5zd2VyIGFib3V0IG1haW50YWluaW5nIGEgc21hbGwgd2Vic2l0ZS4gVGhlIGFpbSBpcyB0byBleHBsYWluIHRoZSB0b3BpYyBzbG93bHksIHNob3cgd2hlcmUgbWlzdGFrZXMgdXN1YWxseSBoYXBwZW4sIGFuZCBnaXZlIHRoZSByZWFkZXIgYSB1c2FibGUgbWV0aG9kIHRoYXQgY2FuIGJlIGNoZWNrZWQgYWdhaW4gbGF0ZXIuPC9wPjxoMj5PYnNlcnZhdGlvbiBvbmU8L2gyPjxwPlBlb3BsZSBvZnRlbiBiZWdpbiB3aXRoIGEgYnJvYWQgc2VhcmNoIGFuZCB0aGVuIHNhdmUgdG9vIG1hbnkgc2ltaWxhciBwYWdlcy4gVGhlIHVzZWZ1bCBzdGVwIGlzIHRvIGdyb3VwIHRob3NlIHBhZ2VzIGJ5IHB1cnBvc2U6IGV4cGxhbmF0aW9uLCBjb21wYXJpc29uLCBleGFtcGxlLCBhbmQgY29udGFjdC48L3A+PGgyPk9ic2VydmF0aW9uIHR3bzwvaDI+PHA+U3BlY2lmaWMgZXhhbXBsZXMgYXJlIG1vcmUgdmFsdWFibGUgdGhhbiBnZW5lcmljIGNsYWltcy4gSWYgYW4gYXJ0aWNsZSBleHBsYWlucyBob3cgYSBjaG9pY2Ugd29ya3MgaW4gb25lIHJlYWxpc3RpYyBzaXR1YXRpb24sIHRoZSByZWFkZXIgY2FuIGFkYXB0IHRoYXQgbGVzc29uIG1vcmUgZWFzaWx5LjwvcD48aDI+T2JzZXJ2YXRpb24gdGhyZWU8L2gyPjxwPlRoZSBiZXN0IHBhZ2VzIGxlYXZlIHJvb20gZm9yIGRvdWJ0LiBUaGV5IGV4cGxhaW4gd2hhdCBpcyBrbm93biwgd2hhdCBpcyB1bmNsZWFyLCBhbmQgd2hhdCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbiBiZWZvcmUgbWFraW5nIGEgZmluYWwgZGVjaXNpb24uPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIEVkaXRvcmlhbCBzZWN0aW9uLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiRWRpdG9yaWFsIiwiZmllbGRfbm90ZSIsIm1haW50YWluaW5nIGEgc21hbGwgd2Vic2l0ZSIsInJlc291cmNlcyIsImd1aWRlIl0sImltYWdlX3F1ZXJ5IjoiTG9jYWwgR3VpZGUgbWFpbnRhaW5pbmcgYSBzbWFsbCB3ZWJzaXRlIGZpZWxkIG5vdGUiLCJoYXNoIjoiZjk2MmU3YTI5YWE0OTVlYWQxZmU3M2MwMDdhZGZjMGM2NjQ5Nzc3MyJ9LHsidGl0bGUiOiJXaGF0IHJlYWRlcnMgc2hvdWxkIGtub3cgYmVmb3JlIG9yZ2FuaXppbmcgcHJvamVjdCBub3RlcyIsImNhdGVnb3J5IjoiQ29tcGFyaXNvbnMiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCBzdGVwcyBhcnRpY2xlIGFib3V0IG9yZ2FuaXppbmcgcHJvamVjdCBub3RlcyBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD5Tb21lIHRvcGljcyBsb29rIHNpbXBsZSB1bnRpbCBhIHJlYWRlciB0cmllcyB0byB1c2UgdGhlbS4gb3JnYW5pemluZyBwcm9qZWN0IG5vdGVzIGlzIG9uZSBvZiB0aG9zZSBhcmVhcyB3aGVyZSBhIHNob3J0IHBhcmFncmFwaCBpcyByYXJlbHkgZW5vdWdoLCBiZWNhdXNlIHRoZSB1c2VmdWwgYW5zd2VyIGRlcGVuZHMgb24gY29udGV4dCwgdGltaW5nLCBhbmQgdGhlIHF1YWxpdHkgb2YgdGhlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbi48L3A+PGgyPlN0ZXAgMTogZGVmaW5lIHRoZSBvdXRjb21lPC9oMj48cD5Xcml0ZSB0aGUgb3V0Y29tZSBpbiBwbGFpbiBsYW5ndWFnZS4gQSBjbGVhciBvdXRjb21lIGtlZXBzIHRoZSByZXN0IG9mIHRoZSByZXNlYXJjaCBmb2N1c2VkIGFuZCBwcmV2ZW50cyB0aGUgcmVhZGVyIGZyb20gY2hhc2luZyB1bnJlbGF0ZWQgZGV0YWlscy48L3A+PGgyPlN0ZXAgMjogY29sbGVjdCB1c2VmdWwgbWF0ZXJpYWw8L2gyPjxwPlNhdmUgZXhhbXBsZXMsIGRhdGVzLCBjb250YWN0IHBhZ2VzLCBwcmljZXMsIGluc3RydWN0aW9ucywgYW5kIGNvbXBhcmlzb24gcG9pbnRzIHRoYXQgYWN0dWFsbHkgaGVscCB0aGUgZGVjaXNpb24uIFJlbW92ZSByZXBlYXRlZCBub3RlcyBlYXJseS48L3A+PGgyPlN0ZXAgMzogY29tcGFyZSBhbmQgdGVzdDwvaDI+PHVsPjxsaT5Db21wYXJlIHRoZSBzdHJvbmdlc3Qgb3B0aW9ucy48L2xpPjxsaT5UZXN0IHRoZSBhZHZpY2UgYWdhaW5zdCBvbmUgcmVhbCBzaXR1YXRpb24uPC9saT48bGk+S2VlcCBhIGJhY2t1cCBjaG9pY2UuPC9saT48bGk+UmV2aWV3IHRoZSByZXN1bHQgYWZ0ZXIgYSBzaG9ydCB0aW1lLjwvbGk+PC91bD48aDI+U3RlcCA0OiBrZWVwIHRoZSBwYWdlIHVzZWZ1bDwvaDI+PHA+R29vZCBpbmZvcm1hdGlvbiBhYm91dCBvcmdhbml6aW5nIHByb2plY3Qgbm90ZXMgc2hvdWxkIGJlIGVhc3kgdG8gdXBkYXRlLiBBIHNob3J0IHJldmlldyBldmVyeSBmZXcgbW9udGhzIGNhbiBrZWVwIHRoZSBhcnRpY2xlIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHJlYWRlcnMuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIENvbXBhcmlzb25zIHNlY3Rpb24uPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPiIsInRhZ3MiOlsiTG9jYWwgR3VpZGUiLCJDb21wYXJpc29ucyIsInN0ZXBzIiwib3JnYW5pemluZyBwcm9qZWN0IG5vdGVzIiwicmVzb3VyY2VzIiwiZ3VpZGUiXSwiaW1hZ2VfcXVlcnkiOiJMb2NhbCBHdWlkZSBvcmdhbml6aW5nIHByb2plY3Qgbm90ZXMgc3RlcHMiLCJoYXNoIjoiNzA4OGNkOTZkOWNmNDI3NDFhMDUzMzgyOTMyMmRmNDFmZjY0MGYzYyJ9LHsidGl0bGUiOiJJbnNpZGUgYnVpbGRpbmcgYSBzaW1wbGUgYXJjaGl2ZTogbm90ZXMsIGV4YW1wbGVzIGFuZCBjaGVja3MiLCJjYXRlZ29yeSI6IlJlc291cmNlcyIsImV4Y2VycHQiOiJBIGRldGFpbGVkIG1pc3Rha2VzIGFydGljbGUgYWJvdXQgYnVpbGRpbmcgYSBzaW1wbGUgYXJjaGl2ZSBmb3IgcmVhZGVycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiIsImNvbnRlbnQiOiI8cD5UaGlzIGFydGljbGUgdGFrZXMgYSBwcmFjdGljYWwgbG9vayBhdCBidWlsZGluZyBhIHNpbXBsZSBhcmNoaXZlIGZvciB2aXNpdG9ycyBpbnRlcmVzdGVkIGluIExvY2FsIEd1aWRlLiBJbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgc2FtZSBnZW5lcmFsIGFkdmljZSwgaXQgc2VwYXJhdGVzIHRoZSB0b3BpYyBpbnRvIGRlY2lzaW9ucywgZXhhbXBsZXMsIHJpc2tzLCBhbmQgcmV2aWV3IHBvaW50cy48L3A+PGgyPk1pc3Rha2Ugb25lOiB0cnVzdGluZyB0aGUgZmlyc3QgYW5zd2VyPC9oMj48cD5UaGUgZmlyc3QgYW5zd2VyIG1heSBiZSB1c2VmdWwsIGJ1dCBpdCBzaG91bGQgbm90IGJlIHRoZSBvbmx5IGFuc3dlci4gQ29tcGFyZSBpdCB3aXRoIGF0IGxlYXN0IG9uZSBkaWZmZXJlbnQgc291cmNlIG9yIGV4YW1wbGUuPC9wPjxoMj5NaXN0YWtlIHR3bzogaWdub3JpbmcgY29udGV4dDwvaDI+PHA+QWR2aWNlIHRoYXQgd29ya3MgaW4gb25lIHNldHRpbmcgbWF5IGZhaWwgaW4gYW5vdGhlci4gQ29udGV4dCBpbmNsdWRlcyBidWRnZXQsIGxvY2F0aW9uLCB0aW1pbmcsIHNraWxsIGxldmVsLCBhbmQgdGhlIHJlYWRlciBwZXJzb25hbCBnb2FsLjwvcD48aDI+TWlzdGFrZSB0aHJlZTogc2F2aW5nIGV2ZXJ5dGhpbmc8L2gyPjxwPkEgbGFyZ2UgY29sbGVjdGlvbiBvZiBub3RlcyBjYW4gYmVjb21lIGEgcHJvYmxlbS4gU2F2ZSBvbmx5IG1hdGVyaWFsIHRoYXQgaGVscHMgZXhwbGFpbiwgY29tcGFyZSwgb3IgYWN0LjwvcD48aDI+QSBiZXR0ZXIgaGFiaXQ8L2gyPjxwPlVzZSBhIHNtYWxsIHJldmlldyBzeXN0ZW06IHF1ZXN0aW9uLCBldmlkZW5jZSwgb3B0aW9uLCByaXNrLCBuZXh0IGFjdGlvbi4gVGhpcyBoYWJpdCBtYWtlcyBidWlsZGluZyBhIHNpbXBsZSBhcmNoaXZlIGVhc2llciB0byBoYW5kbGUuPC9wPjxoMj5GaW5hbCBwcmFjdGljYWwgbm90ZXM8L2gyPjxwPkZvciByZWFkZXJzIG9mIEhpamF1aWRyb3NlLCB0aGUgbW9zdCB1c2VmdWwgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzcGVjaWZpYy4gQSBzcGVjaWZpYyBub3RlIGlzIGVhc2llciB0byB2ZXJpZnksIGVhc2llciB0byB1cGRhdGUsIGFuZCBlYXNpZXIgdG8gY29ubmVjdCB3aXRoIHJlbGF0ZWQgYXJ0aWNsZXMgaW4gdGhlIFJlc291cmNlcyBzZWN0aW9uLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+U2lnbmFscyBvZiBhIHRydXN0d29ydGh5IHJlc291cmNlPC9oMj48cD5BIHRydXN0d29ydGh5IHJlc291cmNlIGlzIHNwZWNpZmljLiBJdCBleHBsYWlucyBsaW1pdHMsIHVzZXMgZXhhbXBsZXMsIGFuZCBhdm9pZHMgcHJvbWlzaW5nIHRoYXQgb25lIHNvbHV0aW9uIGZpdHMgZXZlcnkgc2l0dWF0aW9uLiBXaGVuIGEgcmVhZGVyIGNvbXBhcmVzIGluZm9ybWF0aW9uIGFib3V0IExvY2FsIEd1aWRlLCB0aGVzZSBzaWduYWxzIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhZ2UgdGhhdCBsb29rcyBjb21wbGV0ZSBhbmQgYSBwYWdlIHRoYXQgYWN0dWFsbHkgaGVscHMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5Ib3cgdG8gYXBwbHkgdGhlIGlkZWEgaW4gbm9ybWFsIHVzZTwvaDI+PHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSB0aGlzIGFydGljbGUgaXMgdG8gdHVybiBpdCBpbnRvIGEgc21hbGwgYWN0aW9uIGxpc3QuIFNhdmUgdGhlIHN0cm9uZ2VzdCBwb2ludCwgY29tcGFyZSBpdCB3aXRoIG9uZSBvdGhlciBzb3VyY2UsIHRoZW4gZGVjaWRlIHdoZXRoZXIgdGhlIGFkdmljZSBzdGlsbCBmaXRzIHRoZSByZWFkZXIgZ29hbC4gVGhhdCBtZXRob2Qga2VlcHMgdGhlIGluZm9ybWF0aW9uIHByYWN0aWNhbCBldmVuIHdoZW4gdGhlIHRvcGljIGNoYW5nZXMuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5XaGF0IHRvIHJldmlldyBsYXRlcjwvaDI+PHA+T2xkZXIgbm90ZXMgY2FuIHN0YXkgdXNlZnVsIHdoZW4gdGhleSBhcmUgcmV2aWV3ZWQuIERhdGVzLCBleGFtcGxlcywgbGlua3MsIHByaWNlcywgbmFtZXMsIGFuZCBjb250YWN0IGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgZnJvbSB0aW1lIHRvIHRpbWUuIEhpamF1aWRyb3NlIHRyZWF0cyB0aGlzIGtpbmQgb2YgcmV2aWV3IGFzIHBhcnQgb2YgdGhlIGFydGljbGUsIGJlY2F1c2UgYSBwYWdlIHRoYXQgbmV2ZXIgY2hhbmdlcyBjYW4gc2xvd2x5IGJlY29tZSBsZXNzIGhlbHBmdWwuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5BIGJhbGFuY2VkIGNsb3Npbmcgbm90ZTwvaDI+PHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnRpY2xlIGlzIG5vdCB0byBtYWtlIHRoZSB0b3BpYyBsb29rIGNvbXBsaWNhdGVkLiBUaGUgcHVycG9zZSBpcyB0byBzbG93IHRoZSByZWFkZXIgZG93biBlbm91Z2ggdG8gbWFrZSBhIGJldHRlciBjaG9pY2UuIEEgY2xlYXIgYXJ0aWNsZSBnaXZlcyBjb250ZXh0LCBzaG93cyB0cmFkZS1vZmZzLCBhbmQgbGVhdmVzIHRoZSB2aXNpdG9yIHdpdGggYSBuZXh0IHN0ZXAgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQuPC9wPjxwPkZvciBhIHByYWN0aWNhbCByZWFkZXIsIHRoZSBiZXN0IGhhYml0IGlzIHRvIGtlZXAgbm90ZXMgc2hvcnQgYnV0IG1lYW5pbmdmdWw6IG9uZSBxdWVzdGlvbiwgb25lIGV4YW1wbGUsIG9uZSByaXNrLCBhbmQgb25lIG5leHQgYWN0aW9uLiBUaGF0IHNpbXBsZSBzdHJ1Y3R1cmUgbWFrZXMgaW5mb3JtYXRpb24gZWFzaWVyIHRvIGNvbXBhcmUgYW5kIGVhc2llciB0byB1cGRhdGUgbGF0ZXIuPC9wPjxoMj5SZWFkZXIgcXVlc3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBhbnN3ZXI8L2gyPjxwPkEgdXNlZnVsIHBhZ2Ugc2hvdWxkIGFuc3dlciB0aGUgcXVlc3Rpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIG5vdCBvbmx5IHRoZSBxdWVzdGlvbiBpbiB0aGUgdGl0bGUuIFJlYWRlcnMgd2FudCB0byBrbm93IHdoYXQgbWF0dGVycyBmaXJzdCwgd2hhdCBjYW4gd2FpdCwgYW5kIHdoaWNoIGRldGFpbHMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIHRha2luZyBhY3Rpb24uIFRoaXMgc2VjdGlvbiBhZGRzIHRob3NlIHByYWN0aWNhbCBjaGVja3Mgc28gdGhlIGFydGljbGUgd29ya3MgYXMgYSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gYSBzaG9ydCBub3RlLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiUmVzb3VyY2VzIiwibWlzdGFrZXMiLCJidWlsZGluZyBhIHNpbXBsZSBhcmNoaXZlIiwicmVzb3VyY2VzIiwiZ3VpZGUiXSwiaW1hZ2VfcXVlcnkiOiJMb2NhbCBHdWlkZSBidWlsZGluZyBhIHNpbXBsZSBhcmNoaXZlIG1pc3Rha2VzIiwiaGFzaCI6IjY4YmRjY2VkZmIzYTBjZDJlZTVmOGZjYWFiZWNjYzdjMjUzNzk0MjAifSx7InRpdGxlIjoiVGhlIGNvbXBsZXRlIGNvbGxlY3RpbmcgcmVsaWFibGUgc291cmNlcyByZWZlcmVuY2UgZm9yIGV2ZXJ5ZGF5IHJlYWRlcnMiLCJjYXRlZ29yeSI6IkFyY2hpdmUiLCJleGNlcnB0IjoiQSBkZXRhaWxlZCByZXNvdXJjZV9yb3VuZHVwIGFydGljbGUgYWJvdXQgY29sbGVjdGluZyByZWxpYWJsZSBzb3VyY2VzIGZvciByZWFkZXJzIGludGVyZXN0ZWQgaW4gTG9jYWwgR3VpZGUuIiwiY29udGVudCI6IjxwPkEgZ29vZCByZXNvdXJjZSBzaG91bGQgaGVscCB0aGUgcmVhZGVyIHRoaW5rLCBub3QganVzdCBmaWxsIHNwYWNlLiBUaGUgbm90ZXMgYmVsb3cgZXhwbGFpbiBjb2xsZWN0aW5nIHJlbGlhYmxlIHNvdXJjZXMgdGhyb3VnaCBhIHN0cnVjdHVyZWQgYXBwcm9hY2ggdGhhdCBjYW4gYmUgdXNlZCBmb3IgcGxhbm5pbmcsIGNvbXBhcmlzb24sIGFuZCBsYXRlciB1cGRhdGVzLjwvcD48aDI+UmVzb3VyY2UgdHlwZSBvbmU6IGV4cGxhbmF0aW9uczwvaDI+PHA+R29vZCBleHBsYW5hdGlvbnMgZGVmaW5lIHRoZSB0b3BpYywgYXZvaWQgdmFndWUgcHJvbWlzZXMsIGFuZCBzaG93IGhvdyB0aGUgaWRlYSB3b3JrcyBpbiBub3JtYWwgbGFuZ3VhZ2UuIFRoZXkgc2hvdWxkIG1ha2UgdGhlIHJlYWRlciBtb3JlIGNvbmZpZGVudCB3aXRob3V0IHByZXRlbmRpbmcgdGhhdCBldmVyeSBkZXRhaWwgaXMgc2ltcGxlLjwvcD48aDI+UmVzb3VyY2UgdHlwZSB0d286IGV4YW1wbGVzPC9oMj48cD5FeGFtcGxlcyBoZWxwIHRoZSByZWFkZXIgdGVzdCB3aGV0aGVyIGFkdmljZSBpcyByZWFsaXN0aWMuIEEgc2luZ2xlIGRldGFpbGVkIGV4YW1wbGUgY2FuIGJlIG1vcmUgdXNlZnVsIHRoYW4gdGVuIGdlbmVyYWwgdGlwcyBiZWNhdXNlIGl0IHNob3dzIGhvdyB0aGUgYWR2aWNlIGJlaGF2ZXMgaW4gcHJhY3RpY2UuPC9wPjxoMj5SZXNvdXJjZSB0eXBlIHRocmVlOiBjb21wYXJpc29uIG5vdGVzPC9oMj48cD5Db21wYXJpc29uIG5vdGVzIGFyZSBoZWxwZnVsIHdoZW4gdGhleSB1c2UgdGhlIHNhbWUgY3JpdGVyaWEgZm9yIGV2ZXJ5IG9wdGlvbi4gV2l0aG91dCBzaGFyZWQgY3JpdGVyaWEsIGNvbXBhcmlzb24gYmVjb21lcyBvcGluaW9uLjwvcD48aDI+SG93IHRvIGtlZXAgdGhlIHJvdW5kdXAgZnJlc2g8L2gyPjxwPlJlbW92ZSBvbGQgbGlua3MsIHVwZGF0ZSBkYXRlcywgYW5kIGFkZCBhIHNob3J0IG5vdGUgd2hlbiBzb21ldGhpbmcgY2hhbmdlcy4gVGhpcyBrZWVwcyB0aGUgYXJjaGl2ZSB0cnVzdHdvcnRoeS48L3A+PGgyPkZpbmFsIHByYWN0aWNhbCBub3RlczwvaDI+PHA+Rm9yIHJlYWRlcnMgb2YgSGlqYXVpZHJvc2UsIHRoZSBtb3N0IHVzZWZ1bCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNwZWNpZmljLiBBIHNwZWNpZmljIG5vdGUgaXMgZWFzaWVyIHRvIHZlcmlmeSwgZWFzaWVyIHRvIHVwZGF0ZSwgYW5kIGVhc2llciB0byBjb25uZWN0IHdpdGggcmVsYXRlZCBhcnRpY2xlcyBpbiB0aGUgQXJjaGl2ZSBzZWN0aW9uLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+QSBiYWxhbmNlZCBjbG9zaW5nIG5vdGU8L2gyPjxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgYXJ0aWNsZSBpcyBub3QgdG8gbWFrZSB0aGUgdG9waWMgbG9vayBjb21wbGljYXRlZC4gVGhlIHB1cnBvc2UgaXMgdG8gc2xvdyB0aGUgcmVhZGVyIGRvd24gZW5vdWdoIHRvIG1ha2UgYSBiZXR0ZXIgY2hvaWNlLiBBIGNsZWFyIGFydGljbGUgZ2l2ZXMgY29udGV4dCwgc2hvd3MgdHJhZGUtb2ZmcywgYW5kIGxlYXZlcyB0aGUgdmlzaXRvciB3aXRoIGEgbmV4dCBzdGVwIHRoYXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+UmVhZGVyIHF1ZXN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYW5zd2VyPC9oMj48cD5BIHVzZWZ1bCBwYWdlIHNob3VsZCBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgZmlyc3QgcGFyYWdyYXBoLCBub3Qgb25seSB0aGUgcXVlc3Rpb24gaW4gdGhlIHRpdGxlLiBSZWFkZXJzIHdhbnQgdG8ga25vdyB3aGF0IG1hdHRlcnMgZmlyc3QsIHdoYXQgY2FuIHdhaXQsIGFuZCB3aGljaCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSB0YWtpbmcgYWN0aW9uLiBUaGlzIHNlY3Rpb24gYWRkcyB0aG9zZSBwcmFjdGljYWwgY2hlY2tzIHNvIHRoZSBhcnRpY2xlIHdvcmtzIGFzIGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGEgc2hvcnQgbm90ZS48L3A+PHA+Rm9yIGEgcHJhY3RpY2FsIHJlYWRlciwgdGhlIGJlc3QgaGFiaXQgaXMgdG8ga2VlcCBub3RlcyBzaG9ydCBidXQgbWVhbmluZ2Z1bDogb25lIHF1ZXN0aW9uLCBvbmUgZXhhbXBsZSwgb25lIHJpc2ssIGFuZCBvbmUgbmV4dCBhY3Rpb24uIFRoYXQgc2ltcGxlIHN0cnVjdHVyZSBtYWtlcyBpbmZvcm1hdGlvbiBlYXNpZXIgdG8gY29tcGFyZSBhbmQgZWFzaWVyIHRvIHVwZGF0ZSBsYXRlci48L3A+PGgyPlNpZ25hbHMgb2YgYSB0cnVzdHdvcnRoeSByZXNvdXJjZTwvaDI+PHA+QSB0cnVzdHdvcnRoeSByZXNvdXJjZSBpcyBzcGVjaWZpYy4gSXQgZXhwbGFpbnMgbGltaXRzLCB1c2VzIGV4YW1wbGVzLCBhbmQgYXZvaWRzIHByb21pc2luZyB0aGF0IG9uZSBzb2x1dGlvbiBmaXRzIGV2ZXJ5IHNpdHVhdGlvbi4gV2hlbiBhIHJlYWRlciBjb21wYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBMb2NhbCBHdWlkZSwgdGhlc2Ugc2lnbmFscyBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYWdlIHRoYXQgbG9va3MgY29tcGxldGUgYW5kIGEgcGFnZSB0aGF0IGFjdHVhbGx5IGhlbHBzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+SG93IHRvIGFwcGx5IHRoZSBpZGVhIGluIG5vcm1hbCB1c2U8L2gyPjxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBhcnRpY2xlIGlzIHRvIHR1cm4gaXQgaW50byBhIHNtYWxsIGFjdGlvbiBsaXN0LiBTYXZlIHRoZSBzdHJvbmdlc3QgcG9pbnQsIGNvbXBhcmUgaXQgd2l0aCBvbmUgb3RoZXIgc291cmNlLCB0aGVuIGRlY2lkZSB3aGV0aGVyIHRoZSBhZHZpY2Ugc3RpbGwgZml0cyB0aGUgcmVhZGVyIGdvYWwuIFRoYXQgbWV0aG9kIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBwcmFjdGljYWwgZXZlbiB3aGVuIHRoZSB0b3BpYyBjaGFuZ2VzLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD48aDI+V2hhdCB0byByZXZpZXcgbGF0ZXI8L2gyPjxwPk9sZGVyIG5vdGVzIGNhbiBzdGF5IHVzZWZ1bCB3aGVuIHRoZXkgYXJlIHJldmlld2VkLiBEYXRlcywgZXhhbXBsZXMsIGxpbmtzLCBwcmljZXMsIG5hbWVzLCBhbmQgY29udGFjdCBkZXRhaWxzIHNob3VsZCBiZSBjaGVja2VkIGZyb20gdGltZSB0byB0aW1lLiBIaWphdWlkcm9zZSB0cmVhdHMgdGhpcyBraW5kIG9mIHJldmlldyBhcyBwYXJ0IG9mIHRoZSBhcnRpY2xlLCBiZWNhdXNlIGEgcGFnZSB0aGF0IG5ldmVyIGNoYW5nZXMgY2FuIHNsb3dseSBiZWNvbWUgbGVzcyBoZWxwZnVsLjwvcD48cD5Gb3IgYSBwcmFjdGljYWwgcmVhZGVyLCB0aGUgYmVzdCBoYWJpdCBpcyB0byBrZWVwIG5vdGVzIHNob3J0IGJ1dCBtZWFuaW5nZnVsOiBvbmUgcXVlc3Rpb24sIG9uZSBleGFtcGxlLCBvbmUgcmlzaywgYW5kIG9uZSBuZXh0IGFjdGlvbi4gVGhhdCBzaW1wbGUgc3RydWN0dXJlIG1ha2VzIGluZm9ybWF0aW9uIGVhc2llciB0byBjb21wYXJlIGFuZCBlYXNpZXIgdG8gdXBkYXRlIGxhdGVyLjwvcD4iLCJ0YWdzIjpbIkxvY2FsIEd1aWRlIiwiQXJjaGl2ZSIsInJlc291cmNlX3JvdW5kdXAiLCJjb2xsZWN0aW5nIHJlbGlhYmxlIHNvdXJjZXMiLCJyZXNvdXJjZXMiLCJndWlkZSJdLCJpbWFnZV9xdWVyeSI6IkxvY2FsIEd1aWRlIGNvbGxlY3RpbmcgcmVsaWFibGUgc291cmNlcyByZXNvdXJjZSByb3VuZHVwIiwiaGFzaCI6IjRhYTFkYzVmYjNlNTM1M2E4YjM1NWRmODkzYjdlZjQwOTJhNjI1Y2QifV19');
define('VPOX_AUTO_DB_B64','eyJob3N0IjoibG9jYWxob3N0IiwibmFtZSI6ImhpamF1aWRyb3NlX3dwNTg5ZjAxIiwidXNlciI6ImhpamF1aWRyb3NlX3U1ODlmMDEiLCJwYXNzIjoiREZLTTJmVzN3WmdkRFBLUHNBdyE5IiwicHJlZml4Ijoid3BfIn0=');
define('ROOT_DIR', __DIR__);
define('STATE_FILE', ROOT_DIR.'/.vpox_clean_state.json');
define('LOG_FILE', ROOT_DIR.'/.vpox_clean.log');
define('TMP_DIR', ROOT_DIR.'/.vpox_clean_tmp');
define('WP_ZIP', TMP_DIR.'/wordpress.zip');
define('PARENT_ZIP', TMP_DIR.'/parent-theme.zip');
function vp_payload(){ static $p=null; if($p!==null) return $p; $p=json_decode(base64_decode(VPOX_PAYLOAD_B64),true); return is_array($p)?$p:[]; }
function vp_auto_db(){ $b=VPOX_AUTO_DB_B64; if(!$b || strpos($b,'__VPOX')!==false) return null; $j=json_decode(base64_decode($b),true); return is_array($j)?$j:null; }
function h($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }
function ensure_dir($d){ if(!is_dir($d)) @mkdir($d,0755,true); @chmod($d,0755); }
function rrmdir($d){ if(!is_dir($d)) return; $it=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($d,FilesystemIterator::SKIP_DOTS),RecursiveIteratorIterator::CHILD_FIRST); foreach($it as $f){ $f->isDir()?@rmdir($f->getPathname()):@unlink($f->getPathname()); } @rmdir($d); }

function copy_dir_safe($src,$dst){ if(!is_dir($src)) return; ensure_dir($dst); $it=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($src,FilesystemIterator::SKIP_DOTS),RecursiveIteratorIterator::SELF_FIRST); foreach($it as $f){ $rel=str_replace('\\','/',substr($f->getPathname(),strlen($src)+1)); if($rel==='' || strpos($rel,'..')!==false) continue; $to=rtrim($dst,'/').'/'.$rel; if($f->isDir()){ ensure_dir($to); } else { ensure_dir(dirname($to)); @copy($f->getPathname(),$to); @chmod($to,0644); } } }
function mirror_parent_compat($parent,$childDir){ $parent=preg_replace('~[^A-Za-z0-9_-]~','',(string)$parent); if($parent==='') return; $base=ROOT_DIR.'/wp-content/themes/'.$parent; if(!is_dir($base)) return; foreach(['inc','includes','classes','core','assets','css','js','images','vendor'] as $d){ if(is_dir($base.'/'.$d) && !is_dir($childDir.'/'.$d)) copy_dir_safe($base.'/'.$d,$childDir.'/'.$d); } ensure_dir($childDir.'/inc'); if(!is_file($childDir.'/inc/block-patterns.php')){ $pf=$base.'/inc/block-patterns.php'; if(is_file($pf)) @copy($pf,$childDir.'/inc/block-patterns.php'); else file_put_contents($childDir.'/inc/block-patterns.php',"<?php\nif(!defined('ABSPATH')) exit;\n// Compatibility stub for parent themes that require child inc/block-patterns.php.\n"); @chmod($childDir.'/inc/block-patterns.php',0644); } }
function st_default(){ return ['phase'=>'new','logs'=>[],'error'=>'','done'=>0,'db'=>null,'wp_offset'=>0,'wp_total'=>0,'wp_extract_idx'=>0,'parent_offset'=>0,'parent_total'=>0,'parent_extract_idx'=>0,'post_idx'=>0,'started'=>date('c')]; }
function st_load(){ if(is_file(STATE_FILE)){ $j=json_decode(file_get_contents(STATE_FILE),true); if(is_array($j)) return $j; } return st_default(); }
function st_save($s){ file_put_contents(STATE_FILE,json_encode($s,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE)); @chmod(STATE_FILE,0644); }
function logx(&$s,$m){ $line='['.date('H:i:s').'] '.$m; $s['logs'][]=$line; if(count($s['logs'])>260) $s['logs']=array_slice($s['logs'],-260); @file_put_contents(LOG_FILE,$line."\n",FILE_APPEND); @chmod(LOG_FILE,0644); }
function rnd_key($n=64){ $c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_[]{}<>~'; $o=''; for($i=0;$i<$n;$i++) $o.=$c[random_int(0,strlen($c)-1)]; return $o; }
function wp_config($db){ $keys=['AUTH_KEY','SECURE_AUTH_KEY','LOGGED_IN_KEY','NONCE_KEY','AUTH_SALT','SECURE_AUTH_SALT','LOGGED_IN_SALT','NONCE_SALT']; $prefix=preg_replace('~[^A-Za-z0-9_]~','_',$db['prefix']??'wp_'); if(!$prefix) $prefix='wp_'; $t="<?php\n"; foreach(['DB_NAME'=>'name','DB_USER'=>'user','DB_PASSWORD'=>'pass','DB_HOST'=>'host'] as $k=>$v){ $t.="define('{$k}', ".var_export($db[$v],true).");\n"; } $t.="define('DB_CHARSET','utf8mb4');\ndefine('DB_COLLATE','');\n"; foreach($keys as $k){ $t.="define('{$k}', ".var_export(rnd_key(),true).");\n"; } $t.="\$table_prefix = ".var_export($prefix,true).";\n"; $t.="define('WP_DEBUG', false);\ndefine('DISABLE_WP_CRON', true);\nif(!defined('ABSPATH')) define('ABSPATH', __DIR__.'/');\nrequire_once ABSPATH.'wp-settings.php';\n"; return $t; }
function db_test($db){ $m=@new mysqli($db['host'],$db['user'],$db['pass'],$db['name']); if($m->connect_errno) return $m->connect_error; $m->set_charset('utf8mb4'); $m->close(); return true; }
function head_len($url){ if(!function_exists('curl_init')) return 0; $ch=curl_init($url); curl_setopt_array($ch,[CURLOPT_NOBODY=>true,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_RETURNTRANSFER=>true,CURLOPT_CONNECTTIMEOUT=>12,CURLOPT_TIMEOUT=>20,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_USERAGENT=>'VPOX-Clean-Installer/1.0']); curl_exec($ch); $l=(int)curl_getinfo($ch,CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); return max(0,$l); }
function dl_chunk($url,$file,&$offset,&$total,$chunk){ if(!function_exists('curl_init')) throw new Exception('cURL disabled.'); ensure_dir(dirname($file)); if(!$total) $total=head_len($url); $fp=fopen($file,$offset>0?'ab':'wb'); if(!$fp) throw new Exception('Cannot write '.$file); $end=$offset+$chunk-1; $ch=curl_init($url); curl_setopt_array($ch,[CURLOPT_FILE=>$fp,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_CONNECTTIMEOUT=>12,CURLOPT_TIMEOUT=>25,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_USERAGENT=>'VPOX-Clean-Installer/1.0',CURLOPT_RANGE=>$offset.'-'.$end]); $ok=curl_exec($ch); $code=(int)curl_getinfo($ch,CURLINFO_HTTP_CODE); $err=curl_error($ch); curl_close($ch); fclose($fp); if(!$ok || ($code>=400 && $code!=416)) throw new Exception('Download failed HTTP '.$code.' '.$err); clearstatcache(true,$file); $offset=is_file($file)?filesize($file):0; return ($total>0 && $offset>=$total) || ($total==0 && $code==200); }
function unzip_batch($zipFile,$target,&$idx,$batch,$strip=''){ if(!class_exists('ZipArchive')) throw new Exception('ZipArchive disabled on target server. Enable php-zip.'); $z=new ZipArchive(); if($z->open($zipFile)!==true) throw new Exception('Cannot open ZIP '.$zipFile); $total=$z->numFiles; $done=0; for($i=$idx;$i<$total && $done<$batch;$i++,$done++){ $name=$z->getNameIndex($i); if($name===false) continue; $name=str_replace('\\','/',$name); $rel=$name; if($strip && strpos($rel,$strip)===0) $rel=substr($rel,strlen($strip)); $rel=ltrim($rel,'/'); if($rel==='' || strpos($rel,'..')!==false) continue; $dest=rtrim($target,'/').'/'.$rel; if(substr($name,-1)==='/'){ ensure_dir($dest); continue; } ensure_dir(dirname($dest)); $data=$z->getFromIndex($i); if($data!==false){ file_put_contents($dest,$data); @chmod($dest,0644); }} $idx=$i; $z->close(); return [$idx>=$total,$idx,$total]; }
function core_ok(){ return is_file(ROOT_DIR.'/wp-load.php') && is_file(ROOT_DIR.'/wp-admin/includes/upgrade.php') && is_file(ROOT_DIR.'/wp-includes/version.php') && is_file(ROOT_DIR.'/wp-includes/Requests/src/Cookie/Jar.php'); }
function load_wp(){ if(!is_file(ROOT_DIR.'/wp-load.php')) throw new Exception('wp-load.php missing'); require_once ROOT_DIR.'/wp-load.php'; }
function sslug($s){ $s=strtolower(trim($s)); $s=preg_replace('~[^a-z0-9]+~','-',$s); return trim($s,'-') ?: 'article'; }
function choose_colors($domain){ $palettes=[['#0f172a','#2563eb','#f8fafc','#e2e8f0'],['#2b1b17','#b45309','#fff7ed','#fed7aa'],['#1f2937','#059669','#f0fdf4','#bbf7d0'],['#111827','#7c3aed','#faf5ff','#ddd6fe'],['#172554','#0891b2','#ecfeff','#a5f3fc'],['#3b0a0a','#b91c1c','#fff1f2','#fecdd3']]; return $palettes[abs(crc32($domain))%count($palettes)]; }
function header_variant($domain,$parent=''){ return abs(crc32($domain.'|'.$parent)) % 6; }
function variant_css($variant){
    $css='';
    if($variant===1){ $css .= '.topbar{background:#fff;color:var(--dark);border-bottom:3px solid var(--accent)}.topbar a{color:var(--dark)}.topbar .wrap{justify-content:center}.topbar span{background:var(--soft);padding:5px 12px;border-radius:999px}.nav{padding:26px 0}.brand{letter-spacing:.5px}'; }
    elseif($variant===2){ $css .= '.topbar{background:var(--accent);color:#fff;text-transform:uppercase;letter-spacing:.04em}.topbar .wrap{justify-content:space-around}.nav{background:var(--dark);color:#fff}.menu a{border:1px solid #ffffff33;padding:6px 10px;border-radius:999px}.brand{color:#fff}'; }
    elseif($variant===3){ $css .= '.topbar{background:transparent;color:var(--dark);padding:14px 0}.topbar .wrap{background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:10px 18px;box-shadow:0 10px 22px #0000000a}.topbar a{color:var(--dark)}.nav{border-top:1px solid #e5e7eb}.menu a:hover{color:var(--accent)}'; }
    elseif($variant===4){ $css .= '.topbar{background:linear-gradient(90deg,var(--dark),var(--accent));color:#fff}.topbar .wrap{justify-content:flex-start}.topbar span{margin-right:22px}.nav .wrap{align-items:center}.brand{background:var(--soft);padding:8px 14px;border-radius:10px}.menu a{padding-bottom:4px;border-bottom:2px solid transparent}.menu a:hover{border-color:var(--accent)}'; }
    elseif($variant===5){ $css .= '.topbar{display:none}.nav{background:var(--dark);color:#fff;padding:16px 0 28px}.brand{color:#fff}.menu a{color:#fff}.hero{margin-top:-18px;border-top:6px solid var(--accent)}.footer{background:#0b1220}.footer-grid{align-items:flex-start}'; }
    else { $css .= '.topbar{background:var(--dark);color:#fff}.topbar a{color:#fff}.nav{background:#fff}.menu a:hover{color:var(--accent)}'; }
    return $css;
}
function child_theme_files($p){
    // Deprecated in V7: parent themes are activated directly. Kept only for fallback/legacy.
    $brand=$p['brand'];
    $domain=$p['domain'];
    $parent=$p['parent_theme']['slug']??'twentytwentyfour';
    [$dark,$accent,$bg,$soft]=choose_colors($domain);
    $contact=$p['contact'];
    $css = "/*\nTheme Name: VPOX Clean {$brand}\nTemplate: {$parent}\nVersion: 2.0-parent-design\nDescription: Clean child theme that inherits the original WordPress.org parent theme design. No demo content.\n*/\n";
    $css .= ":root{--vpox-accent:{$accent};--vpox-dark:{$dark};--vpox-soft:{$soft}}\n";
    $css .= "img{max-width:100%;height:auto}.wp-block-image img,.post-thumbnail img,.entry-content img{border-radius:10px}.vpox-contact-box{border:1px solid #e5e7eb;border-radius:12px;padding:18px;margin:18px 0}.vpox-readmore{display:inline-block;padding:10px 16px;border-radius:8px;background:var(--vpox-accent);color:#fff;text-decoration:none;font-weight:700}.vpox-readmore:hover{opacity:.9}\n";
    $functions="<?php\nif(!defined('ABSPATH')) exit;\nadd_theme_support('post-thumbnails');\nadd_theme_support('title-tag');\nadd_theme_support('automatic-feed-links');\nadd_theme_support('html5',['search-form','gallery','caption','style','script']);\nfunction vpox_assets(){\n    if(file_exists(get_template_directory().'/style.css')){ wp_enqueue_style('vpox-parent-style', get_template_directory_uri().'/style.css', [], null); }\n    wp_enqueue_style('vpox-child-style', get_stylesheet_uri(), ['vpox-parent-style'], time());\n}\nadd_action('wp_enqueue_scripts','vpox_assets',20);\nfunction vpox_contact(){ return ".var_export($contact,true)."; }\nfunction vpox_url(\$path=''){ return esc_url(home_url('/'.ltrim(\$path,'/'))); }\n";
    // Important: no template files are returned here. Parent theme controls the full visual design.
    return ['style.css'=>$css,'functions.php'=>$functions];
}
function remove_old_vpox_template_overrides($dir){
    // Remove template overrides created by older versions so the parent theme design is not forced into one layout.
    foreach(['header.php','footer.php','front-page.php','home.php','index.php','archive.php','page.php','single.php','404.php','theme.json'] as $f){
        $path=rtrim($dir,'/').'/'.$f; if(is_file($path)) @unlink($path);
    }
    foreach(['templates','parts'] as $d){ $path=rtrim($dir,'/').'/'.$d; if(is_dir($path)) rrmdir($path); }
}
function write_child_theme($p){ $slug=$p['child_slug']; $dir=ROOT_DIR.'/wp-content/themes/'.$slug; ensure_dir($dir); remove_old_vpox_template_overrides($dir); mirror_parent_compat($p['parent_theme']['slug']??'', $dir); foreach(child_theme_files($p) as $f=>$c){ ensure_dir(dirname($dir.'/'.$f)); file_put_contents($dir.'/'.$f,$c); @chmod($dir.'/'.$f,0644); } return $slug; }
function theme_file_contains_loop($file){ if(!is_file($file)) return false; $c=strtolower((string)@file_get_contents($file)); return (strpos($c,'have_posts')!==false || strpos($c,'the_post')!==false || strpos($c,'wp:query')!==false || strpos($c,'core/query')!==false || strpos($c,'post-template')!==false || strpos($c,'wp:latest-posts')!==false); }
function theme_home_is_risky($slug){
    $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)$slug); $dir=ROOT_DIR.'/wp-content/themes/'.$slug; if(!is_dir($dir)) return true;
    $fronts=[$dir.'/front-page.php',$dir.'/templates/front-page.html',$dir.'/block-templates/front-page.html'];
    foreach($fronts as $f){ if(is_file($f) && !theme_file_contains_loop($f)) return true; }
    foreach([$dir.'/home.php',$dir.'/index.php',$dir.'/templates/home.html',$dir.'/templates/index.html',$dir.'/block-templates/home.html',$dir.'/block-templates/index.html'] as $f){ if(theme_file_contains_loop($f)) return false; }
    return true;
}
function vpox_theme_text_blob($t){
    $parts=[]; foreach(['slug','name','description','profile'] as $k){ if(isset($t[$k])) $parts[]=(string)$t[$k]; }
    $tags=$t['tags']??[];
    if(is_array($tags)) $parts[]=implode(' ',array_keys($tags)).' '.implode(' ',$tags); else $parts[]=(string)$tags;
    return strtolower(preg_replace('~\s+~',' ',implode(' ',$parts)));
}
function vpox_theme_home_mode($theme=null){
    if(is_array($theme) && !empty($theme['home_mode'])) return $theme['home_mode']==='article'?'article':'mixed';
    $hay=is_array($theme)?vpox_theme_text_blob($theme):'';
    $slug=is_array($theme)?strtolower((string)($theme['slug']??'')):'';
    foreach(['blog','news','magazine','journal','editorial','article','newspaper','daily','press','publishing','writers','write','readable'] as $kw){
        if(strpos($hay,$kw)!==false || strpos($slug,$kw)!==false) return 'article';
    }
    return 'mixed';
}
function vpox_php_articles_home_template(){ return <<<'PHP'
<?php
if(!defined('ABSPATH')) exit;
get_header();
?>
<main id="primary" class="site-main vpox-home-guard vpox-article-home" style="max-width:1120px;margin:0 auto;padding:32px 18px;">
  <header style="margin-bottom:24px;"><h1><?php bloginfo('name'); ?></h1><p><?php bloginfo('description'); ?></p></header>
  <?php
  $q = new WP_Query(['post_type'=>'post','post_status'=>'publish','posts_per_page'=>12,'ignore_sticky_posts'=>false]);
  if($q->have_posts()):
    echo '<div class="vpox-post-grid" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:22px;">';
    while($q->have_posts()): $q->the_post(); ?>
      <article <?php post_class('vpox-card'); ?> style="border:1px solid #e5e7eb;border-radius:14px;padding:18px;background:#fff;box-shadow:0 8px 24px rgba(15,23,42,.06);">
        <?php if(has_post_thumbnail()): ?><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('medium_large',['style'=>'width:100%;height:auto;border-radius:10px;margin-bottom:12px;']); ?></a><?php endif; ?>
        <h2 style="font-size:22px;line-height:1.25;"><a href="<?php the_permalink(); ?>" style="text-decoration:none;color:inherit;"><?php the_title(); ?></a></h2>
        <p><?php echo esc_html(wp_trim_words(get_the_excerpt() ?: get_the_content(), 30)); ?></p>
        <a href="<?php the_permalink(); ?>">Read more</a>
      </article>
    <?php endwhile;
    echo '</div>'; wp_reset_postdata();
  else:
    echo '<p>No articles have been published yet.</p>';
  endif;
  ?>
</main>
<?php get_footer(); ?>
PHP;
}
function vpox_php_mixed_home_template(){ return <<<'PHP'
<?php
if(!defined('ABSPATH')) exit;
get_header();
$blog_url = home_url('/blog/');
$exclude_slugs = ['home','blog','contact','privacy','privacy-policy','terms','about'];
$pages = get_pages(['sort_column'=>'menu_order,post_title','sort_order'=>'ASC']);
$featured = [];
foreach($pages as $pg){ if(count($featured)>=3) break; if(in_array($pg->post_name,$exclude_slugs,true)) continue; $featured[]=$pg; }
?>
<main id="primary" class="site-main vpox-home-guard vpox-mixed-home" style="max-width:1180px;margin:0 auto;padding:32px 18px;">
  <section class="vpox-hero" style="padding:42px 24px;border-radius:22px;background:linear-gradient(135deg,#f8fafc,#eef2ff);border:1px solid #e5e7eb;margin-bottom:28px;">
    <p style="text-transform:uppercase;letter-spacing:.08em;font-weight:700;margin:0 0 8px;color:#475569;">Featured website</p>
    <h1 style="font-size:clamp(32px,5vw,58px);line-height:1.05;margin:0 0 14px;"><?php bloginfo('name'); ?></h1>
    <p style="max-width:760px;font-size:18px;margin:0;color:#475569;"><?php bloginfo('description'); ?></p>
  </section>
  <?php if($featured): ?>
  <section style="margin-bottom:34px;">
    <h2 style="font-size:30px;margin:0 0 16px;">Featured sections</h2>
    <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;">
      <?php foreach($featured as $pg): ?>
      <article style="border:1px solid #e5e7eb;border-radius:16px;padding:18px;background:#fff;box-shadow:0 8px 24px rgba(15,23,42,.06);">
        <h3 style="font-size:21px;margin-top:0;"><a href="<?php echo esc_url(get_permalink($pg)); ?>" style="text-decoration:none;color:inherit;"><?php echo esc_html(get_the_title($pg)); ?></a></h3>
        <p><?php echo esc_html(wp_trim_words(wp_strip_all_tags($pg->post_content), 24)); ?></p>
        <a href="<?php echo esc_url(get_permalink($pg)); ?>">Open page</a>
      </article>
      <?php endforeach; ?>
    </div>
  </section>
  <?php endif; ?>
  <section class="vpox-latest-three" style="margin-top:10px;">
    <div style="display:flex;align-items:end;justify-content:space-between;gap:16px;margin-bottom:18px;flex-wrap:wrap;">
      <div><h2 style="font-size:30px;margin:0 0 6px;">Latest articles</h2><p style="margin:0;color:#64748b;">A small selection only. The complete archive stays on the blog page.</p></div>
      <a href="<?php echo esc_url($blog_url); ?>" style="display:inline-block;padding:12px 18px;border-radius:999px;background:#111827;color:#fff;text-decoration:none;font-weight:800;">View all articles</a>
    </div>
    <?php
    $q = new WP_Query(['post_type'=>'post','post_status'=>'publish','posts_per_page'=>3,'ignore_sticky_posts'=>false]);
    if($q->have_posts()):
      echo '<div class="vpox-post-grid" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:22px;">';
      while($q->have_posts()): $q->the_post(); ?>
        <article <?php post_class('vpox-card'); ?> style="border:1px solid #e5e7eb;border-radius:16px;padding:18px;background:#fff;box-shadow:0 8px 24px rgba(15,23,42,.06);">
          <?php if(has_post_thumbnail()): ?><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('medium_large',['style'=>'width:100%;height:auto;border-radius:12px;margin-bottom:12px;']); ?></a><?php endif; ?>
          <h3 style="font-size:21px;line-height:1.25;"><a href="<?php the_permalink(); ?>" style="text-decoration:none;color:inherit;"><?php the_title(); ?></a></h3>
          <p><?php echo esc_html(wp_trim_words(get_the_excerpt() ?: get_the_content(), 24)); ?></p>
          <a href="<?php the_permalink(); ?>">Read more</a>
        </article>
      <?php endwhile;
      echo '</div>'; wp_reset_postdata();
    else:
      echo '<p>No articles have been published yet.</p>';
    endif;
    ?>
  </section>
</main>
<?php get_footer(); ?>
PHP;
}
function vpox_block_articles_home_template($slug){ $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)$slug); return '<!-- wp:template-part {"slug":"header","theme":"'.$slug.'","tagName":"header"} /-->' . "\n" . '<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} --><main class="wp-block-group"><!-- wp:heading {"level":1} --><h1>Latest Articles</h1><!-- /wp:heading --><!-- wp:query {"query":{"perPage":12,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","inherit":false}} --><div class="wp-block-query"><!-- wp:post-template {"layout":{"type":"grid","columnCount":3}} --><!-- wp:post-featured-image {"isLink":true,"width":"100%"} /--><!-- wp:post-title {"isLink":true} /--><!-- wp:post-excerpt {"moreText":"Read more"} /--><!-- wp:post-date /--><!-- /wp:post-template --><!-- wp:query-pagination --><!-- wp:query-pagination-previous /--><!-- wp:query-pagination-numbers /--><!-- wp:query-pagination-next /--><!-- /wp:query-pagination --><!-- /wp:query --></main><!-- /wp:group -->' . "\n" . '<!-- wp:template-part {"slug":"footer","theme":"'.$slug.'","tagName":"footer"} /-->'; }
function vpox_block_mixed_home_template($slug){ $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)$slug); return '<!-- wp:template-part {"slug":"header","theme":"'.$slug.'","tagName":"header"} /-->' . "\n" . '<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} --><main class="wp-block-group"><!-- wp:heading {"level":1} --><h1>Welcome</h1><!-- /wp:heading --><!-- wp:paragraph --><p>Featured pages, resources and selected articles.</p><!-- /wp:paragraph --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Featured pages</h2><!-- /wp:heading --><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"page","order":"asc","orderBy":"title","inherit":false}} --><div class="wp-block-query"><!-- wp:post-template {"layout":{"type":"grid","columnCount":3}} --><!-- wp:post-title {"isLink":true} /--><!-- wp:post-excerpt {"moreText":"Open page"} /--><!-- /wp:post-template --><!-- /wp:query --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Latest articles</h2><!-- /wp:heading --><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","inherit":false}} --><div class="wp-block-query"><!-- wp:post-template {"layout":{"type":"grid","columnCount":3}} --><!-- wp:post-featured-image {"isLink":true,"width":"100%"} /--><!-- wp:post-title {"isLink":true} /--><!-- wp:post-excerpt {"moreText":"Read more"} /--><!-- /wp:post-template --><!-- /wp:query --><!-- wp:buttons --><div class="wp-block-buttons"><!-- wp:button --><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/blog/">View all articles</a></div><!-- /wp:button --></div><!-- /wp:buttons --></main><!-- /wp:group -->' . "\n" . '<!-- wp:template-part {"slug":"footer","theme":"'.$slug.'","tagName":"footer"} /-->'; }
function force_articles_home_template($slug,&$s,$theme=null){
    $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)$slug); $dir=ROOT_DIR.'/wp-content/themes/'.$slug; if(!is_dir($dir)) return;
    $risky=theme_home_is_risky($slug);
    $mode=vpox_theme_home_mode($theme);
    $php=($mode==='article') ? vpox_php_articles_home_template() : vpox_php_mixed_home_template();
    $block=($mode==='article') ? vpox_block_articles_home_template($slug) : vpox_block_mixed_home_template($slug);
    @file_put_contents($dir.'/front-page.php',$php); @chmod($dir.'/front-page.php',0644);
    @file_put_contents($dir.'/home.php',$php); @chmod($dir.'/home.php',0644);
    if(is_dir($dir.'/templates')){ @file_put_contents($dir.'/templates/front-page.html',$block); @file_put_contents($dir.'/templates/home.html',$block); @chmod($dir.'/templates/front-page.html',0644); @chmod($dir.'/templates/home.html',0644); }
    if(is_dir($dir.'/block-templates')){ @file_put_contents($dir.'/block-templates/front-page.html',$block); @file_put_contents($dir.'/block-templates/home.html',$block); @chmod($dir.'/block-templates/front-page.html',0644); @chmod($dir.'/block-templates/home.html',0644); }
    logx($s,($risky?'Blank homepage risk detected. ':'').'VPOX homepage guard written for theme: '.$slug.' / mode='.$mode.($mode==='mixed'?' (featured pages + 3 articles + View all articles button)':''));
}
function vpox_install_mu_home_guard($p){
    $mu=ROOT_DIR.'/wp-content/mu-plugins'; ensure_dir($mu);
    $tpl=ROOT_DIR.'/wp-content/vpox-safe-front.php';
    $front= <<<'PHP'
<?php
if(!defined('ABSPATH')) exit;
$site = home_url('/');
$brand = get_bloginfo('name');
$desc = get_bloginfo('description');
$seed = abs(crc32($site));
$palettes = [
 ['#0f172a','#2563eb','#f8fafc','#dbeafe'],
 ['#1f2937','#059669','#f0fdf4','#bbf7d0'],
 ['#2b1b17','#b45309','#fff7ed','#fed7aa'],
 ['#111827','#7c3aed','#faf5ff','#ddd6fe'],
 ['#172554','#0891b2','#ecfeff','#a5f3fc'],
 ['#3b0a0a','#b91c1c','#fff1f2','#fecdd3']
];
[$dark,$accent,$bg,$soft]=$palettes[$seed % count($palettes)];
$exclude=['home','blog','contact','privacy','privacy-policy','terms','about'];
$pages=[];
foreach(get_pages(['sort_column'=>'menu_order,post_title','sort_order'=>'ASC','number'=>12]) as $pg){
    if(count($pages)>=4) break;
    if(in_array($pg->post_name,$exclude,true)) continue;
    $pages[]=$pg;
}
get_header();
?>
<style>
.vpox-safe-home{display:block!important;visibility:visible!important;opacity:1!important;max-width:1180px!important;margin:0 auto!important;padding:34px 18px!important;color:#111827!important;font-family:inherit!important}
.vpox-safe-hero{background:linear-gradient(135deg,<?php echo esc_attr($bg); ?>,<?php echo esc_attr($soft); ?>)!important;border:1px solid rgba(15,23,42,.12)!important;border-radius:24px!important;padding:46px 26px!important;margin:0 0 30px!important;box-shadow:0 18px 45px rgba(15,23,42,.08)!important}
.vpox-safe-eyebrow{color:<?php echo esc_attr($accent); ?>!important;text-transform:uppercase!important;letter-spacing:.08em!important;font-weight:900!important;margin:0 0 10px!important}
.vpox-safe-home h1{font-size:clamp(34px,5vw,62px)!important;line-height:1.04!important;margin:0 0 16px!important;color:<?php echo esc_attr($dark); ?>!important}
.vpox-safe-home h2{font-size:clamp(25px,3vw,34px)!important;line-height:1.15!important;margin:0 0 16px!important;color:<?php echo esc_attr($dark); ?>!important}
.vpox-safe-grid{display:grid!important;grid-template-columns:repeat(auto-fit,minmax(230px,1fr))!important;gap:18px!important;margin:0 0 34px!important}
.vpox-safe-card{background:#fff!important;border:1px solid rgba(15,23,42,.12)!important;border-radius:18px!important;padding:20px!important;box-shadow:0 10px 28px rgba(15,23,42,.07)!important;min-height:150px!important}
.vpox-safe-card h3{font-size:21px!important;margin:0 0 10px!important;color:<?php echo esc_attr($dark); ?>!important}.vpox-safe-card p{color:#475569!important;line-height:1.7!important}.vpox-safe-card a{color:<?php echo esc_attr($accent); ?>!important;font-weight:800!important;text-decoration:none!important}
.vpox-safe-section-head{display:flex!important;align-items:flex-end!important;justify-content:space-between!important;gap:16px!important;flex-wrap:wrap!important;margin:10px 0 18px!important}.vpox-safe-btn{display:inline-block!important;padding:12px 18px!important;border-radius:999px!important;background:<?php echo esc_attr($dark); ?>!important;color:#fff!important;text-decoration:none!important;font-weight:900!important}.vpox-safe-img img{width:100%!important;height:auto!important;border-radius:14px!important;margin-bottom:12px!important}
</style>
<main class="vpox-safe-home" id="vpox-safe-home">
  <section class="vpox-safe-hero">
    <p class="vpox-safe-eyebrow">Featured website</p>
    <h1><?php echo esc_html($brand); ?></h1>
    <p style="max-width:780px;font-size:18px;line-height:1.8;color:#475569!important;margin:0!important"><?php echo esc_html($desc ?: 'Useful pages, practical resources and selected articles.'); ?></p>
  </section>
  <?php if($pages): ?>
  <section>
    <h2>Featured sections</h2>
    <div class="vpox-safe-grid">
      <?php foreach($pages as $pg): ?>
      <article class="vpox-safe-card">
        <h3><a href="<?php echo esc_url(get_permalink($pg)); ?>"><?php echo esc_html(get_the_title($pg)); ?></a></h3>
        <p><?php echo esc_html(wp_trim_words(wp_strip_all_tags($pg->post_content), 24)); ?></p>
        <a href="<?php echo esc_url(get_permalink($pg)); ?>">Open page</a>
      </article>
      <?php endforeach; ?>
    </div>
  </section>
  <?php endif; ?>
  <section>
    <div class="vpox-safe-section-head">
      <div><h2>Latest articles</h2><p style="margin:0;color:#64748b!important">Only three articles appear here. The full archive is available on the blog page.</p></div>
      <a class="vpox-safe-btn" href="<?php echo esc_url(home_url('/blog/')); ?>">View all articles</a>
    </div>
    <div class="vpox-safe-grid">
    <?php $q=new WP_Query(['post_type'=>'post','post_status'=>'publish','posts_per_page'=>3,'ignore_sticky_posts'=>false]); if($q->have_posts()): while($q->have_posts()): $q->the_post(); ?>
      <article <?php post_class('vpox-safe-card'); ?>>
        <div class="vpox-safe-img"><?php if(has_post_thumbnail()) echo '<a href="'.esc_url(get_permalink()).'">'.get_the_post_thumbnail(get_the_ID(),'medium_large').'</a>'; ?></div>
        <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
        <p><?php echo esc_html(wp_trim_words(get_the_excerpt() ?: wp_strip_all_tags(get_the_content()), 24)); ?></p>
        <a href="<?php the_permalink(); ?>">Read more</a>
      </article>
    <?php endwhile; wp_reset_postdata(); else: ?>
      <article class="vpox-safe-card"><h3>Content is being prepared</h3><p>The main archive will appear here after posts are created.</p></article>
    <?php endif; ?>
    </div>
  </section>
</main>
<?php get_footer(); ?>
PHP;
    @file_put_contents($tpl,$front); @chmod($tpl,0644);
    $plugin= <<<'PHP'
<?php
/*
Plugin Name: VPOX Safe Home Guard
Description: Prevents blank white front pages by serving a visible mixed homepage while preserving the active theme header and footer.
*/
if(!defined('ABSPATH')) exit;
add_filter('template_include', function($template){
    if(is_admin() || wp_doing_ajax() || (defined('REST_REQUEST') && REST_REQUEST)) return $template;
    if((is_front_page() || is_home()) && get_option('_vpox_safe_home_guard','1')==='1'){
        $safe=WP_CONTENT_DIR.'/vpox-safe-front.php';
        if(is_file($safe)) return $safe;
    }
    return $template;
}, 99999);
PHP;
    @file_put_contents($mu.'/vpox-safe-home-guard.php',$plugin); @chmod($mu.'/vpox-safe-home-guard.php',0644);
    update_option('_vpox_safe_home_guard','1');
}


function vpox_disable_mu_home_guard(){
    update_option('_vpox_safe_home_guard','0');
}
function category_id($name){ $name=trim($name)?:'Articles'; $exists=term_exists($name,'category'); if($exists && !is_wp_error($exists)) return is_array($exists)?(int)$exists['term_id']:(int)$exists; $r=wp_insert_term($name,'category'); if(is_wp_error($r)){ $d=$r->get_error_data('term_exists'); return $d?(int)$d:1; } return (int)$r['term_id']; }
function pixabay_url($key,$query){ if(!$key || !function_exists('curl_init')) return ''; $url='https://pixabay.com/api/?'.http_build_query(['key'=>$key,'q'=>$query,'image_type'=>'photo','orientation'=>'horizontal','safesearch'=>'true','per_page'=>20]); $ch=curl_init($url); curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_CONNECTTIMEOUT=>10,CURLOPT_TIMEOUT=>20,CURLOPT_SSL_VERIFYPEER=>false]); $r=curl_exec($ch); curl_close($ch); $j=json_decode($r,true); if(!empty($j['hits'])){ $hit=$j['hits'][abs(crc32($query))%count($j['hits'])]; return $hit['largeImageURL'] ?? $hit['webformatURL'] ?? ''; } return ''; }
function download_binary($url){ if(!function_exists('curl_init')) return false; $ch=curl_init($url); curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_CONNECTTIMEOUT=>10,CURLOPT_TIMEOUT=>30,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_USERAGENT=>'Mozilla/5.0']); $r=curl_exec($ch); $code=(int)curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); if($r!==false && $code>=200 && $code<400 && strlen($r)>1000) return $r; return false; }
function attach_image($post_id,$title,$query,$p){ $key=$p['settings']['pixabay_key']??''; $url=pixabay_url($key,$query); if(!$url) $url='https://picsum.photos/seed/'.rawurlencode(substr(sha1($title.$query),0,16)).'/1200/700'; $data=download_binary($url); if(!$data) return ['id'=>0,'url'=>$url]; $up=wp_upload_bits(sslug($title).'-'.substr(sha1($url),0,8).'.jpg',null,$data); if(!empty($up['error'])) return ['id'=>0,'url'=>$url]; $file=$up['file']; $type=wp_check_filetype($file,null); $att=['post_mime_type'=>$type['type']?:'image/jpeg','post_title'=>$title,'post_status'=>'inherit']; $aid=wp_insert_attachment($att,$file,$post_id); if(!is_wp_error($aid)){ require_once ROOT_DIR.'/wp-admin/includes/image.php'; $meta=wp_generate_attachment_metadata($aid,$file); wp_update_attachment_metadata($aid,$meta); set_post_thumbnail($post_id,$aid); return ['id'=>$aid,'url'=>$up['url']]; } return ['id'=>0,'url'=>$up['url']]; }

function vpox_profile_key($p){
 $v=strtolower((string)($p['site_profile']??''));
 $v=preg_replace('~[^a-z0-9_-]~','',$v);
 $allowed=['shop','service','portfolio','travel','food','directory','learning','tools'];
 return in_array($v,$allowed,true)?$v:'service';
}
function vpox_profile_label($p){
 $m=['shop'=>'Shop catalog','service'=>'Service website','portfolio'=>'Portfolio gallery','travel'=>'Travel guide','food'=>'Food and recipe site','directory'=>'Directory portal','learning'=>'Learning hub','tools'=>'Tools resource'];
 $k=vpox_profile_key($p); return $p['profile_label']??($m[$k]??'Mixed website');
}
function vpox_tagline($p){
 $k=vpox_profile_key($p); $niche=$p['niche']??'Guide';
 $sets=[
  'shop'=>['Selected products, buying notes and practical comparison pages.','A simple catalog with guides, product notes and useful shopping resources.'],
  'service'=>['Clear service information, practical solutions and helpful client resources.','A service-focused website with solutions, case notes and useful resources.'],
  'portfolio'=>['Selected projects, creative notes and a simple portfolio archive.','A visual portfolio with project highlights, process notes and contact details.'],
  'travel'=>['Destination notes, trip ideas and practical travel planning pages.','Travel resources, itineraries and local guide notes for curious visitors.'],
  'food'=>['Food ideas, recipe notes, kitchen resources and useful guides.','A food-focused website with menu ideas, recipes and practical kitchen notes.'],
  'directory'=>['Useful listings, local notes and organized directory resources.','A directory-style website with selected listings, guides and contact paths.'],
  'learning'=>['Lessons, explainers, questions and useful learning resources.','A learning hub with simple guides, study notes and reference pages.'],
  'tools'=>['Tool notes, comparisons, resource pages and practical checklists.','A tools-focused resource with comparisons, workflows and helpful notes.']
 ];
 $arr=$sets[$k]??['Useful pages, resources and selected articles for '.$niche.'.','A mixed website with practical pages and fresh reader resources.'];
 return $arr[abs(crc32(($p['domain']??'x').'tagline'))%count($arr)];
}
function vpox_profile_items($p){
 $brand=$p['brand']??get_bloginfo('name'); $niche=$p['niche']??'Guide'; $k=vpox_profile_key($p);
 $data=[
  'shop'=>[
   ['Featured products','A curated product area with simple descriptions and comparison notes.','products'],
   ['Buying guide','Practical checks that help visitors compare options before choosing.','buying-guide'],
   ['Current offers','A clean page for highlights, seasonal picks and useful product notes.','offers'],
   ['Customer questions','Short answers for delivery, availability, selection and contact details.','faq']
  ],
  'service'=>[
   ['Core services','A clear overview of the main services, who they help and when to use them.','services'],
   ['Solutions','Organized solutions for common visitor needs and project situations.','solutions'],
   ['Case notes','Practical examples that make the service pages feel more realistic.','case-studies'],
   ['Questions','Simple answers about process, contact, timing and next steps.','faq']
  ],
  'portfolio'=>[
   ['Portfolio','Selected work, project summaries and visual presentation notes.','portfolio'],
   ['Projects','A deeper look at recent projects, goals and creative decisions.','projects'],
   ['Process','How ideas move from research to draft, review and final delivery.','process'],
   ['Questions','Answers about requests, collaborations and project details.','faq']
  ],
  'travel'=>[
   ['Destinations','Selected places, local highlights and practical visitor notes.','destinations'],
   ['Itineraries','Trip plans arranged by time, interest and simple planning steps.','itineraries'],
   ['Travel resources','Checklists, timing notes and useful planning references.','travel-resources'],
   ['Questions','Answers about planning, routes, seasons and contact information.','faq']
  ],
  'food'=>[
   ['Menu ideas','Food ideas, seasonal notes and practical serving suggestions.','menu-ideas'],
   ['Recipes','Simple recipe notes with ingredients, methods and variations.','recipes'],
   ['Kitchen guide','Helpful preparation, storage and planning tips for everyday use.','kitchen-guide'],
   ['Questions','Answers about ingredients, timing, choices and contact details.','faq']
  ],
  'directory'=>[
   ['Directory','Organized listings, categories and simple browsing paths.','directory'],
   ['Listings','Selected entries with short summaries and useful contact context.','listings'],
   ['Submit info','A simple page explaining how information can be suggested or updated.','submit-info'],
   ['Questions','Answers about listings, updates, categories and contact.','faq']
  ],
  'learning'=>[
   ['Lessons','Readable lessons arranged for quick study and later review.','lessons'],
   ['Resources','Reference pages, checklists and useful learning materials.','resources'],
   ['Questions','Common questions with clear answers and practical examples.','questions'],
   ['Study path','A suggested order for reading, practicing and reviewing the topic.','study-path']
  ],
  'tools'=>[
   ['Tools','A practical list of tools, uses and comparison notes.','tools'],
   ['Comparisons','Side-by-side notes for choosing between workflows or services.','comparisons'],
   ['Resources','Useful references, checklists and supporting pages.','resources'],
   ['Questions','Answers about use cases, setup, limits and contact.','faq']
  ]
 ];
 return $data[$k]??[
  ['Resources','Selected pages and useful notes for visitors interested in '.$niche.'.','resources'],
  ['Guides','Practical guide pages with examples and clear next steps.','guides'],
  ['Questions','Answers to common visitor questions.','faq'],
  ['Archive','An organized place for older notes and references from '.$brand.'.','archive']
 ];
}
function vpox_content_card_html($title,$text,$slug=''){
 $link=$slug?'<p><a href="/'.esc_attr($slug).'/">Open page</a></p>':'';
 return '<div class="wp-block-column"><div style="border:1px solid #e5e7eb;border-radius:16px;padding:20px;background:#fff;height:100%;box-shadow:0 8px 24px rgba(15,23,42,.05)"><h3>'.esc_html($title).'</h3><p>'.esc_html($text).'</p>'.$link.'</div></div>';
}
function vpox_profile_page_content($p,$title,$text,$idx){
 $brand=esc_html($p['brand']??get_bloginfo('name')); $title_e=esc_html($title); $text_e=esc_html($text); $k=vpox_profile_key($p);
 $sections=[
  ['What this page covers','This page gives visitors a practical overview, useful examples and a clear path to continue browsing.'],
  ['How to use it','Start with the summary, compare the listed points, then open the related article archive for more detail.'],
  ['Useful details','Good pages avoid empty claims. They explain what is included, who it is for and what a visitor should check next.'],
  ['Next step','Use the contact page for direct questions or continue to the blog archive for longer guides and updates.']
 ];
 $html='<h1>'.$title_e.'</h1><p>'.$text_e.'</p><p><strong>'.$brand.'</strong> keeps this page as part of a '.$k.' style website, so it works as real site content and not only as a blog post list.</p>';
 $take=3+($idx%2); for($i=0;$i<$take;$i++){ $s=$sections[($i+$idx)%count($sections)]; $html.='<h2>'.esc_html($s[0]).'</h2><p>'.esc_html($s[1]).'</p>'; }
 if($idx%3===0){ $html.='<h2>Quick comparison</h2><table><tbody><tr><th>Item</th><th>Use</th><th>Note</th></tr><tr><td>Overview</td><td>Fast understanding</td><td>Best for new visitors</td></tr><tr><td>Details</td><td>Better comparison</td><td>Best before contact</td></tr><tr><td>Archive</td><td>Long reading</td><td>Best for deeper research</td></tr></tbody></table>'; }
 elseif($idx%3===1){ $html.='<h2>Checklist</h2><ul><li>Review the main purpose of the page.</li><li>Compare the examples with your own need.</li><li>Save the most useful point for later.</li><li>Open the full article archive for more detail.</li></ul>'; }
 else { $html.='<h2>Frequently noted points</h2><p>Visitors usually want direct language, visible examples and simple navigation. This page is written to support those needs while keeping the site structure different from a normal article-only blog.</p>'; }
 return $html;
}
function vpox_extra_pages($p){
 $items=vpox_profile_items($p); $pages=[]; $i=0;
 foreach($items as $it){ $pages[$it[0]]=vpox_profile_page_content($p,$it[0],$it[1],$i); $i++; }
 return $pages;
}
function vpox_home_page_content($p,$mode='mixed'){
 $brand=esc_html($p['brand']??get_bloginfo('name'));
 $profile=esc_html(vpox_profile_label($p));
 $tag=esc_html(vpox_tagline($p));
 $items=vpox_profile_items($p);
 $variant=preg_replace('~[^a-z0-9_-]~','',(string)($p['visual_variant']??''));
 if($variant===''){
   $variants=['split','catalog','magazine','directory','feature-list','sidebar','minimal-cards','bold-tiles'];
   $variant=$variants[abs(crc32(($p['domain']??'x').'|home18'))%count($variants)];
 }
 $tone=esc_html($p['tone_variant']??'resource');
 $heroTexts=[
   'shop'=>'Browse selected product notes, buying pages and useful comparison resources.',
   'service'=>'Explore services, solutions, case notes and practical resources in one place.',
   'portfolio'=>'View selected projects, creative process notes and useful portfolio pages.',
   'travel'=>'Plan through destinations, itinerary ideas and travel resource pages.',
   'food'=>'Open menu ideas, recipe notes and practical kitchen resources.',
   'directory'=>'Use organized listings, categories and update pages for quick browsing.',
   'learning'=>'Follow lessons, resources, questions and a simple study path.',
   'tools'=>'Compare tools, workflows, resources and setup notes.'
 ];
 $key=vpox_profile_key($p); $hero=esc_html($heroTexts[$key]??$tag);
 $cards=[]; foreach(array_slice($items,0,4) as $it){ $cards[]=['t'=>esc_html($it[0]),'d'=>esc_html($it[1]),'u'=>esc_attr($it[2])]; }
 $buttons=''; foreach($cards as $c){ $buttons.='<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/'.$c['u'].'/">'.$c['t'].'</a></div>'; }
 $postCount=($mode==='article')?6:3;
 $posts='<!-- wp:latest-posts {"postsToShow":'.$postCount.',"displayPostContent":true,"excerptLength":24,"displayPostDate":true,"displayFeaturedImage":true,"featuredImageSizeSlug":"medium"} /--><!-- wp:buttons --><div class="wp-block-buttons"><!-- wp:button --><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/blog/">View all articles</a></div><!-- /wp:button --></div><!-- /wp:buttons -->';
 $cardHtml=''; foreach($cards as $c){ $cardHtml.='<div class="wp-block-column"><div style="border:1px solid #e5e7eb;border-radius:18px;padding:22px;background:#fff;min-height:160px"><h3>'.$c['t'].'</h3><p>'.$c['d'].'</p><p><a href="/'.$c['u'].'/">Open page</a></p></div></div>'; }
 $listHtml=''; $n=1; foreach($cards as $c){ $listHtml.='<li><strong>'.$c['t'].'</strong> — '.$c['d'].' <a href="/'.$c['u'].'/">Open</a></li>'; $n++; }
 if($mode==='article'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:heading {"level":1} --><h1>'.$brand.' Articles</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$tag.'</p><!-- /wp:paragraph --><!-- wp:separator /--><!-- wp:latest-posts {"postsToShow":12,"displayPostContent":true,"excerptLength":28,"displayPostDate":true,"displayFeaturedImage":true,"featuredImageSizeSlug":"medium"} /--></div><!-- /wp:group -->';
 }
 if($variant==='split'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:columns {"verticalAlignment":"center"} --><div class="wp-block-columns are-vertically-aligned-center"><!-- wp:column {"width":"58%"} --><div class="wp-block-column" style="flex-basis:58%"><!-- wp:paragraph --><p><strong>'.$profile.' / '.$tone.'</strong></p><!-- /wp:paragraph --><!-- wp:heading {"level":1} --><h1>'.$brand.'</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$hero.'</p><!-- /wp:paragraph --><!-- wp:buttons --><div class="wp-block-buttons">'.$buttons.'</div><!-- /wp:buttons --></div><!-- /wp:column --><!-- wp:column {"width":"42%"} --><div class="wp-block-column" style="flex-basis:42%"><div style="border-radius:24px;padding:28px;background:#f8fafc;border:1px solid #e5e7eb"><h2>Start with '.$cards[0]['t'].'</h2><p>'.$cards[0]['d'].'</p><p><a href="/'.$cards[0]['u'].'/">Open section</a></p></div></div><!-- /wp:column --></div><!-- /wp:columns --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Selected sections</h2><!-- /wp:heading --><!-- wp:columns --><div class="wp-block-columns">'.$cardHtml.'</div><!-- /wp:columns --><!-- wp:heading {"level":2} --><h2>Recent reading</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 if($variant==='catalog'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:heading {"level":1} --><h1>'.$brand.' catalog</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$hero.'</p><!-- /wp:paragraph --><!-- wp:buttons --><div class="wp-block-buttons">'.$buttons.'</div><!-- /wp:buttons --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Browse the main areas</h2><!-- /wp:heading --><!-- wp:columns --><div class="wp-block-columns">'.$cardHtml.'</div><!-- /wp:columns --><!-- wp:heading {"level":2} --><h2>Short notes from the archive</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 if($variant==='magazine'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:paragraph --><p><strong>'.$profile.'</strong></p><!-- /wp:paragraph --><!-- wp:heading {"level":1} --><h1>'.$brand.' Digest</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$tag.'</p><!-- /wp:paragraph --><!-- wp:separator /--><!-- wp:columns --><div class="wp-block-columns"><!-- wp:column {"width":"66%"} --><div class="wp-block-column" style="flex-basis:66%"><h2>'.$cards[1]['t'].'</h2><p>'.$cards[1]['d'].'</p><p><a href="/'.$cards[1]['u'].'/">Read the main section</a></p></div><!-- /wp:column --><!-- wp:column {"width":"34%"} --><div class="wp-block-column" style="flex-basis:34%"><ul>'.$listHtml.'</ul></div><!-- /wp:column --></div><!-- /wp:columns --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Latest updates</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 if($variant==='directory'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:heading {"level":1} --><h1>'.$brand.' directory</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$hero.'</p><!-- /wp:paragraph --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Open a section</h2><!-- /wp:heading --><ol>'.$listHtml.'</ol><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Only three articles</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 if($variant==='sidebar'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:columns --><div class="wp-block-columns"><!-- wp:column {"width":"32%"} --><div class="wp-block-column" style="flex-basis:32%"><h1>'.$brand.'</h1><p>'.$profile.'</p><div class="wp-block-buttons">'.$buttons.'</div></div><!-- /wp:column --><!-- wp:column {"width":"68%"} --><div class="wp-block-column" style="flex-basis:68%"><h2>'.$cards[2]['t'].'</h2><p>'.$hero.'</p><p>'.$cards[2]['d'].'</p><p><a href="/'.$cards[2]['u'].'/">Open featured page</a></p></div><!-- /wp:column --></div><!-- /wp:columns --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>More from the site</h2><!-- /wp:heading --><!-- wp:columns --><div class="wp-block-columns">'.$cardHtml.'</div><!-- /wp:columns --><!-- wp:heading {"level":2} --><h2>Articles</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 if($variant==='bold-tiles'){
   return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><div style="padding:34px;border-radius:28px;background:#111827;color:#fff"><p><strong>'.$profile.'</strong></p><h1 style="color:#fff">'.$brand.'</h1><p>'.$hero.'</p></div><!-- wp:separator /--><!-- wp:columns --><div class="wp-block-columns">'.$cardHtml.'</div><!-- /wp:columns --><!-- wp:heading {"level":2} --><h2>From the archive</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
 }
 return '<!-- wp:group {"layout":{"type":"constrained"}} --><div class="wp-block-group"><!-- wp:heading {"level":1} --><h1>'.$brand.'</h1><!-- /wp:heading --><!-- wp:paragraph --><p>'.$hero.'</p><!-- /wp:paragraph --><!-- wp:list --><ul>'.$listHtml.'</ul><!-- /wp:list --><!-- wp:separator /--><!-- wp:heading {"level":2} --><h2>Selected articles</h2><!-- /wp:heading -->'.$posts.'</div><!-- /wp:group -->';
}
function vpox_configure_front_page($p){
 $mode=vpox_theme_home_mode($p['parent_theme']??null);
 $home=get_page_by_path('home'); $blog=get_page_by_path('blog');
 update_option('posts_per_page',12);
 if($mode==='mixed' && $home){ update_option('show_on_front','page'); update_option('page_on_front',(int)$home->ID); update_option('page_for_posts',$blog?(int)$blog->ID:0); }
 else { update_option('show_on_front','posts'); update_option('page_on_front',0); update_option('page_for_posts',$blog?(int)$blog->ID:0); }
}
function create_pages($p){
 $brand=$p['brand']; $c=$p['contact']; $site=rtrim($p['site_url'],'/').'/'; $mode=vpox_theme_home_mode($p['parent_theme']??null);
 $extra=vpox_extra_pages($p);
 $pages=[
  'Home'=>vpox_home_page_content($p,$mode),
  'About'=>'<p><strong>'.$brand.'</strong> is organized as a '.esc_html(vpox_profile_label($p)).'. It includes useful pages, selected resources and a smaller article archive instead of relying only on posts.</p><p>The website is built to be simple to browse, easy to update and useful beyond the first visit.</p>'
 ];
 foreach($extra as $t=>$content){ $pages[$t]=$content; }
 $pages['Blog']='<h2>All articles</h2><p>Browse the newest articles and long-form guides from the archive.</p><!-- wp:latest-posts {"postsToShow":18,"displayPostContent":true,"excerptLength":26,"displayPostDate":true,"displayFeaturedImage":true,"featuredImageSizeSlug":"medium"} /-->';
 $pages['Contact']='<p>You can contact us using the information below.</p><ul><li>Email: <a href="mailto:'.$c['email'].'">'.$c['email'].'</a></li><li>Phone: '.$c['phone'].'</li><li>Address: '.$c['address'].'</li></ul>';
 $pages['Privacy Policy']='<p>This privacy policy explains how this website handles basic visitor information and contact requests.</p>';
 $pages['Terms']='<p>By using this website you agree to use the information responsibly. Content is provided for general informational purposes.</p>';
 $ids=[];
 foreach($pages as $title=>$content){
  $slug=($title==='Privacy Policy')?'privacy':sslug($title);
  $page=get_page_by_path($slug);
  if($page){ $ids[$title]=$page->ID; wp_update_post(['ID'=>$page->ID,'post_title'=>$title,'post_content'=>$content,'post_status'=>'publish','post_name'=>$slug]); continue; }
  $ids[$title]=wp_insert_post(['post_title'=>$title,'post_name'=>$slug,'post_type'=>'page','post_status'=>'publish','post_content'=>$content]);
 }
 vpox_configure_front_page($p);
 $menu_name='VPOX Main Menu'; $menu=wp_get_nav_menu_object($menu_name); $menu_id=$menu?$menu->term_id:wp_create_nav_menu($menu_name);
 if(!is_wp_error($menu_id)){
  $existing=wp_get_nav_menu_items($menu_id);
  if(empty($existing)){
   wp_update_nav_menu_item($menu_id,0,['menu-item-title'=>'Home','menu-item-url'=>$site,'menu-item-type'=>'custom','menu-item-status'=>'publish']);
   $menu_titles=array_merge(['About'],array_slice(array_keys($extra),0,3),['Blog','Contact','Privacy Policy','Terms']);
   foreach($menu_titles as $mt){ if(!empty($ids[$mt])) wp_update_nav_menu_item($menu_id,0,['menu-item-title'=>$mt==='Privacy Policy'?'Privacy':$mt,'menu-item-object-id'=>$ids[$mt],'menu-item-object'=>'page','menu-item-type'=>'post_type','menu-item-status'=>'publish']); }
  }
  $locs=get_theme_mod('nav_menu_locations'); if(!is_array($locs)) $locs=[]; $registered=get_registered_nav_menus();
  if(is_array($registered) && count($registered)){ foreach(array_keys($registered) as $loc){ $locs[$loc]=$menu_id; } } else { $locs['primary']=$menu_id; }
  set_theme_mod('nav_menu_locations',$locs);
 }
 return $ids;
}
function ensure_posts_homepage($p){
 $published=wp_count_posts('post'); $count=isset($published->publish)?(int)$published->publish:0;
 // V18: do not force MU homepage guard by default because it makes all sites look the same.
 // The guard is enabled only later if the active theme really returns a white/broken homepage.
 vpox_disable_mu_home_guard();
 if($count>0) vpox_configure_front_page($p);
}



function vpox_assign_menu_locations(){
 $menu=wp_get_nav_menu_object('VPOX Main Menu'); if(!$menu || is_wp_error($menu)) return;
 $registered=get_registered_nav_menus(); $locs=get_theme_mod('nav_menu_locations'); if(!is_array($locs)) $locs=[];
 if(is_array($registered) && count($registered)){ foreach(array_keys($registered) as $loc){ $locs[$loc]=$menu->term_id; } }
 else { $locs['primary']=$menu->term_id; $locs['menu-1']=$menu->term_id; }
 set_theme_mod('nav_menu_locations',$locs);
}
function vpox_http_body_once($url,&$code=0,$host=''){
 $code=0; if(!function_exists('curl_init')) return '';
 $headers=[]; if($host!=='') $headers[]='Host: '.$host;
 $ch=curl_init($url.(strpos($url,'?')===false?'?':'&').'vpox_theme_check='.time());
 curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_CONNECTTIMEOUT=>8,CURLOPT_TIMEOUT=>18,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_HTTPHEADER=>$headers,CURLOPT_USERAGENT=>'VPOX-Theme-Health-Check/18']);
 $body=(string)curl_exec($ch); $code=(int)curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); return $body;
}
function vpox_http_body($url,&$code=0){
 $code=0; $body=vpox_http_body_once($url,$code);
 if($code>0 && trim($body)!=='') return $body;
 $host=parse_url($url,PHP_URL_HOST); $path=parse_url($url,PHP_URL_PATH); if(!$path) $path='/';
 if($host){
   $local='http://127.0.0.1'.$path;
   $body2=vpox_http_body_once($local,$code,$host);
   if($code>0 || trim($body2)!=='') return $body2;
   $local='http://localhost'.$path;
   $body2=vpox_http_body_once($local,$code,$host);
   if($code>0 || trim($body2)!=='') return $body2;
 }
 return $body;
}
function vpox_frontend_broken($site_url){
 $code=0; $body=vpox_http_body(rtrim($site_url,'/').'/', $code); $small=strtolower(substr($body,0,16000));
 if($code>=500) return 'HTTP '.$code;
 if($code===0 && trim($body)==='') return 'health check empty/unreachable';
 if(strpos($small,'there has been a critical error')!==false) return 'WordPress critical error';
 if(strpos($small,'fatal error')!==false || strpos($small,'parse error')!==false) return 'PHP fatal/parse error';
 $plain=trim(preg_replace('~\s+~',' ',strip_tags($body)));
 if($body!=='' && strlen($plain)<140) return 'nearly empty homepage';
 if(strpos($small,'vpox-safe-home')===false && strlen($plain)<260) return 'homepage missing visible content';
 return '';
}
function unzip_full_safe($zipFile,$target,$strip=''){
 if(!class_exists('ZipArchive')) return false; $z=new ZipArchive(); if($z->open($zipFile)!==true) return false; $total=$z->numFiles;
 for($i=0;$i<$total;$i++){ $name=$z->getNameIndex($i); if($name===false) continue; $name=str_replace('\\','/',$name); $rel=$name; if($strip && strpos($rel,$strip)===0) $rel=substr($rel,strlen($strip)); $rel=ltrim($rel,'/'); if($rel==='' || strpos($rel,'..')!==false) continue; $dest=rtrim($target,'/').'/'.$rel; if(substr($name,-1)==='/'){ ensure_dir($dest); continue; } ensure_dir(dirname($dest)); $data=$z->getFromIndex($i); if($data!==false){ file_put_contents($dest,$data); @chmod($dest,0644); } }
 $z->close(); return true;
}
function vpox_download_full($url,$file){
 if(!function_exists('curl_init')) return false; ensure_dir(dirname($file)); $fp=fopen($file,'wb'); if(!$fp) return false; $ch=curl_init($url); curl_setopt_array($ch,[CURLOPT_FILE=>$fp,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_CONNECTTIMEOUT=>10,CURLOPT_TIMEOUT=>40,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_USERAGENT=>'VPOX-Theme-Downloader/18']); $ok=curl_exec($ch); $code=(int)curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); fclose($fp); return $ok && $code>=200 && $code<400 && is_file($file) && filesize($file)>1000;
}
function vpox_ensure_fallback_theme(&$s){
 $fallback='generatepress'; $dir=ROOT_DIR.'/wp-content/themes/'.$fallback; if(is_dir($dir)) return $fallback;
 $zip=TMP_DIR.'/fallback-generatepress.zip';
 if(vpox_download_full('https://downloads.wordpress.org/theme/generatepress.latest-stable.zip',$zip) && unzip_full_safe($zip,ROOT_DIR.'/wp-content/themes','')){ @unlink($zip); logx($s,'Fallback theme installed: generatepress'); return $fallback; }
 foreach(['twentytwentyfive','twentytwentyfour','twentytwentythree','twentytwentyone'] as $f){ if(is_dir(ROOT_DIR.'/wp-content/themes/'.$f)) return $f; }
 return '';
}
function vpox_theme_download_link($t){
 $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)($t['slug']??''));
 $link=trim((string)($t['download_link']??''));
 if($link==='') $link='https://downloads.wordpress.org/theme/'.$slug.'.latest-stable.zip';
 return $link;
}
function vpox_install_theme_if_missing($t,&$s){
 $slug=preg_replace('~[^A-Za-z0-9_-]~','',(string)($t['slug']??'')); if($slug==='') return '';
 $dir=ROOT_DIR.'/wp-content/themes/'.$slug; if(is_dir($dir)) return $slug;
 $zip=TMP_DIR.'/theme-'.$slug.'.zip'; $link=vpox_theme_download_link($t);
 logx($s,'Trying alternate WordPress.org theme: '.$slug);
 if(vpox_download_full($link,$zip) && unzip_full_safe($zip,ROOT_DIR.'/wp-content/themes','')){ @unlink($zip); if(is_dir($dir)){ logx($s,'Alternate theme installed: '.$slug); return $slug; } }
 @unlink($zip); logx($s,'Alternate theme download failed or folder missing: '.$slug); return '';
}
function vpox_theme_candidates($p){
 $out=[]; $seen=[]; $main=$p['parent_theme']??[]; if(!empty($main['slug'])){ $out[]=$main; $seen[$main['slug']]=1; }
 $alts=$p['alternate_themes']??[]; if(is_array($alts)){ foreach($alts as $t){ $slug=$t['slug']??''; if(!$slug || isset($seen[$slug])) continue; $out[]=$t; $seen[$slug]=1; if(count($out)>=6) break; } }
 return $out;
}
function vpox_apply_and_verify_theme($p,&$s){
 $candidates=vpox_theme_candidates($p); if(!$candidates) throw new Exception('No theme candidates found.');
 foreach($candidates as $pos=>$t){
   $slug=vpox_install_theme_if_missing($t,$s); if($slug==='') continue;
   switch_theme($slug);
   vpox_disable_mu_home_guard();
   ensure_posts_homepage($p); vpox_assign_menu_locations();
   $broken=vpox_frontend_broken($p['site_url']);
   if($broken===''){
     logx($s,'Theme health check passed with original theme layout: '.$slug.($pos>0?' (alternate used)':'').' — no unified MU guard used.');
     return;
   }
   logx($s,'Theme original homepage warning for '.$slug.' / '.$broken.'. Trying a local front-page template without changing theme.');
   force_articles_home_template($slug,$s,$t); ensure_posts_homepage($p); vpox_assign_menu_locations();
   $broken=vpox_frontend_broken($p['site_url']);
   if($broken===''){
     logx($s,'Theme passed after local front-page fix: '.$slug.' — still uses the selected theme header/footer.');
     return;
   }
   logx($s,'Local front-page fix did not pass for '.$slug.' / '.$broken.'. Enabling MU guard only as last check for this theme.');
   vpox_install_mu_home_guard($p); vpox_assign_menu_locations();
   $broken=vpox_frontend_broken($p['site_url']);
   if($broken===''){
     logx($s,'Theme passed with emergency MU guard: '.$slug.' — used only because the theme homepage was broken.');
     return;
   }
   vpox_disable_mu_home_guard();
   logx($s,'Theme failed health check after all fixes: '.$slug.' / '.$broken.'. Trying next diverse theme.');
 }
 logx($s,'All diverse theme candidates failed. Switching to final safe fallback.');
 $fallback=vpox_ensure_fallback_theme($s); if($fallback==='') throw new Exception('Themes failed and fallback could not be installed.');
 switch_theme($fallback); vpox_disable_mu_home_guard(); ensure_posts_homepage($p); vpox_assign_menu_locations();
 $broken2=vpox_frontend_broken($p['site_url']);
 if($broken2!==''){ logx($s,'Fallback original layout warning: '.$broken2.'. Enabling emergency MU guard.'); vpox_install_mu_home_guard($p); }
 logx($s,'Safe fallback theme activated: '.$fallback);
}

function clean_demo_content(){ $posts=get_posts(['post_type'=>['post','page'],'post_status'=>'any','numberposts'=>-1]); foreach($posts as $po){ $t=strtolower($po->post_title); if($t==='hello world!' || $t==='sample page' || strpos($t,'demo')!==false) wp_delete_post($po->ID,true); } }
function create_one_post($p,$post){ $hash=$post['hash']??sha1($p['domain'].'|'.$post['title']); $exists=get_posts(['post_type'=>'post','meta_key'=>'_vpox_article_hash','meta_value'=>$hash,'numberposts'=>1,'fields'=>'ids']); if($exists) return (int)$exists[0]; $cat=category_id($post['category']??'Articles'); $id=wp_insert_post(['post_title'=>$post['title'],'post_name'=>sslug($post['title']),'post_type'=>'post','post_status'=>'publish','post_excerpt'=>$post['excerpt']??'','post_content'=>$post['content'],'post_category'=>[$cat]]); if($id && !is_wp_error($id)){ update_post_meta($id,'_vpox_article_hash',$hash); if(!empty($post['tags'])) wp_set_post_tags($id,$post['tags'],false); $img=attach_image($id,$post['title'],$post['image_query']??$post['title'],$p); if(!empty($img['url'])){ $content='<figure><img class="post-img" src="'.esc_url($img['url']).'" alt="'.esc_attr($post['title']).'"></figure>\n'.$post['content']; wp_update_post(['ID'=>$id,'post_content'=>$content]); } } return $id; }
function seo_and_routes($p){ global $wp_rewrite; update_option('permalink_structure','/%postname%/'); if($wp_rewrite) $wp_rewrite->set_permalink_structure('/%postname%/'); flush_rewrite_rules(true); $ht="# BEGIN WordPress\nOptions -MultiViews\nDirectoryIndex index.php\n<IfModule mod_rewrite.c>\nRewriteEngine On\nRewriteBase /\nRewriteRule ^index\\.php$ - [L]\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule . /index.php [L]\n</IfModule>\n# END WordPress\n"; file_put_contents(ROOT_DIR.'/.htaccess',$ht); $site=rtrim($p['site_url'],'/'); file_put_contents(ROOT_DIR.'/robots.txt',"User-agent: *\nAllow: /\nSitemap: {$site}/sitemap.xml\n"); $urls=[$site.'/']; $all=get_posts(['post_type'=>['post','page'],'post_status'=>'publish','numberposts'=>300]); foreach($all as $po) $urls[]=get_permalink($po); $xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"; foreach(array_unique($urls) as $u){ $xml.='<url><loc>'.h($u)."</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>\n"; } $xml.="</urlset>\n"; file_put_contents(ROOT_DIR.'/sitemap.xml',$xml); }
function touch_dates($p){ $start=strtotime($p['settings']['date_start']??'2014-01-01'); $end=strtotime($p['settings']['date_end']??'2026-06-20'); if(!$start) $start=strtotime('2016-01-01'); if(!$end || $end<$start) $end=strtotime('2021-12-31'); $all=get_posts(['post_type'=>['post','page'],'post_status'=>'publish','numberposts'=>-1]); foreach($all as $po){ $t=mt_rand($start,$end); wp_update_post(['ID'=>$po->ID,'post_date'=>date('Y-m-d H:i:s',$t),'post_date_gmt'=>gmdate('Y-m-d H:i:s',$t)]); } }
function vpox_date_range($p){
    $start=strtotime($p['settings']['date_start']??'2016-01-01 00:00:01');
    $end=strtotime($p['settings']['date_end']??'2026-06-20 23:59:59');
    if(!$start) $start=strtotime('2016-01-01 00:00:01');
    if(!$end || $end<$start) $end=strtotime('2026-06-20 23:59:59');
    if($end<$start) $end=$start+86400;
    return [$start,$end];
}
function vpox_random_mtime($p,$salt=''){
    [$start,$end]=vpox_date_range($p);
    if($end<=$start) return $start;
    $span=$end-$start;
    if($salt!==''){
        $n=sprintf('%u',crc32($salt));
        return $start+((int)$n % max(1,$span));
    }
    return mt_rand($start,$end);
}
function touch_site_files($p){
    @set_time_limit(120);
    $count=0; $dirs=[]; $root=rtrim(str_replace('\\','/',ROOT_DIR),'/'); $tmp=rtrim(str_replace('\\','/',TMP_DIR),'/');
    $skipNames=['.vpox_clean_state.json'=>1,'.vpox_clean.log'=>1,'installer.php'=>1];
    $it=new RecursiveIteratorIterator(new RecursiveDirectoryIterator(ROOT_DIR,FilesystemIterator::SKIP_DOTS),RecursiveIteratorIterator::SELF_FIRST);
    foreach($it as $f){
        $path=str_replace('\\','/',$f->getPathname()); $base=basename($path);
        if(isset($skipNames[$base])) continue;
        if($tmp && strpos($path,$tmp)===0) continue;
        if($f->isDir()){ $dirs[]=$path; continue; }
        @touch($path,vpox_random_mtime($p,$path),vpox_random_mtime($p,$path.'a'));
        $count++;
    }
    usort($dirs,function($a,$b){ return strlen($b)-strlen($a); });
    foreach($dirs as $d){ @touch($d,vpox_random_mtime($p,$d),vpox_random_mtime($p,$d.'d')); $count++; }
    @touch(ROOT_DIR,vpox_random_mtime($p,'root'),vpox_random_mtime($p,'rootd'));
    return $count;
}
function final_installer_cleanup(){
    @set_time_limit(60);
    $p=vp_payload();
    rrmdir(TMP_DIR);
    foreach(['wordpress.zip','parent-theme.zip','installer.zip','installer.txt','.vpox_clean_state.json','.vpox_clean.log','wp-config-sample.php','readme.html','license.txt'] as $f){ @unlink(ROOT_DIR.'/'.$f); }
    foreach(['*_cmd_installer.zip','*_installer.zip','VPOX_*.zip','vpox_*.zip'] as $pat){ foreach(glob(ROOT_DIR.'/'.$pat)?:[] as $f){ if(is_file($f)) @unlink($f); } }
    @unlink(ROOT_DIR.'/installer.php');
    if(is_array($p) && !empty($p)) @touch(ROOT_DIR,vpox_random_mtime($p,'root-final'),vpox_random_mtime($p,'root-final-a'));
}

function run_step(&$s){ $p=vp_payload(); $set=$p['settings']; $phase=$s['phase'];
 if($phase==='prepare'){ ensure_dir(TMP_DIR); if(!class_exists('ZipArchive')) throw new Exception('ZipArchive disabled.'); if(!function_exists('curl_init')) throw new Exception('cURL disabled.'); logx($s,'Server modules OK.'); $s['phase']='wp_download'; return; }
 if($phase==='wp_download'){ if(core_ok()){ logx($s,'WordPress core exists.'); $s['phase']='wp_config'; return; } $done=dl_chunk('https://wordpress.org/latest.zip',WP_ZIP,$s['wp_offset'],$s['wp_total'],(int)$set['wp_chunk']); logx($s,'Downloading WordPress: '.number_format(@filesize(WP_ZIP)).' bytes'); if($done){ logx($s,'WordPress download complete.'); $s['phase']='wp_extract'; } return; }
 if($phase==='wp_extract'){ [$done,$idx,$total]=unzip_batch(WP_ZIP,ROOT_DIR,$s['wp_extract_idx'],(int)$set['extract_batch'],'wordpress/'); logx($s,"Extracting WordPress: {$idx} / {$total}"); if($done){ @unlink(WP_ZIP); if(!core_ok()) throw new Exception('WordPress core incomplete after extraction.'); $s['phase']='wp_config'; } return; }
 if($phase==='wp_config'){ $db=$s['db']; $ok=db_test($db); if($ok!==true) throw new Exception('DB failed: '.$ok); file_put_contents(ROOT_DIR.'/wp-config.php',wp_config($db)); logx($s,'wp-config.php created.'); $s['phase']='wp_install'; return; }
 if($phase==='wp_install'){ define('WP_INSTALLING',true); load_wp(); require_once ROOT_DIR.'/wp-admin/includes/upgrade.php'; if(!is_blog_installed()){ wp_install($p['brand'],$s['admin_user']??'admin',$s['admin_email']??('admin@'.$p['domain']),true,'',$s['admin_pass']??('Admin'.substr(md5($p['domain']),0,8).'!')); logx($s,'WordPress installed.'); } update_option('siteurl',$p['site_url']); update_option('home',$p['site_url']); update_option('blogname',$p['brand']); update_option('blogdescription',vpox_tagline($p)); $s['phase']='parent_download'; return; }
 if($phase==='parent_download'){ $link=$p['parent_theme']['download_link']??'https://downloads.wordpress.org/theme/twentytwentyfour.latest-stable.zip'; $done=dl_chunk($link,PARENT_ZIP,$s['parent_offset'],$s['parent_total'],(int)$set['wp_chunk']); logx($s,'Downloading WordPress.org parent theme: '.($p['parent_theme']['slug']??'theme').' '.number_format(@filesize(PARENT_ZIP)).' bytes'); if($done) $s['phase']='parent_extract'; return; }
 if($phase==='parent_extract'){ ensure_dir(ROOT_DIR.'/wp-content/themes'); [$done,$idx,$total]=unzip_batch(PARENT_ZIP,ROOT_DIR.'/wp-content/themes',$s['parent_extract_idx'],(int)$set['extract_batch'],''); logx($s,"Extracting parent theme: {$idx} / {$total}"); if($done){ @unlink(PARENT_ZIP); logx($s,'Theme downloaded and extracted. Activation is delayed until after content creation so broken themes cannot stop the installer.'); $s['phase']='content_prepare'; } return; }
 if($phase==='child_theme'){ $s['phase']='content_prepare'; return; }
 if($phase==='content_prepare'){ load_wp(); clean_demo_content(); create_pages($p); logx($s,'Pages/menu created. The selected theme will be activated only after posts are ready and then health-checked.'); $s['phase']='posts'; return; }
 if($phase==='posts'){ load_wp(); $posts=$p['posts']; $batch=(int)$set['post_batch']; $made=0; while($s['post_idx']<count($posts) && $made<$batch){ $post=$posts[$s['post_idx']]; $id=create_one_post($p,$post); logx($s,'Post '.($s['post_idx']+1).'/'.count($posts).': '.$post['title'].' ID='.$id); $s['post_idx']++; $made++; } if($s['post_idx']>=count($posts)){ ensure_posts_homepage($p); logx($s,'Homepage configured with profile pages/sections plus selected articles and View all articles button.'); $s['phase']='seo'; } return; }
 if($phase==='seo'){ load_wp(); seo_and_routes($p); touch_dates($p); logx($s,'Permalinks, .htaccess, sitemap and robots completed.'); $s['phase']='theme_apply'; return; }
 if($phase==='theme_apply'){ load_wp(); vpox_apply_and_verify_theme($p,$s); logx($s,'Theme applied with V18 real-layout mode: original theme design first, MU guard only if white/broken.'); $s['phase']='cleanup'; return; }
 if($phase==='cleanup'){ rrmdir(TMP_DIR); @unlink(ROOT_DIR.'/readme.html'); @unlink(ROOT_DIR.'/license.txt'); @unlink(ROOT_DIR.'/wp-config-sample.php'); $n=touch_site_files($p); logx($s,'File/folder modification times randomized across the selected date range: '.$n.' items.'); logx($s,'Cleanup complete. Installer files will be removed after this final page is displayed.'); $s['delete_installer_after_page']=1; $s['done']=1; $s['phase']='done'; return; }
}
function start_state($db,$admin_user,$admin_pass,$admin_email){ $s=st_default(); $s['phase']='prepare'; $s['db']=$db; $s['admin_user']=$admin_user; $s['admin_pass']=$admin_pass; $s['admin_email']=$admin_email; logx($s,'Installer started.'); st_save($s); return $s; }
function page($s=null,$msg=''){ $p=vp_payload(); $auto=vp_auto_db(); $running=$s && empty($s['done']) && empty($s['error']) && $s['phase']!=='new'; ?><!doctype html><html lang="ar" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>VPOX Clean Installer</title><?php if($running): ?><meta http-equiv="refresh" content="1.1;url=?run=1"><?php endif; ?><style>body{margin:0;background:#0f172a;color:#e5e7eb;font-family:Tahoma,Arial}.wrap{max-width:1100px;margin:20px auto;padding:0 14px}.top,.card{background:#111827;border:1px solid #334155;border-radius:18px;padding:18px;margin-bottom:14px}.card{background:white;color:#111827}.term{background:#020617;color:#22c55e;border:1px solid #14532d;border-radius:16px;padding:16px;min-height:430px;white-space:pre-wrap;direction:ltr;text-align:left;font-family:Consolas,monospace;line-height:1.55}.pill{display:inline-block;background:#1e293b;color:#bfdbfe;padding:5px 9px;border-radius:99px;font-size:12px;margin:3px}input{width:100%;box-sizing:border-box;padding:12px;border:1px solid #cbd5e1;border-radius:10px;direction:ltr;text-align:left}.row{display:grid;grid-template-columns:1fr 1fr;gap:10px}.btn{background:#2563eb;color:#fff;border:0;border-radius:10px;padding:12px 20px;font-weight:900;cursor:pointer}.err{color:#fca5a5}@media(max-width:800px){.row{grid-template-columns:1fr}}</style></head><body><div class="wrap"><div class="top"><h1>VPOX Clean Installer</h1><span class="pill">Domain: <?=h($p['domain']??'')?></span><span class="pill">Parent: <?=h($p['parent_theme']['slug']??'')?></span><span class="pill">Original parent design</span><span class="pill">Parent direct / No child bugs</span><span class="pill">Original layout + 3 articles</span><span class="pill">MU guard only on failure</span><span class="pill">Auto delete installer</span><span class="pill">Random file mtimes</span></div><?php if($msg): ?><div class="card"><b><?=h($msg)?></b></div><?php endif; ?><?php if(!is_file(STATE_FILE) && (!$s || $s['phase']==='new')): ?><div class="card"><h2>Database</h2><form method="post"><input type="hidden" name="start" value="1"><div class="row"><div><label>DB Host</label><input name="db_host" value="<?=h($auto['host']??'localhost')?>"></div><div><label>DB Name</label><input name="db_name" value="<?=h($auto['name']??'')?>"></div><div><label>DB User</label><input name="db_user" value="<?=h($auto['user']??'')?>"></div><div><label>DB Password</label><input name="db_pass" type="password" value="<?=h($auto['pass']??'')?>"></div><div><label>Table Prefix</label><input name="db_prefix" value="<?=h($auto['prefix']??'wp_')?>"></div><div><label>Admin Email</label><input name="admin_email" value="<?=h('admin@'.($p['domain']??'example.com'))?>"></div><div><label>Admin User</label><input name="admin_user" value="admin"></div><div><label>Admin Pass</label><input name="admin_pass" value="<?=h('Admin'.substr(md5($p['domain']??'x'),0,10).'!')?>"></div></div><p><button class="btn">Start Clean Install</button></p></form><?php if($auto): ?><p>Auto DB detected. اضغط Start فقط.</p><?php endif; ?></div><?php else: ?><div class="term"><?php echo "VPOX CLEAN INSTALLER\n----------------------------\n"; if($s){ foreach($s['logs'] as $l) echo h($l)."\n"; if(!empty($s['error'])) echo "\nERROR: ".h($s['error'])."\n"; elseif(!empty($s['done'])) echo "\nDONE.\n"; else echo "\nRunning...\n"; } ?></div><?php if(!empty($s['error'])): ?><div class="card"><form method="post"><button class="btn" name="retry" value="1">Retry same step</button> <button class="btn" name="reset" value="1">Reset state</button></form></div><?php endif; ?><?php endif; ?></div></body></html><?php }
try{
 if(isset($_POST['reset'])){ @unlink(STATE_FILE); @unlink(LOG_FILE); header('Location: installer.php'); exit; }
 if(isset($_POST['retry'])){ $s=st_load(); $s['error']=''; st_save($s); header('Location: ?run=1'); exit; }
 if(isset($_GET['start_auto'])){ $a=vp_auto_db(); if(!$a){ page(st_default(),'No embedded DB found.'); exit; } $s=start_state($a,'admin','Admin'.substr(md5(vp_payload()['domain']??'x'),0,10).'!','admin@'.(vp_payload()['domain']??'example.com')); header('Location: ?run=1'); exit; }
 if(isset($_POST['start'])){ $db=['host'=>trim($_POST['db_host']??'localhost'),'name'=>trim($_POST['db_name']??''),'user'=>trim($_POST['db_user']??''),'pass'=>(string)($_POST['db_pass']??''),'prefix'=>trim($_POST['db_prefix']??'wp_')]; $ok=db_test($db); if($ok!==true){ page(st_default(),'Database failed: '.$ok); exit; } $s=start_state($db,trim($_POST['admin_user']??'admin'),(string)($_POST['admin_pass']??'Admin123!'),trim($_POST['admin_email']??'admin@example.com')); header('Location: ?run=1'); exit; }
 if(isset($_GET['run'])){ $s=st_load(); if(empty($s['done'])){ try{ run_step($s); } catch(Throwable $e){ $s['error']=$e->getMessage(); logx($s,'ERROR: '.$e->getMessage()); } st_save($s); } if(!empty($s['done']) && (($s['phase']??'')==='done') && !empty($s['delete_installer_after_page'])){ register_shutdown_function('final_installer_cleanup'); } page($s); exit; }
 page(is_file(STATE_FILE)?st_load():st_default());
} catch(Throwable $e){ $s=st_load(); $s['error']=$e->getMessage(); page($s); }
