LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDR4eF9oYWxfc3dwbWkuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQGJyaWVmICAgU1dQTUkgSEFMIG1vZHVsZSBkcml2ZXIuDQogICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU2luZ2xlIFdpcmUgUHJvdG9jb2wgTWFzdGVyIEludGVyZmFjZSAoU1dQTUkpLg0KICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uDQogICogICAgICAgICAgICsgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zDQogICogICAgICAgICAgICsgRE1BIHRyYW5zZmVycyBtYW5hZ2VtZW50DQogICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudA0KICBAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICBbLi5dDQogICAgIFRoZSBTV1BNSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6DQoNCiAgICAoIykgRGVjbGFyZSBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNXUE1JX0hhbmRsZVR5cGVEZWYgaHN3cG1pKS4NCg0KICAgICgjKSBJbml0aWFsaXplIHRoZSBTV1BNSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NXUE1JX01zcEluaXQoKSBBUEk6DQogICAgICAgICgjIykgRW5hYmxlIHRoZSBTV1BNSXggaW50ZXJmYWNlIGNsb2NrIHdpdGggX19IQUxfUkNDX1NXUE1JeF9DTEtfRU5BQkxFKCkuDQogICAgICAgICgjIykgU1dQTUkgSU8gY29uZmlndXJhdGlvbjoNCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTV1BNSSBHUElPLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFNXUE1JIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuDQogICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1NXUE1JX1RyYW5zbWl0X0lUKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKSBBUElzKToNCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1dQTUl4IGludGVycnVwdCBwcmlvcml0eSB3aXRoIEhBTF9OVklDX1NldFByaW9yaXR5KCkuDQogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU1dQTUkgSVJRIGhhbmRsZSB3aXRoIEhBTF9OVklDX0VuYWJsZUlSUSgpLg0KDQogICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NXUE1JX1JlY2VpdmVfRE1BKCkgQVBJcyk6DQogICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVscy4NCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suDQogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkDQogICAgICAgICAgICAgICAgICBUeC9SeCBwYXJhbWV0ZXJzLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbHMgYW5kIHJlcXVlc3RzLg0KICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBTV1BNSSBETUEgVHgvUnggaGFuZGxlLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUNCiAgICAgICAgICAgICAgICAgIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWxzLg0KDQogICAgKCMpIFByb2dyYW0gdGhlIEJpdGUgUmF0ZSwgVHggQnVmZmVyaW5nIG1vZGUsIFJ4IEJ1ZmZlcmluZyBtb2RlIGluIHRoZSBJbml0IHN0cnVjdHVyZS4NCg0KICAgICgjKSBFbmFibGUgdGhlIFNXUE1JIHBlcmlwaGVyYWwgYnkgY2FsbGluZyB0aGUgSEFMX1NXUE1JX0luaXQoKSBmdW5jdGlvbi4NCg0KICBbLi5dDQogICAgVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoNCg0KICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKg0KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NXUE1JX1RyYW5zbWl0KCkNCiAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NXUE1JX1JlY2VpdmUoKQ0KDQogICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioNCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TV1BNSV9UcmFuc21pdF9JVCgpDQogICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4NCiAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKQ0KICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKQ0KICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuDQogICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkNCiAgICAgICgrKSBJbiBjYXNlIG9mIGZsYWcgZXJyb3IsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIA0KICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkNCg0KICAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqDQogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBbLi5dDQogICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKCkNCiAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbg0KICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpDQogICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU1dQTUlfUmVjZWl2ZV9ETUEoKQ0KICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuDQogICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkNCiAgICAgICgrKSBJbiBjYXNlIG9mIGZsYWcgZXJyb3IsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuDQogICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKQ0KICAgICAgKCspIFN0b3AgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfU1dQTUlfRE1BU3RvcCgpDQoNCiAgICAqKiogU1dQTUkgSEFMIGRyaXZlciBhZGRpdGlvbmFsIGZ1bmN0aW9uIGxpc3QgKioqDQogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBbLi5dDQogICAgICBCZWxvdyB0aGUgbGlzdCB0aGUgb3RoZXJzIEFQSSBhdmFpbGFibGUgU1dQTUkgSEFMIGRyaXZlciA6DQoNCiAgICAgICgrKSBIQUxfU1dQTUlfRW5hYmxlTG9vcGJhY2soKTogRW5hYmxlIHRoZSBsb29wYmFjayBtb2RlIGZvciB0ZXN0IHB1cnBvc2Ugb25seQ0KICAgICAgKCspIEhBTF9TV1BNSV9EaXNhYmxlTG9vcGJhY2soKTogRGlzYWJsZSB0aGUgbG9vcGJhY2sgbW9kZQ0KDQogICAgKioqIFNXUE1JIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqDQogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gU1dQTUkgSEFMIGRyaXZlciA6DQoNCiAgICAgICgrKSBfX0hBTF9TV1BNSV9FTkFCTEUoKTogRW5hYmxlIHRoZSBTV1BNSSBwZXJpcGhlcmFsDQogICAgICAoKykgX19IQUxfU1dQTUlfRElTQUJMRSgpOiBEaXNhYmxlIHRoZSBTV1BNSSBwZXJpcGhlcmFsDQogICAgICAoKykgX19IQUxfU1dQTUlfRU5BQkxFX0lUKCk6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNXUE1JIGludGVycnVwdHMNCiAgICAgICgrKSBfX0hBTF9TV1BNSV9ESVNBQkxFX0lUKCk6IERpc2FibGUgdGhlIHNwZWNpZmllZCBTV1BNSSBpbnRlcnJ1cHRzDQogICAgICAoKykgX19IQUxfU1dQTUlfR0VUX0lUX1NPVVJDRSgpOiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIFNXUE1JIGludGVycnVwdCBzb3VyY2UgaXMNCiAgICAgICAgICBlbmFibGVkIG9yIGRpc2FibGVkDQogICAgICAoKykgX19IQUxfU1dQTUlfR0VUX0ZMQUcoKTogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNXUE1JIGZsYWcgaXMgc2V0IG9yIG5vdA0KDQogICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioNCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQ0KICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4NCiAgICBbLi5dDQogICAgICBVc2UgZnVuY3Rpb24gSEFMX1NXUE1JX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suIEl0IGFsbG93cyANCiAgICAgIHRvIHJlZ2lzdGVyIHRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzOg0KICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICA6IFNXUE1JIHJlY2VpdmUgY29tcGxldGUuDQogICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogU1dQTUkgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlLg0KICAgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICA6IFNXUE1JIHRyYW5zbWl0IGNvbXBsZXRlLg0KICAgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayA6IFNXUE1JIHRyYW5zbWl0IGhhbGYgY29tcGxldGUuDQogICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogU1dQTUkgZXJyb3IuDQogICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogU1dQTUkgTXNwSW5pdC4NCiAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBTV1BNSSBNc3BEZUluaXQuDQogICAgWy4uXQ0KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgY2FsbGJhY2sgSUQNCiAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLg0KICAgIFsuLl0NCiAgICBVc2UgZnVuY3Rpb24gSEFMX1NXUE1JX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQNCiAgICB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4NCiAgICBIQUxfU1dQTUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLA0KICAgIGFuZCB0aGUgY2FsbGJhY2sgSUQuDQogICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoNCiAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgOiBTV1BNSSByZWNlaXZlIGNvbXBsZXRlLg0KICAgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayA6IFNXUE1JIHJlY2VpdmUgaGFsZiBjb21wbGV0ZS4NCiAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgOiBTV1BNSSB0cmFuc21pdCBjb21wbGV0ZS4NCiAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgOiBTV1BNSSB0cmFuc21pdCBoYWxmIGNvbXBsZXRlLg0KICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICA6IFNXUE1JIGVycm9yLg0KICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IFNXUE1JIE1zcEluaXQuDQogICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogU1dQTUkgTXNwRGVJbml0Lg0KICAgIFsuLl0NCiAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSEFMX1NXUE1JX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfU1dQTUlfU1RBVEVfUkVTRVQNCiAgICBhbGwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOg0KICAgIGV4YW1wbGVzIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpLCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpLg0KICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgYXJlIHJlc3BlY3RpdmVseQ0KICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBIQUxfU1dQTUlfSW5pdA0KICAgIGFuZCBIQUxfU1dQTUlfRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLg0KICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgSEFMX1NXUE1JX0luaXQgYW5kIEhBTF9TV1BNSV9EZUluaXQNCiAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLg0KICAgIFsuLl0NCiAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIFJFQURZIHN0YXRlIG9ubHkuDQogICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZA0KICAgIGluIFJFQURZIG9yIFJFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZA0KICAgIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuDQogICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcw0KICAgIHVzaW5nIEhBTF9TV1BNSV9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1NXUE1JX0RlSW5pdA0KICAgIG9yIEhBTF9TV1BNSV9Jbml0IGZ1bmN0aW9uLg0KICAgIFsuLl0NCiAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3INCiAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQ0KICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuDQoNCiAgQGVuZHZlcmJhdGltDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBhdHRlbnRpb24NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqDQogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogICoNCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCiAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQogICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1INCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksDQogICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMybDR4eF9oYWwuaCINCg0KLyoqIEBhZGR0b2dyb3VwIFNUTTMyTDR4eF9IQUxfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KI2lmIGRlZmluZWQoU1dQTUkxKQ0KDQovKiogQGRlZmdyb3VwIFNXUE1JIFNXUE1JDQogICogQGJyaWVmIEhBTCBTV1BNSSBtb2R1bGUgZHJpdmVyDQogICogQHsNCiAgKi8NCiNpZmRlZiBIQUxfU1dQTUlfTU9EVUxFX0VOQUJMRUQNCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyoqIEBhZGR0b2dyb3VwIFNXUE1JX1ByaXZhdGVfQ29uc3RhbnRzIFNXUE1JIFByaXZhdGUgQ29uc3RhbnRzDQogICogQHsNCiAgKi8NCiNkZWZpbmUgU1dQTUlfVElNRU9VVF9WQUxVRSAgICAgICAgICAgICAgICAgICAyMjAwMFUgICAvKiBFbmQgb2YgdHJhbnNtaXNzaW9uIHRpbWVvdXQgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1RyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKTsNCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kUmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFRyYW5zbWl0UmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCBGbGFnLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOw0KDQovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0Z1bmN0aW9ucyBTV1BNSSBFeHBvcnRlZCBGdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBtZXRob2RzDQogICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAgKg0KQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBTV1BNSSBwZXJpcGhlcmFsLg0KICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFNXUE1JIHBlcmlwaGVyYWwuDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBTV1BNSSBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIFNXUE1JX0luaXRUeXBlRGVmLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCiAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwOw0KDQogIC8qIENoZWNrIHRoZSBTV1BNSSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KICBpZihoc3dwbWkgPT0gTlVMTCkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9WT0xUQUdFX0NMQVNTKGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfQklUUkFURV9WQUxVRShoc3dwbWktPkluaXQuQml0UmF0ZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9UWF9CVUZGRVJJTkdfTU9ERShoc3dwbWktPkluaXQuVHhCdWZmZXJpbmdNb2RlKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1NXUE1JX1JYX0JVRkZFUklOR19NT0RFKGhzd3BtaS0+SW5pdC5SeEJ1ZmZlcmluZ01vZGUpKTsNCg0KICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUKQ0KICAgIHsNCiAgICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCiAgICAgIGhzd3BtaS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICAgICAgLyogUmVzZXQgY2FsbGJhY2sgcG9pbnRlcnMgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFja3MgKi8NCiAgICAgIGhzd3BtaS0+UnhDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrOw0KICAgICAgaHN3cG1pLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrOw0KICAgICAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayAgICAgPSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2s7DQogICAgICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2s7DQogICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2sgICAgICA9IEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrOw0KDQogICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQogICAgICBpZihoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TV1BNSV9Nc3BJbml0Ow0KICAgICAgfQ0KICAgICAgaHN3cG1pLT5Nc3BJbml0Q2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQogICAgICBIQUxfU1dQTUlfTXNwSW5pdChoc3dwbWkpOw0KI2VuZGlmDQogICAgfQ0KDQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOw0KDQogICAgLyogRGlzYWJsZSBTV1BNSSBpbnRlcmZhY2UgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQoNCiAgICAvKiBDbGVhciBhbGwgU1dQTUkgaW50ZXJmYWNlIGZsYWdzICovDQogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgMHgwMTlGKTsNCg0KICAgIC8qIEFwcGx5IFZvbHRhZ2UgY2xhc3Mgc2VsZWN0aW9uICovDQogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5PUiwgU1dQTUlfT1JfQ0xBU1MsIGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpOw0KDQogICAgLyogSWYgVm9sdGFnZSBjbGFzcyBCLCBhcHBseSAzMDAgtXMgZGVsYXkgKi8NCiAgICBpZihoc3dwbWktPkluaXQuVm9sdGFnZUNsYXNzID09IFNXUE1JX1ZPTFRBR0VfQ0xBU1NfQikNCiAgICB7DQogICAgICAvKiBJbnN1cmUgMzAwILVzIHdhaXQgdG8gaW5zdXJlIFNXUE1JX0lPIG91dHB1dCBub3QgaGlnaGVyIHRoYW4gMS44ViAqLw0KICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgNCB0byBjb21wZW5zYXRlIHBhcnRpYWxseSBDUFUgcHJvY2Vzc2luZyBjeWNsZXMuICovDQogICAgICB3YWl0X2xvb3BfaW5kZXggPSAoMzAwICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDAwICogNCkpKSArIDE1MDsNCiAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwKQ0KICAgICAgew0KICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBDb25maWd1cmUgdGhlIEJSUiByZWdpc3RlciAoQml0cmF0ZSkgKi8NCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+QlJSLCBoc3dwbWktPkluaXQuQml0UmF0ZSk7DQoNCiAgICAvKiBBcHBseSBTV1BNSSBDUiBjb25maWd1cmF0aW9uICovDQogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5DUiwgXA0KICAgICAgICAgICAgICAgU1dQTUlfQ1JfUlhETUEgfCBTV1BNSV9DUl9UWERNQSAgfCBTV1BNSV9DUl9SWE1PREUgfCBTV1BNSV9DUl9UWE1PREUsIFwNCiAgICAgICAgICAgICAgIGhzd3BtaS0+SW5pdC5UeEJ1ZmZlcmluZ01vZGUgfCBoc3dwbWktPkluaXQuUnhCdWZmZXJpbmdNb2RlKTsNCg0KICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsICovDQogICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBEZS1pbml0aWFsaXplIHRoZSBTV1BNSSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRGVJbml0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIC8qIENoZWNrIHRoZSBTV1BNSSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KICBpZihoc3dwbWkgPT0gTlVMTCkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9JTlNUQU5DRShoc3dwbWktPkluc3RhbmNlKSk7DQoNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1k7DQoNCiAgICAvKiBEaXNhYmxlIFNXUE1JIGludGVyZmFjZSAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCg0KICAgIC8qIERpc2FibGUgTG9vcGJhY2sgbW9kZSAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfTFBCSyk7DQoNCg0KICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovDQojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQogICAgaWYoaHN3cG1pLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQ0KICAgIHsNCiAgICAgIGhzd3BtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfTXNwRGVJbml0Ow0KICAgIH0NCiAgICBoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrKGhzd3BtaSk7DQojZWxzZQ0KICAgIEhBTF9TV1BNSV9Nc3BEZUluaXQoaHN3cG1pKTsNCiNlbmRpZg0KDQogICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUOw0KDQogICAgLyogUmVsZWFzZSBMb2NrICovDQogICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgTVNQLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfTXNwSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBTV1BNSSBNU1AuDQogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9Nc3BEZUluaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQovKioNCiAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgdXNlciBTV1BNSSBjYWxsYmFjaw0KICAqICAgICAgICAgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2suDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlLg0KICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZC4NCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfUlhfQ09NUExFVEVfQ0JfSUQgcmVjZWl2ZSBjb21wbGV0ZSBjYWxsYmFjayBJRC4NCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElELg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1RYX0NPTVBMRVRFX0NCX0lEIHRyYW5zbWl0IGNvbXBsZXRlIGNhbGxiYWNrIElELg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1RYX0hBTEZDT01QTEVURV9DQl9JRCB0cmFuc21pdCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElELg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX0VSUk9SX0NCX0lEIGVycm9yIGNhbGxiYWNrIElELg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX01TUElOSVRfQ0JfSUQgTVNQIGluaXQgY2FsbGJhY2sgSUQuDQogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfTVNQREVJTklUX0NCX0lEIE1TUCBkZS1pbml0IGNhbGxiYWNrIElELg0KICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cy4NCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWdpc3RlckNhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgICAgICAgICpoc3dwbWksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1NXUE1JX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNXUE1JX0NhbGxiYWNrVHlwZURlZiAgICAgIHBDYWxsYmFjaykNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKHBDYWxsYmFjayA9PSBOVUxMKQ0KICB7DQogICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQogICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQogICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8NCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgew0KICAgICAgc3dpdGNoIChDYWxsYmFja0lEKQ0KICAgICAgew0KICAgICAgY2FzZSBIQUxfU1dQTUlfUlhfQ09NUExFVEVfQ0JfSUQgOg0KICAgICAgICBoc3dwbWktPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgSEFMX1NXUE1JX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6DQogICAgICAgIGhzd3BtaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgSEFMX1NXUE1JX1RYX0NPTVBMRVRFX0NCX0lEIDoNCiAgICAgICAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlIEhBTF9TV1BNSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgOg0KICAgICAgICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlIEhBTF9TV1BNSV9FUlJPUl9DQl9JRCA6DQogICAgICAgIGhzd3BtaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIDoNCiAgICAgICAgaHN3cG1pLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSBIQUxfU1dQTUlfTVNQREVJTklUX0NCX0lEIDoNCiAgICAgICAgaHN3cG1pLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCiAgICAgICAgYnJlYWs7DQogICAgICBkZWZhdWx0IDoNCiAgICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQogICAgICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLw0KICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUKQ0KICAgIHsNCiAgICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkNCiAgICAgIHsNCiAgICAgIGNhc2UgSEFMX1NXUE1JX01TUElOSVRfQ0JfSUQgOg0KICAgICAgICBoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlIEhBTF9TV1BNSV9NU1BERUlOSVRfQ0JfSUQgOg0KICAgICAgICBoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOw0KICAgICAgICBicmVhazsNCiAgICAgIGRlZmF1bHQgOg0KICAgICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCiAgICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQogICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovDQogICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8NCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOw0KICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8NCiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgdXNlciBTV1BNSSBjYWxsYmFjay4NCiAgKiAgICAgICAgIFNXUE1JIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjay4NCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUuDQogICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQuDQogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1JYX0NPTVBMRVRFX0NCX0lEIHJlY2VpdmUgY29tcGxldGUgY2FsbGJhY2sgSUQuDQogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIHJlY2VpdmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBJRC4NCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9UWF9DT01QTEVURV9DQl9JRCB0cmFuc21pdCBjb21wbGV0ZSBjYWxsYmFjayBJRC4NCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgdHJhbnNtaXQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBJRC4NCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9FUlJPUl9DQl9JRCBlcnJvciBjYWxsYmFjayBJRC4NCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIE1TUCBpbml0IGNhbGxiYWNrIElELg0KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX01TUERFSU5JVF9DQl9JRCBNU1AgZGUtaW5pdCBjYWxsYmFjayBJRC4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfVW5SZWdpc3RlckNhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgICAgICAgICpoc3dwbWksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU1dQTUlfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICB7DQogICAgc3dpdGNoIChDYWxsYmFja0lEKQ0KICAgIHsNCiAgICBjYXNlIEhBTF9TV1BNSV9SWF9DT01QTEVURV9DQl9JRCA6DQogICAgICBoc3dwbWktPlJ4Q3BsdENhbGxiYWNrID0gSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBIQUxfU1dQTUlfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIDoNCiAgICAgIGhzd3BtaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjazsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgSEFMX1NXUE1JX1RYX0NPTVBMRVRFX0NCX0lEIDoNCiAgICAgIGhzd3BtaS0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2s7DQogICAgICBicmVhazsNCiAgICBjYXNlIEhBTF9TV1BNSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgOg0KICAgICAgaHN3cG1pLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBIQUxfU1dQTUlfRVJST1JfQ0JfSUQgOg0KICAgICAgaHN3cG1pLT5FcnJvckNhbGxiYWNrID0gSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2s7DQogICAgICBicmVhazsNCiAgICBjYXNlIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIDoNCiAgICAgIGhzd3BtaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NXUE1JX01zcEluaXQ7DQogICAgICBicmVhazsNCiAgICBjYXNlIEhBTF9TV1BNSV9NU1BERUlOSVRfQ0JfSUQgOg0KICAgICAgaHN3cG1pLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TV1BNSV9Nc3BEZUluaXQ7DQogICAgICBicmVhazsNCiAgICBkZWZhdWx0IDoNCiAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQogICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLw0KICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQogIGVsc2UgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVTRVQpDQogIHsNCiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpDQogICAgew0KICAgIGNhc2UgSEFMX1NXUE1JX01TUElOSVRfQ0JfSUQgOg0KICAgICAgaHN3cG1pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfTXNwSW5pdDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgSEFMX1NXUE1JX01TUERFSU5JVF9DQl9JRCA6DQogICAgICBoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NXUE1JX01zcERlSW5pdDsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQgOg0KICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQogICAgICBoc3dwbWktPkVycm9yQ29kZSB8PSBIQUxfU1dQTUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsNCiAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovDQogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogICAgICBicmVhazsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovDQogICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7DQogICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8NCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgcmV0dXJuIHN0YXR1czsNCn0NCiNlbmRpZiAvKiBVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwMiBJTyBvcGVyYXRpb24gbWV0aG9kcw0KICAqICBAYnJpZWYgU1dQTUkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMNCiAgKg0KQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBtZXRob2RzICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIFsuLl0NCiAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU1dQTUkNCiAgICAgZGF0YSB0cmFuc2ZlcnMuDQoNCiAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoNCiAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuDQogICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uDQogICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuDQogICAgICAgKCsrKSBOb24tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMNCiAgICAgICAgICAgb3IgRE1BLiBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUNCiAgICAgICAgICAgZGVkaWNhdGVkIFNXUE1JIEludGVycnVwdCBoYW5kbGVyIChIQUxfU1dQTUlfSVJRSGFuZGxlcigpKSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yDQogICAgICAgICAgIHRoZSBzZWxlY3RlZCBETUEgY2hhbm5lbCBpbnRlcnJ1cHQgaGFuZGxlciB3aGVuIHVzaW5nIERNQSBtb2RlLg0KICAgICAgICAgICBUaGUgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzDQogICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgcHJvY2Vzcy4NCiAgICAgICAgICAgVGhlIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkLg0KDQogICAgKCMpIEJsb2NraW5nIG1vZGUgQVBJJ3MgYXJlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UcmFuc21pdCgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmUoKQ0KDQogICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIEFQSSdzIHdpdGggSW50ZXJydXB0IGFyZToNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHJhbnNtaXRfSVQoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SZWNlaXZlX0lUKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfSVJRSGFuZGxlcigpDQoNCiAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJJ3Mgd2l0aCBETUEgYXJlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UcmFuc21pdF9ETUEoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SZWNlaXZlX0RNQSgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX0RNQVBhdXNlKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BUmVzdW1lKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BU3RvcCgpDQoNCiAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb24tQmxvY2tpbmcgbW9kZToNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpDQogICAgICAgICgrKykgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKQ0KDQogICAgKCMpIFRoZSBjYXBhYmlsaXR5IHRvIGxhdW5jaCB0aGUgYWJvdmUgSU8gb3BlcmF0aW9ucyBpbiBsb29wYmFjayBtb2RlIGZvcg0KICAgICAgICB1c2VyIGFwcGxpY2F0aW9uIHZlcmlmaWNhdGlvbjoNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRW5hYmxlTG9vcGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9EaXNhYmxlTG9vcGJhY2soKQ0KDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWkgcG9pbnRlciB0byBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1dQTUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9UcmFuc21pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90KiBwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSkNCiAgICB7DQogICAgICAvKiBDaGVjayBpZiBhIG5vbi1ibG9ja2luZyByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQoNCiAgICAgICAgLyogRGlzYWJsZSBhbnkgdHJhbnNtaXR0ZXIgaW50ZXJydXB0cyAqLw0KICAgICAgICBfX0hBTF9TV1BNSV9ESVNBQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVENJRSB8IFNXUE1JX0lUX1RJRSB8IFNXUE1JX0lUX1RYVU5SSUUgfCBTV1BNSV9JVF9UWEJFSUUpOw0KDQogICAgICAgIC8qIERpc2FibGUgYW55IHRyYW5zbWl0dGVyIGZsYWdzICovDQogICAgICAgIF9fSEFMX1NXUE1JX0NMRUFSX0ZMQUcoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGIHwgU1dQTUlfRkxBR19UWFVOUkYgfCBTV1BNSV9GTEFHX1RDRik7DQoNCiAgICAgICAgLyogRW5hYmxlIFNXUE1JIHBlcmlwaGVyYWwgaWYgbm90ICovDQogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWDsNCiAgICAgIH0NCg0KICAgICAgZG8NCiAgICAgIHsNCiAgICAgICAgLyogV2FpdCB0aGUgVFhFIHRvIHdyaXRlIGRhdGEgKi8NCiAgICAgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHN3cG1pLT5JbnN0YW5jZS0+SVNSLCBTV1BNSV9GTEFHX1RYRSkpDQogICAgICAgIHsNCiAgICAgICAgICBoc3dwbWktPkluc3RhbmNlLT5URFIgPSAoKnBEYXRhKyspOw0KICAgICAgICAgIFNpemUtLTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8NCiAgICAgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpDQogICAgICAgICAgew0KICAgICAgICAgICAgaWYoKFRpbWVvdXQgPT0gMCkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IHdoaWxlKFNpemUgIT0gMCk7DQoNCiAgICAgIC8qIFdhaXQgb24gVFhCRUYgZmxhZyB0byBiZSBhYmxlIHRvIHN0YXJ0IGEgc2Vjb25kIHRyYW5zZmVyICovDQogICAgICBpZihTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KGhzd3BtaSwgU1dQTUlfRkxBR19UWEJFRiwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spDQogICAgICB7DQogICAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8NCiAgICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX1RYQkVGX1RJTUVPVVQ7DQoNCiAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7DQogICAgICB9DQoNCiAgICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spDQogICAgICB7DQogICAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHJlY2VpdmUgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICAgICAgICB7DQogICAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICAgIH0NCiAgfQ0KDQogIGlmKChzdGF0dXMgIT0gSEFMX09LKSAmJiAoc3RhdHVzICE9IEhBTF9CVVNZKSkNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIH0NCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCiAgKiBAcGFyYW0gIGhzd3BtaSBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTV1BNSSBtb2R1bGUuDQogICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkDQogICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQ0Kew0KICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpKQ0KICAgIHsNCiAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQoNCiAgICAgICAgLyogRGlzYWJsZSBhbnkgcmVjZWl2ZXIgaW50ZXJydXB0cyAqLw0KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9TUklFIHwgU1dQTUlfSVRfUklFIHwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIGRvDQogICAgICB7DQogICAgICAgIC8qIFdhaXQgdGhlIFJYTkUgdG8gcmVhZCBkYXRhICovDQogICAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgU1dQTUlfRkxBR19SWE5FKSkNCiAgICAgICAgew0KICAgICAgICAgICgqcERhdGErKykgPSBoc3dwbWktPkluc3RhbmNlLT5SRFI7DQogICAgICAgICAgU2l6ZS0tOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBpZigoVGltZW91dCA9PSAwKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gd2hpbGUoU2l6ZSAhPSAwKTsNCg0KICAgICAgaWYoc3RhdHVzID09IEhBTF9PSykNCiAgICAgIHsNCiAgICAgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHN3cG1pLT5JbnN0YW5jZS0+SVNSLCBTV1BNSV9GTEFHX1JYQkZGKSkNCiAgICAgICAgew0KICAgICAgICAgIC8qIENsZWFyIFJYQkZGIGF0IGVuZCBvZiByZWNlcHRpb24gKi8NCiAgICAgICAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYQkZGKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHRyYW5zbWl0IFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkNCiAgICAgICAgew0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgICB9DQogIH0NCg0KICBpZigoc3RhdHVzICE9IEhBTF9PSykgJiYgKHN0YXR1cyAhPSBIQUxfQlVTWSkpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICB9DQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIGhzd3BtaSBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTV1BNSSBtb2R1bGUuDQogICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9UcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkpDQogICAgew0KICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICAgICAgaHN3cG1pLT5wVHhCdWZmUHRyID0gcERhdGE7DQogICAgICBoc3dwbWktPlR4WGZlclNpemUgPSBTaXplOw0KICAgICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IFNpemU7DQogICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOw0KDQogICAgICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IHVuZGVycnVuIGVycm9yICovDQogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9UWFVOUklFKTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgaW50ZXJydXB0czogICAgICAqLw0KICAgICAgLyogLSBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICovDQogICAgICAvKiAtIFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSAgICAgICAgICAgKi8NCiAgICAgIC8qIC0gVHJhbnNtaXQvUmVjZXB0aW9uIGNvbXBsZXRpb24gICAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhCRUlFIHwgU1dQTUlfSVRfVENJRSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBzdGF0dXMgPSAgSEFMX0JVU1k7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKSkNCiAgICB7DQogICAgICAvKiBVcGRhdGUgaGFuZGxlICovDQogICAgICBoc3dwbWktPnBSeEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICAgIGhzd3BtaS0+UnhYZmVyU2l6ZSA9IFNpemU7DQogICAgICBoc3dwbWktPlJ4WGZlckNvdW50ID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSBzbGF2ZSByZXN1bWUgKi8NCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0LCByZWNlaXZlIENSQyBFcnJvciwgcmVjZWl2ZSBvdmVycnVuIGFuZCBSeEJ1ZiBJbnRlcnJ1cHQgKi8NCiAgICAgIC8qICBFbmFibGUgdGhlIFNXUE1JIFRyYW5zbWl0L1JlY2VwdGlvbiBjb21wbGV0aW9uICAgKi8NCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1JJRSB8IFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWE9WUklFIHwgU1dQTUlfSVRfUlhCRklFKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1RyYW5zbWl0X0RNQShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkpDQogICAgew0KICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICAgICAgaHN3cG1pLT5wVHhCdWZmUHRyID0gcERhdGE7DQogICAgICBoc3dwbWktPlR4WGZlclNpemUgPSBTaXplOw0KICAgICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IFNpemU7DQogICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOw0KDQogICAgICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFUcmFuc21pdENwbHQ7DQoNCiAgICAgIC8qIFNldCB0aGUgU1dQTUkgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCiAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVR4SGFsZkNwbHQ7DQoNCiAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTV1BNSV9ETUFFcnJvcjsNCg0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSB0cmFuc21pdCBETUEgY2hhbm5lbCAqLw0KICAgICAgSEFMX0RNQV9TdGFydF9JVChoc3dwbWktPmhkbWF0eCwgKHVpbnQzMl90KWhzd3BtaS0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZoc3dwbWktPkluc3RhbmNlLT5URFIsIFNpemUpOw0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSB0cmFuc21pdCB1bmRlcnJ1biBlcnJvciAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVFhVTlJJRSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFRYRE1BIGJpdA0KICAgICAgICAgaW4gdGhlIFNXUE1JIENSIHJlZ2lzdGVyICovDQogICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlX0RNQShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkpDQogICAgew0KICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICAgICAgaHN3cG1pLT5wUnhCdWZmUHRyID0gcERhdGE7DQogICAgICBoc3dwbWktPlJ4WGZlclNpemUgPSBTaXplOw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCg0KICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIC8qIFNldCB0aGUgU1dQTUkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVJlY2VpdmVDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFSeEhhbGZDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1dQTUlfRE1BRXJyb3I7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHJlcXVlc3QgKi8NCiAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHN3cG1pLT5oZG1hcngsICh1aW50MzJfdCkmaHN3cG1pLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHN3cG1pLT5wUnhCdWZmUHRyLCBTaXplKTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgcmVjZWl2ZSBDUkMgRXJyb3IgYW5kIHJlY2VpdmUgb3ZlcnJ1biBpbnRlcnJ1cHRzICovDQogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhPVlJJRSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBSWERNQSBiaXQNCiAgICAgICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLw0KICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBTdG9wIGFsbCBETUEgdHJhbnNmZXJzLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUxfT0sNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9ETUFTdG9wKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogIC8qIERpc2FibGUgdGhlIFNXUE1JIFR4L1J4IERNQSByZXF1ZXN0cyAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIChTV1BNSV9DUl9UWERNQSB8IFNXUE1JX0NSX1JYRE1BKSk7DQoNCiAgLyogQWJvcnQgdGhlIFNXUE1JIERNQSB0eCBjaGFubmVsICovDQogIGlmKGhzd3BtaS0+aGRtYXR4ICE9IE5VTEwpDQogIHsNCiAgICBIQUxfRE1BX0Fib3J0KGhzd3BtaS0+aGRtYXR4KTsNCiAgfQ0KICAvKiBBYm9ydCB0aGUgU1dQTUkgRE1BIHJ4IGNoYW5uZWwgKi8NCiAgaWYoaHN3cG1pLT5oZG1hcnggIT0gTlVMTCkNCiAgew0KICAgIEhBTF9ETUFfQWJvcnQoaHN3cG1pLT5oZG1hcngpOw0KICB9DQoNCiAgLyogRGlzYWJsZSBTV1BNSSBpbnRlcmZhY2UgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KDQogIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiBFbmFibGUgdGhlIExvb3BiYWNrIG1vZGUuDQogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAbm90ZSAgTG9vcGJhY2sgbW9kZSBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIHRlc3QgcHVycG9zZXMNCiAgKiBAcmV0dmFsIEhBTF9PSyAvIEhBTF9CVVNZDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRW5hYmxlTG9vcGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOw0KDQogIC8qIFByb2Nlc3MgTG9ja2VkICovDQogIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAvKiBNYWtlIHN1cmUgdGhlIFNXUE1JIGludGVyZmFjZSBpcyBub3QgZW5hYmxlZCB0byBzZXQgdGhlIGxvb3BiYWNrIG1vZGUgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KDQogIC8qIFNldCBMb29wYmFjayAqLw0KICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9MUEJLKTsNCg0KICAvKiBFbmFibGUgU1dQTUkgaW50ZXJmYWNlIGluIGxvb3BiYWNrIG1vZGUgKi8NCiAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBEaXNhYmxlIHRoZSBMb29wYmFjayBtb2RlLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQG5vdGUgIExvb3BiYWNrIG1vZGUgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciB0ZXN0IHB1cnBvc2VzDQogICogQHJldHZhbCBIQUxfT0sgLyBIQUxfQlVTWQ0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0Rpc2FibGVMb29wYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmICBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogIC8qIE1ha2Ugc3VyZSB0aGUgU1dQTUkgaW50ZXJmYWNlIGlzIG5vdCBlbmFibGVkIHRvIHJlc2V0IHRoZSBsb29wYmFjayBtb2RlICovDQogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCg0KICAvKiBSZXNldCBMb29wYmFjayAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX0xQQkspOw0KDQogIC8qIFJlLWVuYWJsZSBTV1BNSSBpbnRlcmZhY2UgaW4gbm9ybWFsIG1vZGUgKi8NCiAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXAzIFNXUE1JIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFja3MNCiAqICBAYnJpZWYgIFNXUE1JICBJUlEgaGFuZGxlci4NCiAqDQpAdmVyYmF0aW0NCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgU1dQTUkgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcyAgIyMjIyMNCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgU1dQTUkgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucyBjYWxsZWQgd2l0aGluDQogICAgICB0aGUgSVJRIGhhbmRsZXIuDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBIYW5kbGUgU1dQTUkgaW50ZXJydXB0IHJlcXVlc3QuDQogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSEFMX1NXUE1JX0lSUUhhbmRsZXIoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICB1aW50MzJfdCByZWdpc3IgPSBSRUFEX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JU1IpOw0KICB1aW50MzJfdCByZWdpZXIgPSBSRUFEX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JRVIpOw0KICB1aW50MzJfdCBlcnJjb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgLyogU1dQTUkgQ1JDIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19SWEJFUkYpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1JYQkVSSUUpICE9IFJFU0VUKSkNCiAgew0KICAgIC8qIERpc2FibGUgUmVjZWl2ZSBDUkMgaW50ZXJydXB0ICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYQkZJRSk7DQogICAgLyogQ2xlYXIgUmVjZWl2ZSBDUkMgYW5kIFJlY2VpdmUgYnVmZmVyIGZ1bGwgZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRVJGIHwgU1dQTUlfRkxBR19SWEJGRik7DQoNCiAgICBlcnJjb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9DUkM7DQogIH0NCg0KICAvKiBTV1BNSSBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhPVlJGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWE9WUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIFJlY2VpdmUgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SWE9WUklFKTsNCiAgICAvKiBDbGVhciBSZWNlaXZlIG92ZXJydW4gZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhPVlJGKTsNCg0KICAgIGVycmNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX09WUjsNCiAgfQ0KDQogIC8qIFNXUE1JIFVuZGVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVFhVTlJGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9UWFVOUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIFRyYW5zbWl0IHVuZGVyIHJ1biBpbnRlcnJ1cHQgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9UWFVOUklFKTsNCiAgICAvKiBDbGVhciBUcmFuc21pdCB1bmRlciBydW4gZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfVFhVTlJGKTsNCg0KICAgIGVycmNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX1VEUjsNCiAgfQ0KDQogICAvKiBDYWxsIFNXUE1JIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZihlcnJjb2RlICE9IEhBTF9TV1BNSV9FUlJPUl9OT05FKQ0KICB7DQogICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gZXJyY29kZTsNCg0KICAgIGlmKChlcnJjb2RlICYgSEFMX1NXUE1JX0VSUk9SX1VEUikgIT0gUkVTRVQpDQogICAgew0KICAgICAgLyogQ2hlY2sgVFhETUEgdHJhbnNmZXIgdG8gYWJvcnQgKi8NCiAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSkpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgRE1BIFRYIGF0IFNXUE1JIGxldmVsICovDQogICAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfVFhETUEpOw0KDQogICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCAqLw0KICAgICAgICBpZihoc3dwbWktPmhkbWF0eCAhPSBOVUxMKQ0KICAgICAgICB7DQogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBUeCBETUEgQWJvcnQgY2FsbGJhY2sgOg0KICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8NCiAgICAgICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTV1BNSV9ETUFBYm9ydE9uRXJyb3I7DQogICAgICAgICAgLyogQWJvcnQgRE1BIFRYICovDQogICAgICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc3dwbWktPmhkbWF0eCkgIT0gSEFMX09LKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHN3cG1pLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8NCiAgICAgICAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoc3dwbWktPmhkbWF0eCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCiAgICAgICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogICAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQogICAgICAgIGhzd3BtaS0+RXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogQ2hlY2sgUlhETUEgdHJhbnNmZXIgdG8gYWJvcnQgKi8NCiAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9SWERNQSkpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgRE1BIFJYIGF0IFNXUE1JIGxldmVsICovDQogICAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpOw0KDQogICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgUnggY2hhbm5lbCAqLw0KICAgICAgICBpZihoc3dwbWktPmhkbWFyeCAhPSBOVUxMKQ0KICAgICAgICB7DQogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBSeCBETUEgQWJvcnQgY2FsbGJhY2sgOg0KICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8NCiAgICAgICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTV1BNSV9ETUFBYm9ydE9uRXJyb3I7DQogICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovDQogICAgICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc3dwbWktPmhkbWFyeCkgIT0gSEFMX09LKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHN3cG1pLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8NCiAgICAgICAgICAgIGhzd3BtaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc3dwbWktPmhkbWFyeCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCiAgICAgICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogICAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpDQogICAgICAgIGhzd3BtaS0+RXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1JJRSkgICE9IFJFU0VUKSkNCiAgew0KICAgIFNXUE1JX1JlY2VpdmVfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RYRSkgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVElFKSAhPSBSRVNFVCkpDQogIHsNCiAgICBTV1BNSV9UcmFuc21pdF9JVChoc3dwbWkpOw0KICB9DQoNCiAgLyogU1dQTUkgaW4gbW9kZSBUcmFuc21pdHRlciAoVHJhbnNtaXQgYnVmZmVyIGVtcHR5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVFhCRUYpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1RYQkVJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfRW5kVHJhbnNtaXRfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgUmVjZWl2ZXIgKFJlY2VpdmUgYnVmZmVyIGZ1bGwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYQkZGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWEJGSUUpICE9IFJFU0VUKSkNCiAgew0KICAgIFNXUE1JX0VuZFJlY2VpdmVfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIEJvdGggVHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gY29tcGxldGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RDRikgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVENJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfRW5kVHJhbnNtaXRSZWNlaXZlX0lUKGhzd3BtaSk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaHN3cG1pIFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaHN3cG1pIFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmIFNXUE1JIGVycm9yIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXA0IFBlcmlwaGVyYWwgQ29udHJvbCBtZXRob2RzDQogICogIEBicmllZiAgIFNXUE1JIGNvbnRyb2wgZnVuY3Rpb25zDQogICoNCkB2ZXJiYXRpbQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgbWV0aG9kcyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBbLi5dDQogICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTV1BNSS4NCiAgICAgKCspIEhBTF9TV1BNSV9HZXRTdGF0ZSgpIEFQSSBpcyBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgU1dQTUkgcGVyaXBoZXJhbA0KICAgICAoKykgSEFMX1NXUE1JX0dldEVycm9yKCkgQVBJIGlzIGhlbHBmdWwgdG8gY2hlY2sgaW4gcnVuLXRpbWUgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSBTV1BNSSBwZXJpcGhlcmFsDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgUmV0dXJuIHRoZSBTV1BNSSBoYW5kbGUgc3RhdGUuDQogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KICAqLw0KSEFMX1NXUE1JX1N0YXRlVHlwZURlZiBIQUxfU1dQTUlfR2V0U3RhdGUoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBSZXR1cm4gU1dQTUkgaGFuZGxlIHN0YXRlICovDQogIHJldHVybiBoc3dwbWktPlN0YXRlOw0KfQ0KDQovKioNCiogQGJyaWVmICBSZXR1cm4gdGhlIFNXUE1JIGVycm9yIGNvZGUuDQoqIEBwYXJhbSAgaHN3cG1pIDogcG9pbnRlciB0byBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1dQTUkuDQoqIEByZXR2YWwgU1dQTUkgRXJyb3IgQ29kZQ0KKi8NCnVpbnQzMl90IEhBTF9TV1BNSV9HZXRFcnJvcihTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIHJldHVybiBoc3dwbWktPkVycm9yQ29kZTsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIEBkZWZncm91cCBTV1BNSV9Qcml2YXRlX0Z1bmN0aW9ucyBTV1BNSSBQcml2YXRlIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4NCiAgKiBAbm90ZSAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NXUE1JX1RyYW5zbWl0X0lUKCkNCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9UcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZiAoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKSkNCiAgew0KICAgIGlmKGhzd3BtaS0+VHhYZmVyQ291bnQgPT0gMCkNCiAgICB7DQogICAgICAvKiBEaXNhYmxlIHRoZSBTV1BNSSBUWEUgYW5kIFVuZGVycnVuIEludGVycnVwdHMgKi8NCiAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIChTV1BNSV9JVF9USUUgfCBTV1BNSV9JVF9UWFVOUklFKSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBoc3dwbWktPkluc3RhbmNlLT5URFIgPSAodWludDMyX3QpKCpoc3dwbWktPnBUeEJ1ZmZQdHIrKyk7DQogICAgICBoc3dwbWktPlR4WGZlckNvdW50LS07DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICB9DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBXcmFwcyB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBDbGVhciB0aGUgU1dQTUkgVHJhbnNtaXQgYnVmZmVyIGVtcHR5IEZsYWcgKi8NCiAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgU1dQTUlfRkxBR19UWEJFRik7DQogIC8qIERpc2FibGUgdGhlIGFsbCBTV1BNSSBUcmFuc21pdCBJbnRlcnJ1cHRzICAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9USUUgfCBTV1BNSV9JVF9UWFVOUklFIHwgU1dQTUlfSVRfVFhCRUlFKTsNCg0KICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIH0NCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICBoc3dwbWktPlR4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQojZWxzZQ0KICBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLg0KICAqIEBub3RlICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU1dQTUlfUmVjZWl2ZV9JVCgpDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfUmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpKQ0KICB7DQogICAgKmhzd3BtaS0+cFJ4QnVmZlB0cisrID0gKHVpbnQzMl90KShoc3dwbWktPkluc3RhbmNlLT5SRFIpOw0KDQogICAgaWYoLS1oc3dwbWktPlJ4WGZlckNvdW50ID09IDApDQogICAgew0KICAgICAgLyogV2FpdCBmb3IgUlhCRkYgZmxhZyB0byB1cGRhdGUgc3RhdGUgKi8NCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCiAgICAgIGhzd3BtaS0+UnhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogICAgICBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JhcHMgdXAgcmVjZXB0aW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pIFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFJlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBDbGVhciB0aGUgU1dQTUkgUmVjZWl2ZSBidWZmZXIgZnVsbCBGbGFnICovDQogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRkYpOw0KICAvKiBEaXNhYmxlIHRoZSBhbGwgU1dQTUkgUmVjZWl2ZSBJbnRlcnJ1cHRzICAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SSUUgfCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhPVlJJRSB8IFNXUE1JX0lUX1JYQkZJRSk7DQoNCiAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JhcHMgdXAgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kVHJhbnNtaXRSZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogQ2xlYXIgdGhlIFNXUE1JIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnICovDQogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfVENGKTsNCiAgLyogRGlzYWJsZSB0aGUgU1dQTUkgVHJhbnNtaXNzaW9uICBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfVENJRSk7DQoNCiAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCiAgfQ0KICBlbHNlIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICB9DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQogIHVpbnQzMl90IHRpY2tzdGFydCA9IDA7DQoNCiAgLyogRE1BIE5vcm1hbCBtb2RlKi8NCiAgaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IFJFU0VUKQ0KICB7DQogICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQoNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgVFhETUEgYml0DQogICAgaW4gdGhlIFNXUE1JIENSIHJlZ2lzdGVyICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSk7DQoNCiAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLw0KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQoNCiAgICAvKiBXYWl0IHRoZSBUWEJFRiAqLw0KICAgIGlmKFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGLCB0aWNrc3RhcnQsIFNXUE1JX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykNCiAgICB7DQogICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovDQogICAgICBoc3dwbWktPkVycm9yQ29kZSB8PSBIQUxfU1dQTUlfRVJST1JfVFhCRUZfVElNRU9VVDsNCiAgICAgIA0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICAgICAgaHN3cG1pLT5FcnJvckNhbGxiYWNrKGhzd3BtaSk7DQojZWxzZQ0KICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbmRpZg0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogTm8gVGltZW91dCAqLw0KICAgICAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICAgIH0NCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICAgICAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgICAgIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2VuZGlmDQogICAgfQ0KICB9DQogIC8qIERNQSBDaXJjdWxhciBtb2RlICovDQogIGVsc2UNCiAgew0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICAgIGhzd3BtaS0+VHhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogICAgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQojZW5kaWYNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNXUE1JIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQ0Kew0KICBTV1BNSV9IYW5kbGVUeXBlRGVmKiBoc3dwbWkgPSAoU1dQTUlfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsNCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2VuZGlmDQp9DQoNCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suDQogICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50Ow0KDQogIC8qIERNQSBOb3JtYWwgbW9kZSovDQogIGlmKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSBSRVNFVCkNCiAgew0KICAgIGhzd3BtaS0+UnhYZmVyQ291bnQgPSAwOw0KDQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBSWERNQSBiaXQNCiAgICBpbiB0aGUgU1dQTUkgQ1IgcmVnaXN0ZXIgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsNCg0KICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgew0KICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICB9DQogIH0NCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkNCiAgaHN3cG1pLT5SeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQojZW5kaWYNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQ0Kew0KICBTV1BNSV9IYW5kbGVUeXBlRGVmKiBoc3dwbWkgPSAoU1dQTUlfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsNCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICBoc3dwbWktPlJ4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2Vsc2UNCiAgSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOw0KI2VuZGlmDQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQoNCiAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICBoc3dwbWktPlJ4WGZlckNvdW50ID0gMDsNCiAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+U3RhdGU9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0RNQTsNCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7DQojZW5kaWYNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQoNCiAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICBoc3dwbWktPlJ4WGZlckNvdW50ID0gMDsNCiAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+U3RhdGU9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQ0KICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiNlbHNlDQogIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7DQojZW5kaWYNCn0NCg0KLyoqDQogICogQGJyaWVmICBIYW5kbGUgU1dQTUkgQ29tbXVuaWNhdGlvbiBUaW1lb3V0Lg0KICAqIEBwYXJhbSAgaHN3cG1pIFNXUE1JIGhhbmRsZQ0KICAqIEBwYXJhbSAgRmxhZzogc3BlY2lmaWVzIHRoZSBTV1BNSSBmbGFnIHRvIGNoZWNrLg0KICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUNCiAgKiBAcGFyYW0gIFRpbWVvdXQgdGltZW91dCBkdXJhdGlvbi4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgRmxhZywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLw0KICB3aGlsZSghKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgRmxhZykpKQ0KICB7DQogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQogICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQ0KICAgIHsNCiAgICAgIGlmKChUaW1lb3V0ID09IDApIHx8ICgoSEFMX0dldFRpY2soKS1UaWNrc3RhcnQpID4gVGltZW91dCkpDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQojZW5kaWYgLyogSEFMX1NXUE1JX01PRFVMRV9FTkFCTEVEICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCiNlbmRpZiAvKiBTV1BNSTEgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==