LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICBzdG0zMmYxMHhfZmxhc2guYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gIFYzLjAuMA0KICAqIEBkYXRlICAwNC8wNi8yMDA5DQogICogQGJyaWVmICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBGTEFTSCBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAwOSBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfZmxhc2guaCINCg0KLyoqIEBhZGR0b2dyb3VwIFN0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIEZMQVNIIA0KICAqIEBicmllZiBGTEFTSCBkcml2ZXIgbW9kdWxlcw0KICAqIEB7DQogICovIA0KDQovKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfRGVmaW5lcw0KICAqIEB7DQogICovIA0KDQovKiBGbGFzaCBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIEFDUl9MQVRFTkNZX01hc2sgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMzgpDQojZGVmaW5lIEFDUl9ITEZDWUFfTWFzayAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRjcpDQojZGVmaW5lIEFDUl9QUkZUQkVfTWFzayAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRUYpDQoNCi8qIEZsYXNoIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8NCiNkZWZpbmUgQUNSX1BSRlRCU19NYXNrICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkgDQoNCi8qIEZsYXNoIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLw0KI2RlZmluZSBDUl9QR19TZXQgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxKQ0KI2RlZmluZSBDUl9QR19SZXNldCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAxRkZFKSANCiNkZWZpbmUgQ1JfUEVSX1NldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMikNCiNkZWZpbmUgQ1JfUEVSX1Jlc2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZGRCkNCiNkZWZpbmUgQ1JfTUVSX1NldCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNCkNCiNkZWZpbmUgQ1JfTUVSX1Jlc2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZGQikNCiNkZWZpbmUgQ1JfT1BUUEdfU2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMCkNCiNkZWZpbmUgQ1JfT1BUUEdfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZFRikNCiNkZWZpbmUgQ1JfT1BURVJfU2V0ICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMCkNCiNkZWZpbmUgQ1JfT1BURVJfUmVzZXQgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMUZERikNCiNkZWZpbmUgQ1JfU1RSVF9TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA0MCkNCiNkZWZpbmUgQ1JfTE9DS19TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDA4MCkNCg0KLyogRkxBU0ggTWFzayAqLw0KI2RlZmluZSBSRFBSVF9NYXNrICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyKQ0KI2RlZmluZSBXUlAwX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMEZGKQ0KI2RlZmluZSBXUlAxX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBGRjAwKQ0KI2RlZmluZSBXUlAyX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwRkYwMDAwKQ0KI2RlZmluZSBXUlAzX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGMDAwMDAwKQ0KDQovKiBGTEFTSCBLZXlzICovDQojZGVmaW5lIFJEUF9LZXkgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDBBNSkNCiNkZWZpbmUgRkxBU0hfS0VZMSAgICAgICAgICAgICAgICgodWludDMyX3QpMHg0NTY3MDEyMykNCiNkZWZpbmUgRkxBU0hfS0VZMiAgICAgICAgICAgICAgICgodWludDMyX3QpMHhDREVGODlBQikNCg0KLyogRGVsYXkgZGVmaW5pdGlvbiAqLyAgIA0KI2RlZmluZSBFcmFzZVRpbWVvdXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwRkZGKQ0KI2RlZmluZSBQcm9ncmFtVGltZW91dCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDBGKQ0KDQovKioNCiAgKiBAfQ0KICAqLyANCg0KLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQpzdGF0aWMgdm9pZCBkZWxheSh2b2lkKTsNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIGNvZGUgbGF0ZW5jeSB2YWx1ZS4NCiAgKiBAcGFyYW0gRkxBU0hfTGF0ZW5jeTogc3BlY2lmaWVzIHRoZSBGTEFTSCBMYXRlbmN5IHZhbHVlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZMQVNIX0xhdGVuY3lfMDogRkxBU0ggWmVybyBMYXRlbmN5IGN5Y2xlDQogICogQGFyZyBGTEFTSF9MYXRlbmN5XzE6IEZMQVNIIE9uZSBMYXRlbmN5IGN5Y2xlDQogICogQGFyZyBGTEFTSF9MYXRlbmN5XzI6IEZMQVNIIFR3byBMYXRlbmN5IGN5Y2xlcw0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZMQVNIX1NldExhdGVuY3kodWludDMyX3QgRkxBU0hfTGF0ZW5jeSkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9MQVRFTkNZKEZMQVNIX0xhdGVuY3kpKTsNCiAgDQogIC8qIFJlYWQgdGhlIEFDUiByZWdpc3RlciAqLw0KICB0bXByZWcgPSBGTEFTSC0+QUNSOyAgDQogIA0KICAvKiBTZXRzIHRoZSBMYXRlbmN5IHZhbHVlICovDQogIHRtcHJlZyAmPSBBQ1JfTEFURU5DWV9NYXNrOw0KICB0bXByZWcgfD0gRkxBU0hfTGF0ZW5jeTsNCiAgDQogIC8qIFdyaXRlIHRoZSBBQ1IgcmVnaXN0ZXIgKi8NCiAgRkxBU0gtPkFDUiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBIYWxmIGN5Y2xlIGZsYXNoIGFjY2Vzcy4NCiAgKiBAcGFyYW0gRkxBU0hfSGFsZkN5Y2xlQWNjZXNzOiBzcGVjaWZpZXMgdGhlIEZMQVNIIEhhbGYgY3ljbGUgQWNjZXNzIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzX0VuYWJsZTogRkxBU0ggSGFsZiBDeWNsZSBFbmFibGUNCiAgKiBAYXJnIEZMQVNIX0hhbGZDeWNsZUFjY2Vzc19EaXNhYmxlOiBGTEFTSCBIYWxmIEN5Y2xlIERpc2FibGUNCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGTEFTSF9IYWxmQ3ljbGVBY2Nlc3NDbWQodWludDMyX3QgRkxBU0hfSGFsZkN5Y2xlQWNjZXNzKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfSEFMRkNZQ0xFQUNDRVNTX1NUQVRFKEZMQVNIX0hhbGZDeWNsZUFjY2VzcykpOw0KICANCiAgLyogRW5hYmxlIG9yIGRpc2FibGUgdGhlIEhhbGYgY3ljbGUgYWNjZXNzICovDQogIEZMQVNILT5BQ1IgJj0gQUNSX0hMRkNZQV9NYXNrOw0KICBGTEFTSC0+QUNSIHw9IEZMQVNIX0hhbGZDeWNsZUFjY2VzczsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBQcmVmZXRjaCBCdWZmZXIuDQogICogQHBhcmFtIEZMQVNIX1ByZWZldGNoQnVmZmVyOiBzcGVjaWZpZXMgdGhlIFByZWZldGNoIGJ1ZmZlciBzdGF0dXMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRkxBU0hfUHJlZmV0Y2hCdWZmZXJfRW5hYmxlOiBGTEFTSCBQcmVmZXRjaCBCdWZmZXIgRW5hYmxlDQogICogQGFyZyBGTEFTSF9QcmVmZXRjaEJ1ZmZlcl9EaXNhYmxlOiBGTEFTSCBQcmVmZXRjaCBCdWZmZXIgRGlzYWJsZQ0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZMQVNIX1ByZWZldGNoQnVmZmVyQ21kKHVpbnQzMl90IEZMQVNIX1ByZWZldGNoQnVmZmVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJFRkVUQ0hCVUZGRVJfU1RBVEUoRkxBU0hfUHJlZmV0Y2hCdWZmZXIpKTsNCiAgDQogIC8qIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBQcmVmZXRjaCBCdWZmZXIgKi8NCiAgRkxBU0gtPkFDUiAmPSBBQ1JfUFJGVEJFX01hc2s7DQogIEZMQVNILT5BQ1IgfD0gRkxBU0hfUHJlZmV0Y2hCdWZmZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVW5sb2NrcyB0aGUgRkxBU0ggUHJvZ3JhbSBFcmFzZSBDb250cm9sbGVyLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZMQVNIX1VubG9jayh2b2lkKQ0Kew0KICAvKiBBdXRob3JpemUgdGhlIEZQRUMgQWNjZXNzICovDQogIEZMQVNILT5LRVlSID0gRkxBU0hfS0VZMTsNCiAgRkxBU0gtPktFWVIgPSBGTEFTSF9LRVkyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIExvY2tzIHRoZSBGTEFTSCBQcm9ncmFtIEVyYXNlIENvbnRyb2xsZXIuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRkxBU0hfTG9jayh2b2lkKQ0Kew0KICAvKiBTZXQgdGhlIExvY2sgQml0IHRvIGxvY2sgdGhlIEZQRUMgYW5kIHRoZSBGQ1IgKi8NCiAgRkxBU0gtPkNSIHw9IENSX0xPQ0tfU2V0Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVyYXNlcyBhIHNwZWNpZmllZCBGTEFTSCBwYWdlLg0KICAqIEBwYXJhbSBQYWdlX0FkZHJlc3M6IFRoZSBwYWdlIGFkZHJlc3MgdG8gYmUgZXJhc2VkLg0KICAqIEByZXR2YWwgOiBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIA0KICAqICAgRkxBU0hfRVJST1JfUEcsIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgDQogICogICBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX0VyYXNlUGFnZSh1aW50MzJfdCBQYWdlX0FkZHJlc3MpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX0FERFJFU1MoUGFnZV9BZGRyZXNzKSk7DQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7IA0KICAgIC8qIGlmIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBwcm9jZWVkIHRvIGVyYXNlIHRoZSBwYWdlICovDQogICAgRkxBU0gtPkNSfD0gQ1JfUEVSX1NldDsNCiAgICBGTEFTSC0+QVIgPSBQYWdlX0FkZHJlc3M7IA0KICAgIEZMQVNILT5DUnw9IENSX1NUUlRfU2V0Ow0KICAgIA0KICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogICAgaWYoc3RhdHVzICE9IEZMQVNIX0JVU1kpDQogICAgew0KICAgICAgLyogaWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBFUiBCaXQgKi8NCiAgICAgIEZMQVNILT5DUiAmPSBDUl9QRVJfUmVzZXQ7DQogICAgfQ0KICB9DQogIC8qIFJldHVybiB0aGUgRXJhc2UgU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRXJhc2VzIGFsbCBGTEFTSCBwYWdlcy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCANCiAgKiAgIEZMQVNIX0VSUk9SX1BHLCBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIA0KICAqICAgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FcmFzZUFsbFBhZ2VzKHZvaWQpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEVyYXNlVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSBhbGwgcGFnZXMgKi8NCiAgICAgRkxBU0gtPkNSIHw9IENSX01FUl9TZXQ7DQogICAgIEZMQVNILT5DUiB8PSBDUl9TVFJUX1NldDsNCiAgICANCiAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBlcmFzZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBNRVIgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfTUVSX1Jlc2V0Ow0KICAgIH0NCiAgfQkgICANCiAgLyogUmV0dXJuIHRoZSBFcmFzZSBTdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFcmFzZXMgdGhlIEZMQVNIIG9wdGlvbiBieXRlcy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCANCiAgKiAgIEZMQVNIX0VSUk9SX1BHLCBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIA0KICAqICAgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FcmFzZU9wdGlvbkJ5dGVzKHZvaWQpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBBdXRob3JpemUgdGhlIHNtYWxsIGluZm9ybWF0aW9uIGJsb2NrIHByb2dyYW1taW5nICovDQogICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkxOw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCiAgICANCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBlcmFzZSB0aGUgb3B0aW9uIGJ5dGVzICovDQogICAgRkxBU0gtPkNSIHw9IENSX09QVEVSX1NldDsNCiAgICBGTEFTSC0+Q1IgfD0gQ1JfU1RSVF9TZXQ7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCiAgICANCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVEVSIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgIA0KICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0Ow0KICAgICAgLyogRW5hYmxlIHRoZSByZWFkb3V0IGFjY2VzcyAqLw0KICAgICAgT0ItPlJEUD0gUkRQX0tleTsgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiANCiAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgICAgew0KICAgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaWYgKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0gIA0KICB9DQogIC8qIFJldHVybiB0aGUgZXJhc2Ugc3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUHJvZ3JhbXMgYSB3b3JkIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuDQogICogQHBhcmFtIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLg0KICAqIEBwYXJhbSBEYXRhOiBzcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZC4NCiAgKiBAcmV0dmFsIDogRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCANCiAgKiAgIEZMQVNIX0VSUk9SX1BHLCBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIA0KICAqICAgRkxBU0hfVElNRU9VVC4gDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfUHJvZ3JhbVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgRGF0YSkNCnsNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQUREUkVTUyhBZGRyZXNzKSk7DQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZmlyc3QgDQogICAgaGFsZiB3b3JkICovDQogICAgRkxBU0gtPkNSIHw9IENSX1BHX1NldDsNCiAgDQogICAgKihfX0lPIHVpbnQxNl90KilBZGRyZXNzID0gKHVpbnQxNl90KURhdGE7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KIA0KICAgIGlmKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkNCiAgICB7DQogICAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgc2Vjb25kIA0KICAgICAgaGFsZiB3b3JkICovDQogICAgICAqKF9fSU8gdWludDE2X3QqKShBZGRyZXNzICsgMikgPSBEYXRhID4+IDE2Ow0KICAgIA0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogICAgICAgIA0KICAgICAgaWYoc3RhdHVzICE9IEZMQVNIX0JVU1kpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBpZiAoc3RhdHVzICE9IEZMQVNIX0JVU1kpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgICBGTEFTSC0+Q1IgJj0gQ1JfUEdfUmVzZXQ7DQogICAgICB9DQogICAgIH0NCiAgfQ0KICAvKiBSZXR1cm4gdGhlIFByb2dyYW0gU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUHJvZ3JhbXMgYSBoYWxmIHdvcmQgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4NCiAgKiBAcGFyYW0gQWRkcmVzczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuDQogICogQHBhcmFtIERhdGE6IHNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkLg0KICAqIEByZXR2YWwgOiBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIA0KICAqICAgRkxBU0hfRVJST1JfUEcsIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgDQogICogICBGTEFTSF9USU1FT1VULiANCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9Qcm9ncmFtSGFsZldvcmQodWludDMyX3QgQWRkcmVzcywgdWludDE2X3QgRGF0YSkNCnsNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfQUREUkVTUyhBZGRyZXNzKSk7DQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBpZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgcHJvY2VlZCB0byBwcm9ncmFtIHRoZSBuZXcgZGF0YSAqLw0KICAgIEZMQVNILT5DUiB8PSBDUl9QR19TZXQ7DQogIA0KICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX1BHX1Jlc2V0Ow0KICAgIH0NCiAgfSANCiAgLyogUmV0dXJuIHRoZSBQcm9ncmFtIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFByb2dyYW1zIGEgaGFsZiB3b3JkIGF0IGEgc3BlY2lmaWVkIE9wdGlvbiBCeXRlIERhdGEgYWRkcmVzcy4NCiAgKiBAcGFyYW0gQWRkcmVzczogc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgMHgxRkZGRjgwNCBvciAweDFGRkZGODA2LiANCiAgKiBAcGFyYW0gRGF0YTogc3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuDQogICogQHJldHZhbCA6IEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgDQogICogICBGTEFTSF9FUlJPUl9QRywgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciANCiAgKiAgIEZMQVNIX1RJTUVPVVQuIA0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1Byb2dyYW1PcHRpb25CeXRlRGF0YSh1aW50MzJfdCBBZGRyZXNzLCB1aW50OF90IERhdGEpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX09CX0RBVEFfQUREUkVTUyhBZGRyZXNzKSk7DQogIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7DQogICAgLyogQXV0aG9yaXplIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMTsNCiAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQogICAgLyogRW5hYmxlcyB0aGUgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIG9wZXJhdGlvbiAqLw0KICAgIEZMQVNILT5DUiB8PSBDUl9PUFRQR19TZXQ7IA0KICAgICooX19JTyB1aW50MTZfdCopQWRkcmVzcyA9IERhdGE7DQogICAgDQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgIH0NCiAgfSAgICANCiAgLyogUmV0dXJuIHRoZSBPcHRpb24gQnl0ZSBEYXRhIFByb2dyYW0gU3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JpdGUgcHJvdGVjdHMgdGhlIGRlc2lyZWQgcGFnZXMNCiAgKiBAcGFyYW0gRkxBU0hfUGFnZXM6IHNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgcGFnZXMgdG8gYmUgDQogICogICB3cml0ZSBwcm90ZWN0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiAgKiBAYXJnIEZvciBTVE0zMkYxMFh4eCBNZWRpdW0tZGVuc2l0eSBkZXZpY2VzIChGTEFTSCBwYWdlIHNpemUgZXF1YWwgdG8gMSBLQikNCiAgKiBBIHZhbHVlIGJldHdlZW4gRkxBU0hfV1JQcm90X1BhZ2VzMHRvMyBhbmQgRkxBU0hfV1JQcm90X1BhZ2VzMTI0dG8xMjcNCiAgKiBAYXJnIEZvciBTVE0zMkYxMFh4eCBIaWdoLWRlbnNpdHkgZGV2aWNlcyAoRkxBU0ggcGFnZSBzaXplIGVxdWFsIHRvIDIgS0IpIA0KICAqIEEgdmFsdWUgYmV0d2VlbiBGTEFTSF9XUlByb3RfUGFnZXMwdG8xIGFuZCAgRkxBU0hfV1JQcm90X1BhZ2VzNjB0bzYxIA0KICAqIG9yIEZMQVNIX1dSUHJvdF9QYWdlczYydG8yNTUgDQogICogQGFyZyBGTEFTSF9XUlByb3RfQWxsUGFnZXMNCiAgKiBAcmV0dmFsIDogRkxBU0ggU3RhdHVzOiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlOiBGTEFTSF9CVVNZLCANCiAgKiAgIEZMQVNIX0VSUk9SX1BHLCBGTEFTSF9FUlJPUl9XUlAsIEZMQVNIX0NPTVBMRVRFIG9yIA0KICAqICAgRkxBU0hfVElNRU9VVC4NCiAgKi8NCkZMQVNIX1N0YXR1cyBGTEFTSF9FbmFibGVXcml0ZVByb3RlY3Rpb24odWludDMyX3QgRkxBU0hfUGFnZXMpDQp7DQogIHVpbnQxNl90IFdSUDBfRGF0YSA9IDB4RkZGRiwgV1JQMV9EYXRhID0gMHhGRkZGLCBXUlAyX0RhdGEgPSAweEZGRkYsIFdSUDNfRGF0YSA9IDB4RkZGRjsNCiAgDQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9XUlBST1RfUEFHRShGTEFTSF9QYWdlcykpOw0KICANCiAgRkxBU0hfUGFnZXMgPSAodWludDMyX3QpKH5GTEFTSF9QYWdlcyk7DQogIFdSUDBfRGF0YSA9ICh1aW50MTZfdCkoRkxBU0hfUGFnZXMgJiBXUlAwX01hc2spOw0KICBXUlAxX0RhdGEgPSAodWludDE2X3QpKChGTEFTSF9QYWdlcyAmIFdSUDFfTWFzaykgPj4gOCk7DQogIFdSUDJfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQMl9NYXNrKSA+PiAxNik7DQogIFdSUDNfRGF0YSA9ICh1aW50MTZfdCkoKEZMQVNIX1BhZ2VzICYgV1JQM19NYXNrKSA+PiAyNCk7DQogIA0KICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICANCiAgaWYoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKQ0KICB7DQogICAgLyogQXV0aG9yaXplcyB0aGUgc21hbGwgaW5mb3JtYXRpb24gYmxvY2sgcHJvZ3JhbW1pbmcgKi8NCiAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTE7DQogICAgRkxBU0gtPk9QVEtFWVIgPSBGTEFTSF9LRVkyOw0KICAgIEZMQVNILT5DUiB8PSBDUl9PUFRQR19TZXQ7DQogICAgaWYoV1JQMF9EYXRhICE9IDB4RkYpDQogICAgew0KICAgICAgT0ItPldSUDAgPSBXUlAwX0RhdGE7DQogICAgICANCiAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgIH0NCiAgICBpZigoc3RhdHVzID09IEZMQVNIX0NPTVBMRVRFKSAmJiAoV1JQMV9EYXRhICE9IDB4RkYpKQ0KICAgIHsNCiAgICAgIE9CLT5XUlAxID0gV1JQMV9EYXRhOw0KICAgICAgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICB9DQogICAgaWYoKHN0YXR1cyA9PSBGTEFTSF9DT01QTEVURSkgJiYgKFdSUDJfRGF0YSAhPSAweEZGKSkNCiAgICB7DQogICAgICBPQi0+V1JQMiA9IFdSUDJfRGF0YTsNCiAgICAgIA0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogICAgfQ0KICAgIA0KICAgIGlmKChzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpJiYgKFdSUDNfRGF0YSAhPSAweEZGKSkNCiAgICB7DQogICAgICBPQi0+V1JQMyA9IFdSUDNfRGF0YTsNCiAgICAgDQogICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8NCiAgICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKFByb2dyYW1UaW1lb3V0KTsNCiAgICB9DQogICAgICAgICAgDQogICAgaWYoc3RhdHVzICE9IEZMQVNIX0JVU1kpDQogICAgew0KICAgICAgLyogaWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgT1BUUEcgQml0ICovDQogICAgICBGTEFTSC0+Q1IgJj0gQ1JfT1BUUEdfUmVzZXQ7DQogICAgfQ0KICB9IA0KICAvKiBSZXR1cm4gdGhlIHdyaXRlIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOyAgICAgICANCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSByZWFkIG91dCBwcm90ZWN0aW9uLg0KICAqICAgSWYgdGhlIHVzZXIgaGFzIGFscmVhZHkgcHJvZ3JhbW1lZCB0aGUgb3RoZXIgb3B0aW9uIGJ5dGVzIGJlZm9yZSANCiAgKiAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaGUgbXVzdCByZS1wcm9ncmFtIHRoZW0gc2luY2UgdGhpcyANCiAgKiAgIGZ1bmN0aW9uIGVyYXNlcyBhbGwgb3B0aW9uIGJ5dGVzLg0KICAqIEBwYXJhbSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBSZWFkT3V0IFByb3RlY3Rpb24uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIA0KICAqICAgRkxBU0hfRVJST1JfUEcsIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgDQogICogICBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1JlYWRPdXRQcm90ZWN0aW9uKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgRkxBU0hfU3RhdHVzIHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOw0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsNCiAgICAvKiBBdXRob3JpemVzIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KICAgIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMTsNCiAgICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTI7DQogICAgRkxBU0gtPkNSIHw9IENSX09QVEVSX1NldDsNCiAgICBGTEFTSC0+Q1IgfD0gQ1JfU1RSVF9TZXQ7DQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRXJhc2VUaW1lb3V0KTsNCiAgICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogICAgew0KICAgICAgLyogaWYgdGhlIGVyYXNlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVEVSIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgLyogRW5hYmxlIHRoZSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uICovDQogICAgICBGTEFTSC0+Q1IgfD0gQ1JfT1BUUEdfU2V0OyANCiAgICAgIGlmKE5ld1N0YXRlICE9IERJU0FCTEUpDQogICAgICB7DQogICAgICAgIE9CLT5SRFAgPSAweDAwOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBPQi0+UkRQID0gUkRQX0tleTsgIA0KICAgICAgfQ0KICAgICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihFcmFzZVRpbWVvdXQpOyANCiAgICANCiAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgICAgew0KICAgICAgICAvKiBpZiB0aGUgcHJvZ3JhbSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBkaXNhYmxlIHRoZSBPUFRQRyBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIHRoZSBPUFRFUiBCaXQgKi8NCiAgICAgICAgRkxBU0gtPkNSICY9IENSX09QVEVSX1Jlc2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICAvKiBSZXR1cm4gdGhlIHByb3RlY3Rpb24gb3BlcmF0aW9uIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOyAgICAgIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFByb2dyYW1zIHRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlOiBJV0RHX1NXIC8gUlNUX1NUT1AgLw0KICAqICAgUlNUX1NUREJZLg0KICAqIEBwYXJhbSBPQl9JV0RHOiBTZWxlY3RzIHRoZSBJV0RHIG1vZGUNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBPQl9JV0RHX1NXOiBTb2Z0d2FyZSBJV0RHIHNlbGVjdGVkDQogICogQGFyZyBPQl9JV0RHX0hXOiBIYXJkd2FyZSBJV0RHIHNlbGVjdGVkDQogICogQHBhcmFtIE9CX1NUT1A6IFJlc2V0IGV2ZW50IHdoZW4gZW50ZXJpbmcgU1RPUCBtb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIE9CX1NUT1BfTm9SU1Q6IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIGluIFNUT1ANCiAgKiBAYXJnIE9CX1NUT1BfUlNUOiBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVE9QDQogICogQHBhcmFtIE9CX1NUREJZOiBSZXNldCBldmVudCB3aGVuIGVudGVyaW5nIFN0YW5kYnkgbW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBPQl9TVERCWV9Ob1JTVDogTm8gcmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgaW4gU1RBTkRCWQ0KICAqIEBhcmcgT0JfU1REQllfUlNUOiBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyBpbiBTVEFOREJZDQogICogQHJldHZhbCA6IEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgDQogICogICBGTEFTSF9FUlJPUl9QRywgRkxBU0hfRVJST1JfV1JQLCBGTEFTSF9DT01QTEVURSBvciANCiAgKiAgIEZMQVNIX1RJTUVPVVQuDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfVXNlck9wdGlvbkJ5dGVDb25maWcodWludDE2X3QgT0JfSVdERywgdWludDE2X3QgT0JfU1RPUCwgdWludDE2X3QgT0JfU1REQlkpDQp7DQogIEZMQVNIX1N0YXR1cyBzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19PQl9JV0RHX1NPVVJDRShPQl9JV0RHKSk7DQogIGFzc2VydF9wYXJhbShJU19PQl9TVE9QX1NPVVJDRShPQl9TVE9QKSk7DQogIGFzc2VydF9wYXJhbShJU19PQl9TVERCWV9TT1VSQ0UoT0JfU1REQlkpKTsNCiAgLyogQXV0aG9yaXplIHRoZSBzbWFsbCBpbmZvcm1hdGlvbiBibG9jayBwcm9ncmFtbWluZyAqLw0KICBGTEFTSC0+T1BUS0VZUiA9IEZMQVNIX0tFWTE7DQogIEZMQVNILT5PUFRLRVlSID0gRkxBU0hfS0VZMjsNCiAgDQogIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLw0KICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihQcm9ncmFtVGltZW91dCk7DQogIA0KICBpZihzdGF0dXMgPT0gRkxBU0hfQ09NUExFVEUpDQogIHsgIA0KICAgIC8qIEVuYWJsZSB0aGUgT3B0aW9uIEJ5dGVzIFByb2dyYW1taW5nIG9wZXJhdGlvbiAqLw0KICAgIEZMQVNILT5DUiB8PSBDUl9PUFRQR19TZXQ7IA0KICAgICAgICAgICANCiAgICBPQi0+VVNFUiA9ICggT0JfSVdERyB8IE9CX1NUT1AgfE9CX1NUREJZKSB8ICh1aW50MTZfdCkweEY4OyANCiAgDQogICAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovDQogICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oUHJvZ3JhbVRpbWVvdXQpOw0KICAgIGlmKHN0YXR1cyAhPSBGTEFTSF9CVVNZKQ0KICAgIHsNCiAgICAgIC8qIGlmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFBHIEJpdCAqLw0KICAgICAgRkxBU0gtPkNSICY9IENSX09QVFBHX1Jlc2V0Ow0KICAgIH0NCiAgfSAgICANCiAgLyogUmV0dXJuIHRoZSBPcHRpb24gQnl0ZSBwcm9ncmFtIFN0YXR1cyAqLw0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlcy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlczpJV0RHX1NXKEJpdDApLCBSU1RfU1RPUChCaXQxKQ0KICAqICAgYW5kIFJTVF9TVERCWShCaXQyKS4NCiAgKi8NCnVpbnQzMl90IEZMQVNIX0dldFVzZXJPcHRpb25CeXRlKHZvaWQpDQp7DQogIC8qIFJldHVybiB0aGUgVXNlciBPcHRpb24gQnl0ZSAqLw0KICByZXR1cm4gKHVpbnQzMl90KShGTEFTSC0+T0JSID4+IDIpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gT3B0aW9uIEJ5dGVzIFJlZ2lzdGVyIHZhbHVlLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgOiBUaGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiAgT3B0aW9uIEJ5dGVzIFJlZ2lzdGVyIHZhbHVlDQogICovDQp1aW50MzJfdCBGTEFTSF9HZXRXcml0ZVByb3RlY3Rpb25PcHRpb25CeXRlKHZvaWQpDQp7DQogIC8qIFJldHVybiB0aGUgRmFsc2ggd3JpdGUgcHJvdGVjdGlvbiBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gKHVpbnQzMl90KShGTEFTSC0+V1JQUik7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIEZMQVNIIFJlYWQgT3V0IFByb3RlY3Rpb24gU3RhdHVzIGlzIHNldCANCiAgKiAgIG9yIG5vdC4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIDogRkxBU0ggUmVhZE91dCBQcm90ZWN0aW9uIFN0YXR1cyhTRVQgb3IgUkVTRVQpDQogICovDQpGbGFnU3RhdHVzIEZMQVNIX0dldFJlYWRPdXRQcm90ZWN0aW9uU3RhdHVzKHZvaWQpDQp7DQogIEZsYWdTdGF0dXMgcmVhZG91dHN0YXR1cyA9IFJFU0VUOw0KICBpZiAoKEZMQVNILT5PQlIgJiBSRFBSVF9NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICByZWFkb3V0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJlYWRvdXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gcmVhZG91dHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIHN0YXR1cyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgOiBGTEFTSCBQcmVmZXRjaCBCdWZmZXIgU3RhdHVzIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBGTEFTSF9HZXRQcmVmZXRjaEJ1ZmZlclN0YXR1cyh2b2lkKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICANCiAgaWYgKChGTEFTSC0+QUNSICYgQUNSX1BSRlRCU19NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBuZXcgc3RhdGUgb2YgRkxBU0ggUHJlZmV0Y2ggQnVmZmVyIFN0YXR1cyAoU0VUIG9yIFJFU0VUKSAqLw0KICByZXR1cm4gYml0c3RhdHVzOyANCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgRkxBU0ggaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gRkxBU0hfSVQ6IHNwZWNpZmllcyB0aGUgRkxBU0ggaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgDQogICogICBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZMQVNIX0lUX0VSUk9SOiBGTEFTSCBFcnJvciBJbnRlcnJ1cHQNCiAgKiBAYXJnIEZMQVNIX0lUX0VPUDogRkxBU0ggZW5kIG9mIG9wZXJhdGlvbiBJbnRlcnJ1cHQNCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEZsYXNoIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiAgICAgIA0KICAqIEByZXR2YWwgOiBOb25lIA0KICAqLw0Kdm9pZCBGTEFTSF9JVENvbmZpZyh1aW50MTZfdCBGTEFTSF9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfSVQoRkxBU0hfSVQpKTsgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIGludGVycnVwdCBzb3VyY2VzICovDQogICAgRkxBU0gtPkNSIHw9IEZMQVNIX0lUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIGludGVycnVwdCBzb3VyY2VzICovDQogICAgRkxBU0gtPkNSICY9IH4odWludDMyX3QpRkxBU0hfSVQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEZMQVNIIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiAgKiBAcGFyYW0gRkxBU0hfRkxBRzogc3BlY2lmaWVzIHRoZSBGTEFTSCBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZMQVNIX0ZMQUdfQlNZOiBGTEFTSCBCdXN5IGZsYWcgICAgICAgICAgIA0KICAqIEBhcmcgRkxBU0hfRkxBR19QR0VSUjogRkxBU0ggUHJvZ3JhbSBlcnJvciBmbGFnICAgICAgIA0KICAqIEBhcmcgRkxBU0hfRkxBR19XUlBSVEVSUjogRkxBU0ggV3JpdGUgcHJvdGVjdGVkIGVycm9yIGZsYWcgICAgICANCiAgKiBAYXJnIEZMQVNIX0ZMQUdfRU9QOiBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgICAgICAgICAgIA0KICAqIEBhcmcgRkxBU0hfRkxBR19PUFRFUlI6ICBGTEFTSCBPcHRpb24gQnl0ZSBlcnJvciBmbGFnICAgICANCiAgKiBAcmV0dmFsIDogVGhlIG5ldyBzdGF0ZSBvZiBGTEFTSF9GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBGTEFTSF9HZXRGbGFnU3RhdHVzKHVpbnQxNl90IEZMQVNIX0ZMQUcpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHKSkgOw0KICBpZihGTEFTSF9GTEFHID09IEZMQVNIX0ZMQUdfT1BURVJSKSANCiAgew0KICAgIGlmKChGTEFTSC0+T0JSICYgRkxBU0hfRkxBR19PUFRFUlIpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgICB7DQogICAgICBiaXRzdGF0dXMgPSBTRVQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICBpZigoRkxBU0gtPlNSICYgRkxBU0hfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgIHsNCiAgICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAgIH0NCiAgfQ0KICAvKiBSZXR1cm4gdGhlIG5ldyBzdGF0ZSBvZiBGTEFTSF9GTEFHIChTRVQgb3IgUkVTRVQpICovDQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBGTEFTSJJzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtIEZMQVNIX0ZMQUc6IHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZ3MgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRkxBU0hfRkxBR19CU1k6IEZMQVNIIEJ1c3kgZmxhZyAgICAgICAgICAgDQogICogQGFyZyBGTEFTSF9GTEFHX1BHRVJSOiBGTEFTSCBQcm9ncmFtIGVycm9yIGZsYWcgICAgICAgDQogICogQGFyZyBGTEFTSF9GTEFHX1dSUFJURVJSOiBGTEFTSCBXcml0ZSBwcm90ZWN0ZWQgZXJyb3IgZmxhZyAgICAgIA0KICAqIEBhcmcgRkxBU0hfRkxBR19FT1A6IEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAgICAgICAgICAgDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRkxBU0hfQ2xlYXJGbGFnKHVpbnQxNl90IEZMQVNIX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GTEFTSF9DTEVBUl9GTEFHKEZMQVNIX0ZMQUcpKSA7DQogIA0KICAvKiBDbGVhciB0aGUgZmxhZ3MgKi8NCiAgRkxBU0gtPlNSID0gRkxBU0hfRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBGTEFTSCBTdGF0dXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCA6IEZMQVNIIFN0YXR1czogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZTogRkxBU0hfQlVTWSwgDQogICogICBGTEFTSF9FUlJPUl9QRywgRkxBU0hfRVJST1JfV1JQIG9yIEZMQVNIX0NPTVBMRVRFDQogICovDQpGTEFTSF9TdGF0dXMgRkxBU0hfR2V0U3RhdHVzKHZvaWQpDQp7DQogIEZMQVNIX1N0YXR1cyBmbGFzaHN0YXR1cyA9IEZMQVNIX0NPTVBMRVRFOw0KICANCiAgaWYoKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfQlNZKSA9PSBGTEFTSF9GTEFHX0JTWSkgDQogIHsNCiAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0JVU1k7DQogIH0NCiAgZWxzZSANCiAgeyAgDQogICAgaWYoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19QR0VSUikNCiAgICB7IA0KICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9FUlJPUl9QRzsNCiAgICB9DQogICAgZWxzZSANCiAgICB7DQogICAgICBpZihGTEFTSC0+U1IgJiBGTEFTSF9GTEFHX1dSUFJURVJSKQ0KICAgICAgew0KICAgICAgICBmbGFzaHN0YXR1cyA9IEZMQVNIX0VSUk9SX1dSUDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgZmxhc2hzdGF0dXMgPSBGTEFTSF9DT01QTEVURTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgLyogUmV0dXJuIHRoZSBGbGFzaCBTdGF0dXMgKi8NCiAgcmV0dXJuIGZsYXNoc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFdhaXRzIGZvciBhIEZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBvciBhIFRJTUVPVVQgdG8gb2NjdXIuDQogICogQHBhcmFtIFRpbWVvdXQ6IEZMQVNIIHByb2dhbW1pbmcgVGltZW91dA0KICAqIEByZXR2YWwgOiBGTEFTSCBTdGF0dXM6IFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmU6IEZMQVNIX0JVU1ksIA0KICAqICAgRkxBU0hfRVJST1JfUEcsIEZMQVNIX0VSUk9SX1dSUCwgRkxBU0hfQ09NUExFVEUgb3IgDQogICogICBGTEFTSF9USU1FT1VULg0KICAqLw0KRkxBU0hfU3RhdHVzIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKHVpbnQzMl90IFRpbWVvdXQpDQp7IA0KICBGTEFTSF9TdGF0dXMgc3RhdHVzID0gRkxBU0hfQ09NUExFVEU7DQogICANCiAgLyogQ2hlY2sgZm9yIHRoZSBGbGFzaCBTdGF0dXMgKi8NCiAgc3RhdHVzID0gRkxBU0hfR2V0U3RhdHVzKCk7DQogIC8qIFdhaXQgZm9yIGEgRmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIG9yIGEgVElNRU9VVCB0byBvY2N1ciAqLw0KICB3aGlsZSgoc3RhdHVzID09IEZMQVNIX0JVU1kpICYmIChUaW1lb3V0ICE9IDB4MDApKQ0KICB7DQogICAgZGVsYXkoKTsNCiAgICBzdGF0dXMgPSBGTEFTSF9HZXRTdGF0dXMoKTsNCiAgICBUaW1lb3V0LS07DQogIH0NCiAgaWYoVGltZW91dCA9PSAweDAwICkNCiAgew0KICAgIHN0YXR1cyA9IEZMQVNIX1RJTUVPVVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBvcGVyYXRpb24gc3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5zZXJ0cyBhIHRpbWUgZGVsYXkuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIGRlbGF5KHZvaWQpDQp7DQogIF9fSU8gdWludDMyX3QgaSA9IDA7DQogIGZvcihpID0gMHhGRjsgaSAhPSAwOyBpLS0pDQogIHsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDkgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K