LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfbHRkYy5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAYnJpZWYgICBMVERDIEhBTCBtb2R1bGUgZHJpdmVyLg0KICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgDQogICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBMVERDIHBlcmlwaGVyYWw6DQogICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucw0KICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICANCiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zDQogICogICAgICAgICAgIA0KICBAdmVyYmF0aW0gICAgICANCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICAgKCMpIFByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICAgDQogICAgICAgICB0aGUgTFREQyB0aW1pbmcsIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBwb2xhcml0eSwgDQogICAgICAgICB0aGUgcGl4ZWwgY2xvY2sgcG9sYXJpdHksIERhdGEgRW5hYmxlIHBvbGFyaXR5IGFuZCB0aGUgTFREQyBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIA0KICAgICAgICAgdXNpbmcgSEFMX0xURENfSW5pdCgpIGZ1bmN0aW9uDQoNCiAgICAgKCMpIFByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICAgDQogICAgICAgICB0aGUgcGl4ZWwgZm9ybWF0LCB0aGUgYmxlbmRpbmcgZmFjdG9ycywgaW5wdXQgYWxwaGEgdmFsdWUsIHRoZSB3aW5kb3cgc2l6ZSANCiAgICAgICAgIGFuZCB0aGUgaW1hZ2Ugc2l6ZSB1c2luZyBIQUxfTFREQ19Db25maWdMYXllcigpIGZ1bmN0aW9uIGZvciBmb3JlZ3JvdW5kDQogICAgICAgICBvci9hbmQgYmFja2dyb3VuZCBsYXllci4gICAgIA0KICANCiAgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIHRoZSBDTFVUIHVzaW5nIEhBTF9MVERDX0NvbmZpZ0NMVVQoKSBhbmQgDQogICAgICAgICBIQUxfTFREQ19FbmFibGVDTFVUIGZ1bmN0aW9ucy4NCiAgICAgICANCiAgICAgKCMpIE9wdGlvbmFsbHksIGVuYWJsZSB0aGUgRGl0aGVyIHVzaW5nIEhBTF9MVERDX0VuYWJsZURpdGhlcigpLiAgICAgICANCg0KICAgICAoIykgT3B0aW9uYWxseSwgY29uZmlndXJlIGFuZCBlbmFibGUgdGhlIENvbG9yIGtleWluZyB1c2luZyBIQUxfTFREQ19Db25maWdDb2xvcktleWluZygpDQogICAgICAgICBhbmQgSEFMX0xURENfRW5hYmxlQ29sb3JLZXlpbmcgZnVuY3Rpb25zLg0KDQogICAgICgjKSBPcHRpb25hbGx5LCBjb25maWd1cmUgTGluZUludGVycnVwdCB1c2luZyBIQUxfTFREQ19Qcm9ncmFtTGluZUV2ZW50KCkNCiAgICAgICAgIGZ1bmN0aW9uDQoNCiAgICAgKCMpIElmIG5lZWRlZCwgcmVjb25maWd1cmUgYW5kIGNoYW5nZSB0aGUgcGl4ZWwgZm9ybWF0IHZhbHVlLCB0aGUgYWxwaGEgdmFsdWUNCiAgICAgICAgIHZhbHVlLCB0aGUgd2luZG93IHNpemUsIHRoZSB3aW5kb3cgcG9zaXRpb24gYW5kIHRoZSBsYXllciBzdGFydCBhZGRyZXNzIA0KICAgICAgICAgZm9yIGZvcmVncm91bmQgb3IvYW5kIGJhY2tncm91bmQgbGF5ZXIgdXNpbmcgcmVzcGVjdGl2ZWx5IHRoZSBmb2xsb3dpbmcgDQogICAgICAgICBmdW5jdGlvbnM6IEhBTF9MVERDX1NldFBpeGVsRm9ybWF0KCksIEhBTF9MVERDX1NldEFscGhhKCksIEhBTF9MVERDX1NldFdpbmRvd1NpemUoKSwNCiAgICAgICAgIEhBTF9MVERDX1NldFdpbmRvd1Bvc2l0aW9uKCksIEhBTF9MVERDX1NldEFkZHJlc3MuDQoNCiAgICAgKCMpIFZhcmlhbnQgZnVuY3Rpb25zIHdpdGggk19Ob1JlbG9hZJQgcG9zdCBmaXggYWxsb3dzIHRvIHNldCB0aGUgTFREQyBjb25maWd1cmF0aW9uL3NldHRpbmdzIHdpdGhvdXQgaW1tZWRpYXRlIHJlbG9hZC4NCiAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGluIGNhc2Ugd2hlbiB0aGUgcHJvZ3JhbSByZXF1aXJlcyB0byBtb2RpZnkgc2VydmFsIExUREMgc2V0dGluZ3MgKG9uIG9uZSBvciBib3RoIGxheWVycykgDQogICAgICAgICB0aGVuIGFwcGx5aW5nKHJlbG9hZCkgdGhlc2Ugc2V0dGluZ3MgaW4gb25lIHNob3QgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gk0hBTF9MVERDX1JlbG9hZJQNCg0KICAgICAgICAgQWZ0ZXIgY2FsbGluZyB0aGUgk19Ob1JlbG9hZJQgZnVuY3Rpb25zIHRvIHNldCBkaWZmZXJlbnQgY29sb3IvZm9ybWF0L2xheWVyIHNldHRpbmdzLCANCiAgICAgICAgIHRoZSBwcm9ncmFtIGNhbiBjYWxsIHRoZSBmdW5jdGlvbiAgk0hBTF9MVERDX1JlbG9hZJQgVG8gYXBwbHkoUmVsb2FkKSB0aGVzZSBzZXR0aW5ncy4gDQogICAgICAgICBGdW5jdGlvbiCTSEFMX0xURENfUmVsb2FklCBjYW4gYmUgY2FsbGVkIHdpdGggdGhlIHBhcmFtZXRlciAgk1JlbG9hZFR5cGWUIA0KICAgICAgICAgc2V0IHRvIExURENfUkVMT0FEX0lNTUVESUFURSBpZiBhbiBpbW1lZGlhdGUgcmVsb2FkIGlzIHJlcXVpcmVkLg0KICAgICAgICAgRnVuY3Rpb24gk0hBTF9MVERDX1JlbG9hZJQgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgIJNSZWxvYWRUeXBllCANCiAgICAgICAgIHNldCB0byBMVERDX1JFTE9BRF9WRVJUSUNBTF9CTEFOS0lORyBpZiB0aGUgcmVsb2FkIHNob3VsZCBiZSBkb25lIGluIHRoZSBuZXh0IHZlcnRpY2FsIGJsYW5raW5nIHBlcmlvZCwgDQogICAgICAgICB0aGlzIG9wdGlvbiBhbGxvd3MgdG8gYXZvaWQgZGlzcGxheSBmbGlja2VyIGJ5IGFwcGx5aW5nIHRoZSBuZXcgc2V0dGluZ3MgZHVyaW5nIHRoZSB2ZXJ0aWNhbCBibGFua2luZyBwZXJpb2QuDQogICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQogICAgICgjKSBUbyBjb250cm9sIExUREMgc3RhdGUgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjogSEFMX0xURENfR2V0U3RhdGUoKSAgICAgICAgICAgICAgIA0KDQogICAgICoqKiBMVERDIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqDQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSANCiAgICAgWy4uXQ0KICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gTFREQyBIQUwgZHJpdmVyLg0KICAgICAgIA0KICAgICAgKCspIF9fSEFMX0xURENfRU5BQkxFOiBFbmFibGUgdGhlIExUREMuDQogICAgICAoKykgX19IQUxfTFREQ19ESVNBQkxFOiBEaXNhYmxlIHRoZSBMVERDLg0KICAgICAgKCspIF9fSEFMX0xURENfTEFZRVJfRU5BQkxFOiBFbmFibGUgYSBMVERDIExheWVyLg0KICAgICAgKCspIF9fSEFMX0xURENfTEFZRVJfRElTQUJMRTogRGlzYWJsZSBhIExUREMgTGF5ZXIuDQogICAgICAoKykgX19IQUxfTFREQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgTFREQyBwZW5kaW5nIGZsYWdzLg0KICAgICAgKCspIF9fSEFMX0xURENfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBMVERDIGludGVycnVwdHMuIA0KICAgICAgKCspIF9fSEFMX0xURENfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIExUREMgaW50ZXJydXB0cy4NCiAgICAgIA0KICAgICBbLi5dIA0KICAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBMVERDIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3Jvcw0KICANCiAgQGVuZHZlcmJhdGltDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBhdHRlbnRpb24NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqDQogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogICoNCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCiAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQogICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1INCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksDQogICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmY0eHhfaGFsLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkY0eHhfSEFMX0RyaXZlcg0KICAqIEB7DQogICovDQovKiogQGRlZmdyb3VwIExUREMgTFREQw0KICAqIEBicmllZiBMVERDIEhBTCBtb2R1bGUgZHJpdmVyDQogICogQHsNCiAgKi8NCg0KI2lmZGVmIEhBTF9MVERDX01PRFVMRV9FTkFCTEVEDQoNCiNpZiBkZWZpbmVkKFNUTTMyRjQyOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQzOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KQ0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpzdGF0aWMgdm9pZCBMVERDX1NldENvbmZpZyhMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnLCB1aW50MzJfdCBMYXllcklkeCk7DQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogQGRlZmdyb3VwIExURENfRXhwb3J0ZWRfRnVuY3Rpb25zIExUREMgRXhwb3J0ZWQgRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBMVERDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBMVERDDQogICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgTFREQyANCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCiAgDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIExUREMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgTFREQ19Jbml0VHlwZURlZi4NCiAgKiBAcGFyYW0gIGhsdGRjICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfSW5pdChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjKQ0Kew0KICB1aW50MzJfdCB0bXAgPSAwVSwgdG1wMSA9IDBVOw0KDQogIC8qIENoZWNrIHRoZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaWYoaGx0ZGMgPT0gTlVMTCkNCiAgew0KICAgIHJldHVybiBIQUxfRVJST1I7DQogIH0NCg0KICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0FMTF9JTlNUQU5DRShobHRkYy0+SW5zdGFuY2UpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfSFNZTkMoaGx0ZGMtPkluaXQuSG9yaXpvbnRhbFN5bmMpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfVlNZTkMoaGx0ZGMtPkluaXQuVmVydGljYWxTeW5jKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0FIQlAoaGx0ZGMtPkluaXQuQWNjdW11bGF0ZWRIQlApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQVZCUChobHRkYy0+SW5pdC5BY2N1bXVsYXRlZFZCUCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19BQUgoaGx0ZGMtPkluaXQuQWNjdW11bGF0ZWRBY3RpdmVIKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0FBVyhobHRkYy0+SW5pdC5BY2N1bXVsYXRlZEFjdGl2ZVcpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfVE9UQUxIKGhsdGRjLT5Jbml0LlRvdGFsSGVpZ2gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfVE9UQUxXKGhsdGRjLT5Jbml0LlRvdGFsV2lkdGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfSFNQT0woaGx0ZGMtPkluaXQuSFNQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19WU1BPTChobHRkYy0+SW5pdC5WU1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0RFUE9MKGhsdGRjLT5Jbml0LkRFUG9sYXJpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfUENQT0woaGx0ZGMtPkluaXQuUENQb2xhcml0eSkpOw0KDQogIGlmKGhsdGRjLT5TdGF0ZSA9PSBIQUxfTFREQ19TVEFURV9SRVNFVCkNCiAgew0KICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCiAgICBobHRkYy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCiAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCiAgICBIQUxfTFREQ19Nc3BJbml0KGhsdGRjKTsNCiAgfQ0KICANCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgSFMsIFZTLCBERSBhbmQgUEMgcG9sYXJpdHkgKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5HQ1IgJj0gfihMVERDX0dDUl9IU1BPTCB8IExURENfR0NSX1ZTUE9MIHwgTFREQ19HQ1JfREVQT0wgfCBMVERDX0dDUl9QQ1BPTCk7DQogIGhsdGRjLT5JbnN0YW5jZS0+R0NSIHw9ICAodWludDMyX3QpKGhsdGRjLT5Jbml0LkhTUG9sYXJpdHkgfCBobHRkYy0+SW5pdC5WU1BvbGFyaXR5IHwgXA0KICBobHRkYy0+SW5pdC5ERVBvbGFyaXR5IHwgaGx0ZGMtPkluaXQuUENQb2xhcml0eSk7DQoNCiAgLyogU2V0IFN5bmNocm9uaXphdGlvbiBzaXplICovDQogIGhsdGRjLT5JbnN0YW5jZS0+U1NDUiAmPSB+KExURENfU1NDUl9WU0ggfCBMVERDX1NTQ1JfSFNXKTsNCiAgdG1wID0gKGhsdGRjLT5Jbml0Lkhvcml6b250YWxTeW5jIDw8IDE2VSk7DQogIGhsdGRjLT5JbnN0YW5jZS0+U1NDUiB8PSAodG1wIHwgaGx0ZGMtPkluaXQuVmVydGljYWxTeW5jKTsNCg0KICAvKiBTZXQgQWNjdW11bGF0ZWQgQmFjayBwb3JjaCAqLw0KICBobHRkYy0+SW5zdGFuY2UtPkJQQ1IgJj0gfihMVERDX0JQQ1JfQVZCUCB8IExURENfQlBDUl9BSEJQKTsNCiAgdG1wID0gKGhsdGRjLT5Jbml0LkFjY3VtdWxhdGVkSEJQIDw8IDE2VSk7DQogIGhsdGRjLT5JbnN0YW5jZS0+QlBDUiB8PSAodG1wIHwgaGx0ZGMtPkluaXQuQWNjdW11bGF0ZWRWQlApOw0KDQogIC8qIFNldCBBY2N1bXVsYXRlZCBBY3RpdmUgV2lkdGggKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5BV0NSICY9IH4oTFREQ19BV0NSX0FBSCB8IExURENfQVdDUl9BQVcpOw0KICB0bXAgPSAoaGx0ZGMtPkluaXQuQWNjdW11bGF0ZWRBY3RpdmVXIDw8IDE2VSk7DQogIGhsdGRjLT5JbnN0YW5jZS0+QVdDUiB8PSAodG1wIHwgaGx0ZGMtPkluaXQuQWNjdW11bGF0ZWRBY3RpdmVIKTsNCg0KICAvKiBTZXQgVG90YWwgV2lkdGggKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5UV0NSICY9IH4oTFREQ19UV0NSX1RPVEFMSCB8IExURENfVFdDUl9UT1RBTFcpOw0KICB0bXAgPSAoaGx0ZGMtPkluaXQuVG90YWxXaWR0aCA8PCAxNlUpOw0KICBobHRkYy0+SW5zdGFuY2UtPlRXQ1IgfD0gKHRtcCB8IGhsdGRjLT5Jbml0LlRvdGFsSGVpZ2gpOw0KDQogIC8qIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSAqLw0KICB0bXAgPSAoKHVpbnQzMl90KShobHRkYy0+SW5pdC5CYWNrY29sb3IuR3JlZW4pIDw8IDhVKTsNCiAgdG1wMSA9ICgodWludDMyX3QpKGhsdGRjLT5Jbml0LkJhY2tjb2xvci5SZWQpIDw8IDE2VSk7DQogIGhsdGRjLT5JbnN0YW5jZS0+QkNDUiAmPSB+KExURENfQkNDUl9CQ0JMVUUgfCBMVERDX0JDQ1JfQkNHUkVFTiB8IExURENfQkNDUl9CQ1JFRCk7DQogIGhsdGRjLT5JbnN0YW5jZS0+QkNDUiB8PSAodG1wMSB8IHRtcCB8IGhsdGRjLT5Jbml0LkJhY2tjb2xvci5CbHVlKTsNCg0KICAvKiBFbmFibGUgdGhlIFRyYW5zZmVyIEVycm9yIGFuZCBGSUZPIHVuZGVycnVuIGludGVycnVwdHMgKi8NCiAgX19IQUxfTFREQ19FTkFCTEVfSVQoaGx0ZGMsIExURENfSVRfVEUgfCBMVERDX0lUX0ZVKTsNCg0KICAvKiBFbmFibGUgTFREQyBieSBzZXR0aW5nIExURENFTiBiaXQgKi8NCiAgX19IQUxfTFREQ19FTkFCTEUoaGx0ZGMpOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8NCiAgaGx0ZGMtPkVycm9yQ29kZSA9IEhBTF9MVERDX0VSUk9SX05PTkU7ICANCg0KICAvKiBJbml0aWFsaXplIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBMVERDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCg0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRGVJbml0KExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMpDQp7DQogIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovDQogIEhBTF9MVERDX01zcERlSW5pdChobHRkYyk7IA0KDQogIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8NCiAgaGx0ZGMtPkVycm9yQ29kZSA9IEhBTF9MVERDX0VSUk9SX05PTkU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFU0VUOw0KDQogIC8qIFJlbGVhc2UgTG9jayAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgTFREQyBNU1AuDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9MVERDX01zcEluaXQoTFREQ19IYW5kbGVUeXBlRGVmKiBobHRkYykNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaGx0ZGMpOw0KICANCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9MVERDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8gDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSB0aGUgTFREQyBNU1AuDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9MVERDX01zcERlSW5pdChMVERDX0hhbmRsZVR5cGVEZWYqIGhsdGRjKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChobHRkYyk7DQogIA0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX0xURENfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEB9DQogICovDQogIA0KLyoqIEBkZWZncm91cCBMVERDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyANCiAqICBAYnJpZWYgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICANCiAqDQpAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9uIGFsbG93aW5nIHRvOg0KICAgICAgKCspIEhhbmRsZSBMVERDIGludGVycnVwdCByZXF1ZXN0DQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQovKioNCiAgKiBAYnJpZWYgIEhhbmRsZSBMVERDIGludGVycnVwdCByZXF1ZXN0Lg0KICAqIEBwYXJhbSAgaGx0ZGMgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuICANCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnZvaWQgSEFMX0xURENfSVJRSGFuZGxlcihMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjKQ0Kew0KICB1aW50MzJfdCBpc3JmbGFncyAgPSBSRUFEX1JFRyhobHRkYy0+SW5zdGFuY2UtPklTUik7DQogIHVpbnQzMl90IGl0c291cmNlcyA9IFJFQURfUkVHKGhsdGRjLT5JbnN0YW5jZS0+SUVSKTsNCiAgDQogIC8qIFRyYW5zZmVyIEVycm9yIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgaWYoKChpc3JmbGFncyAmIExURENfSVNSX1RFUlJJRikgIT0gUkVTRVQpICYmICgoaXRzb3VyY2VzICYgTFREQ19JRVJfVEVSUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciBFcnJvciBpbnRlcnJ1cHQgKi8NCiAgICBfX0hBTF9MVERDX0RJU0FCTEVfSVQoaGx0ZGMsIExURENfSVRfVEUpOw0KDQogICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGVycm9yIGZsYWcgKi8NCiAgICBfX0hBTF9MVERDX0NMRUFSX0ZMQUcoaGx0ZGMsIExURENfRkxBR19URSk7DQoNCiAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KICAgIGhsdGRjLT5FcnJvckNvZGUgfD0gSEFMX0xURENfRVJST1JfVEU7DQoNCiAgICAvKiBDaGFuZ2UgTFREQyBzdGF0ZSAqLw0KICAgIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0VSUk9SOw0KDQogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICAgIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgICAvKiBUcmFuc2ZlciBlcnJvciBDYWxsYmFjayAqLw0KICAgIEhBTF9MVERDX0Vycm9yQ2FsbGJhY2soaGx0ZGMpOw0KICB9DQoNCiAgLyogRklGTyB1bmRlcnJ1biBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIGlmKCgoaXNyZmxhZ3MgJiBMVERDX0lTUl9GVUlGKSAhPSBSRVNFVCkgJiYgKChpdHNvdXJjZXMgJiBMVERDX0lFUl9GVUlFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBGSUZPIHVuZGVycnVuIGludGVycnVwdCAqLw0KICAgIF9fSEFMX0xURENfRElTQUJMRV9JVChobHRkYywgTFREQ19JVF9GVSk7DQoNCiAgICAvKiBDbGVhciB0aGUgRklGTyB1bmRlcnJ1biBmbGFnICovDQogICAgX19IQUxfTFREQ19DTEVBUl9GTEFHKGhsdGRjLCBMVERDX0ZMQUdfRlUpOw0KDQogICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgICBobHRkYy0+RXJyb3JDb2RlIHw9IEhBTF9MVERDX0VSUk9SX0ZVOw0KDQogICAgLyogQ2hhbmdlIExUREMgc3RhdGUgKi8NCiAgICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9FUlJPUjsNCg0KICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KICAgICAgDQogICAgLyogVHJhbnNmZXIgZXJyb3IgQ2FsbGJhY2sgKi8NCiAgICBIQUxfTFREQ19FcnJvckNhbGxiYWNrKGhsdGRjKTsNCiAgfQ0KDQogIC8qIExpbmUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICBpZigoKGlzcmZsYWdzICYgTFREQ19JU1JfTElGKSAhPSBSRVNFVCkgJiYgKChpdHNvdXJjZXMgJiBMVERDX0lFUl9MSUUpICE9IFJFU0VUKSkNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIExpbmUgaW50ZXJydXB0ICovDQogICAgX19IQUxfTFREQ19ESVNBQkxFX0lUKGhsdGRjLCBMVERDX0lUX0xJKTsNCg0KICAgIC8qIENsZWFyIHRoZSBMaW5lIGludGVycnVwdCBmbGFnICovICANCiAgICBfX0hBTF9MVERDX0NMRUFSX0ZMQUcoaGx0ZGMsIExURENfRkxBR19MSSk7DQoNCiAgICAvKiBDaGFuZ2UgTFREQyBzdGF0ZSAqLw0KICAgIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICAgIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgICAvKiBMaW5lIGludGVycnVwdCBDYWxsYmFjayAqLw0KICAgIEhBTF9MVERDX0xpbmVFdmVudENhbGxiYWNrKGhsdGRjKTsNCiAgfQ0KDQogIC8qIFJlZ2lzdGVyIHJlbG9hZCBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIGlmKCgoaXNyZmxhZ3MgJiBMVERDX0lTUl9SUklGKSAhPSBSRVNFVCkgJiYgKChpdHNvdXJjZXMgJiBMVERDX0lFUl9SUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSByZWdpc3RlciByZWxvYWQgaW50ZXJydXB0ICovDQogICAgX19IQUxfTFREQ19ESVNBQkxFX0lUKGhsdGRjLCBMVERDX0lUX1JSKTsNCiAgICAgIA0KICAgIC8qIENsZWFyIHRoZSByZWdpc3RlciByZWxvYWQgZmxhZyAqLw0KICAgIF9fSEFMX0xURENfQ0xFQVJfRkxBRyhobHRkYywgTFREQ19GTEFHX1JSKTsNCiAgICAgIA0KICAgIC8qIENoYW5nZSBMVERDIHN0YXRlICovDQogICAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQogICAgICANCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogICAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCiAgICAgIA0KICAgIC8qIFJlZ2lzdGVyIHJlbG9hZCBpbnRlcnJ1cHQgQ2FsbGJhY2sgKi8NCiAgICBIQUxfTFREQ19SZWxvYWRFdmVudENhbGxiYWNrKGhsdGRjKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVycm9yIExUREMgY2FsbGJhY2suDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9MVERDX0Vycm9yQ2FsbGJhY2soTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYykNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaGx0ZGMpOw0KICANCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9MVERDX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmICBMaW5lIEV2ZW50IGNhbGxiYWNrLg0KICAqIEBwYXJhbSAgaGx0ZGMgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfTFREQ19MaW5lRXZlbnRDYWxsYmFjayhMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChobHRkYyk7DQogIA0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX0xURENfTGluZUV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWxvYWQgRXZlbnQgY2FsbGJhY2suDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9MVERDX1JlbG9hZEV2ZW50Q2FsbGJhY2soTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYykNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaGx0ZGMpOw0KICANCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9MVERDX1JlbG9hZEV2ZW5DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIExURENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zDQogKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCiAgICAgICgrKSBDb25maWd1cmUgdGhlIExUREMgZm9yZWdyb3VuZCBvci9hbmQgYmFja2dyb3VuZCBwYXJhbWV0ZXJzLg0KICAgICAgKCspIFNldCB0aGUgYWN0aXZlIGxheWVyLg0KICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY29sb3Iga2V5aW5nLg0KICAgICAgKCspIENvbmZpZ3VyZSB0aGUgQy1MVVQuDQogICAgICAoKykgRW5hYmxlIC8gRGlzYWJsZSB0aGUgY29sb3Iga2V5aW5nLg0KICAgICAgKCspIEVuYWJsZSAvIERpc2FibGUgdGhlIEMtTFVULg0KICAgICAgKCspIFVwZGF0ZSB0aGUgbGF5ZXIgcG9zaXRpb24uDQogICAgICAoKykgVXBkYXRlIHRoZSBsYXllciBzaXplLg0KICAgICAgKCspIFVwZGF0ZSBwaXhlbCBmb3JtYXQgb24gdGhlIGZseS4gDQogICAgICAoKykgVXBkYXRlIHRyYW5zcGFyZW5jeSBvbiB0aGUgZmx5Lg0KICAgICAgKCspIFVwZGF0ZSBhZGRyZXNzIG9uIHRoZSBmbHkuDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMVERDIExheWVyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBMVERDX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIHBMYXllckNmZyAgcG9pbnRlciB0byBhIExURENfTGF5ZXJDZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTGF5ZXIuDQogICogQHBhcmFtICBMYXllcklkeCAgTFREQyBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19Db25maWdMYXllcihMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnLCB1aW50MzJfdCBMYXllcklkeCkNCnsgICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfSENPTkZJR1NUKHBMYXllckNmZy0+V2luZG93WDApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfSENPTkZJR1NQKHBMYXllckNmZy0+V2luZG93WDEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfVkNPTkZJR1NUKHBMYXllckNmZy0+V2luZG93WTApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfVkNPTkZJR1NQKHBMYXllckNmZy0+V2luZG93WTEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfUElYRUxfRk9STUFUKHBMYXllckNmZy0+UGl4ZWxGb3JtYXQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQUxQSEEocExheWVyQ2ZnLT5BbHBoYSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19BTFBIQShwTGF5ZXJDZmctPkFscGhhMCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19CTEVORElOR19GQUNUT1IxKHBMYXllckNmZy0+QmxlbmRpbmdGYWN0b3IxKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0JMRU5ESU5HX0ZBQ1RPUjIocExheWVyQ2ZnLT5CbGVuZGluZ0ZhY3RvcjIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTEwocExheWVyQ2ZnLT5JbWFnZVdpZHRoKSk7CQ0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19DRkJMTkJSKHBMYXllckNmZy0+SW1hZ2VIZWlnaHQpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCiAgDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBDb3B5IG5ldyBsYXllciBjb25maWd1cmF0aW9uIGludG8gaGFuZGxlIHN0cnVjdHVyZSAqLw0KICBobHRkYy0+TGF5ZXJDZmdbTGF5ZXJJZHhdID0gKnBMYXllckNmZzsgIA0KDQogIC8qIENvbmZpZ3VyZSB0aGUgTFREQyBMYXllciAqLyAgDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsNCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBjb2xvciBrZXlpbmcuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIFJHQlZhbHVlICB0aGUgY29sb3Iga2V5IHZhbHVlDQogICogQHBhcmFtICBMYXllcklkeCAgTFREQyBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgIExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfQ29uZmlnQ29sb3JLZXlpbmcoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgUkdCVmFsdWUsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgY29sb3IgdmFsdWVzICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0tDUiAmPSAgfihMVERDX0x4Q0tDUl9DS0JMVUUgfCBMVERDX0x4Q0tDUl9DS0dSRUVOIHwgTFREQ19MeENLQ1JfQ0tSRUQpOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNLQ1IgID0gUkdCVmFsdWU7DQoNCiAgLyogU2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkIHR5cGUgKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5TUkNSID0gTFREQ19TUkNSX0lNUjsNCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBMb2FkIHRoZSBjb2xvciBsb29rdXAgdGFibGUuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIHBDTFVUICAgICBwb2ludGVyIHRvIHRoZSBjb2xvciBsb29rdXAgdGFibGUgYWRkcmVzcy4NCiAgKiBAcGFyYW0gIENMVVRTaXplICB0aGUgY29sb3IgbG9va3VwIHRhYmxlIHNpemUuICANCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19Db25maWdDTFVUKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90ICpwQ0xVVCwgdWludDMyX3QgQ0xVVFNpemUsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICB1aW50MzJfdCB0bXAgPSAwVTsNCiAgdWludDMyX3QgY291bnRlciA9IDBVOw0KICB1aW50MzJfdCBwY291bnRlciA9IDBVOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOyAgDQoNCiAgZm9yKGNvdW50ZXIgPSAwVTsgKGNvdW50ZXIgPCBDTFVUU2l6ZSk7IGNvdW50ZXIrKykNCiAgew0KICAgIGlmKGhsdGRjLT5MYXllckNmZ1tMYXllcklkeF0uUGl4ZWxGb3JtYXQgPT0gTFREQ19QSVhFTF9GT1JNQVRfQUw0NCkNCiAgICB7DQogICAgICB0bXAgID0gKCgoY291bnRlciArIDE2VSpjb3VudGVyKSA8PCAyNFUpIHwgKCh1aW50MzJfdCkoKnBDTFVUKSAmIDB4RkZVKSB8ICgodWludDMyX3QpKCpwQ0xVVCkgJiAweEZGMDBVKSB8ICgodWludDMyX3QpKCpwQ0xVVCkgJiAweEZGMDAwMFUpKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsgDQogICAgICB0bXAgID0gKChjb3VudGVyIDw8IDI0VSkgfCAoKHVpbnQzMl90KSgqcENMVVQpICYgMHhGRlUpIHwgKCh1aW50MzJfdCkoKnBDTFVUKSAmIDB4RkYwMFUpIHwgKCh1aW50MzJfdCkoKnBDTFVUKSAmIDB4RkYwMDAwVSkpOw0KICAgIH0NCiAgICBwY291bnRlciA9ICh1aW50MzJfdClwQ0xVVCArIHNpemVvZigqcENMVVQpOw0KICAgIHBDTFVUID0gKHVpbnQzMl90ICopcGNvdW50ZXI7DQoNCiAgICAvKiBTcGVjaWZpZXMgdGhlIEMtTFVUIGFkZHJlc3MgYW5kIFJHQiB2YWx1ZSAqLw0KICAgIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0xVVFdSICA9IHRtcDsNCiAgfQ0KICANCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7IA0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsgIA0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlIHRoZSBjb2xvciBrZXlpbmcuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRW5hYmxlQ29sb3JLZXlpbmcoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGF5ZXJJZHgpDQp7ICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogRW5hYmxlIExUREMgY29sb3Iga2V5aW5nIGJ5IHNldHRpbmcgQ09MS0VOIGJpdCAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNSIHw9ICh1aW50MzJfdClMVERDX0x4Q1JfQ09MS0VOOw0KDQogIC8qIFNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCB0eXBlICovDQogIGhsdGRjLT5JbnN0YW5jZS0+U1JDUiA9IExURENfU1JDUl9JTVI7DQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7IA0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOyAgDQp9DQogIA0KLyoqDQogICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb2xvciBrZXlpbmcuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRGlzYWJsZUNvbG9yS2V5aW5nKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBEaXNhYmxlIExUREMgY29sb3Iga2V5aW5nIGJ5IHNldHRpbmcgQ09MS0VOIGJpdCAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNSICY9IH4odWludDMyX3QpTFREQ19MeENSX0NPTEtFTjsNCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOyANCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGUgdGhlIGNvbG9yIGxvb2t1cCB0YWJsZS4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19FbmFibGVDTFVUKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBFbmFibGUgTFREQyBjb2xvciBsb29rdXAgdGFibGUgYnkgc2V0dGluZyBDTFVURU4gYml0ICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q1IgfD0gKHVpbnQzMl90KUxURENfTHhDUl9DTFVURU47DQoNCiAgLyogU2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkIHR5cGUgKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5TUkNSID0gTFREQ19TUkNSX0lNUjsNCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsgDQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29sb3IgbG9va3VwIHRhYmxlLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBMYXllcklkeCAgTFREQyBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgIExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKSAgIA0KICAqIEByZXR2YWwgIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MVERDX0Rpc2FibGVDTFVUKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KIA0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogRGlzYWJsZSBMVERDIGNvbG9yIGxvb2t1cCB0YWJsZSBieSBzZXR0aW5nIENMVVRFTiBiaXQgKi8NCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DUiAmPSB+KHVpbnQzMl90KUxURENfTHhDUl9DTFVURU47DQoNCiAgLyogU2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkIHR5cGUgKi8NCiAgaGx0ZGMtPkluc3RhbmNlLT5TUkNSID0gTFREQ19TUkNSX0lNUjsNCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsgDQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlIERpdGhlci4NCiAgKiBAcGFyYW0gIGhsdGRjICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEByZXR2YWwgIEhBTCBzdGF0dXMNCiAgKi8NCg0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRW5hYmxlRGl0aGVyKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMpDQp7DQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBFbmFibGUgRGl0aGVyIGJ5IHNldHRpbmcgRFRFTiBiaXQgKi8NCiAgTFREQy0+R0NSIHw9ICh1aW50MzJfdClMVERDX0dDUl9ERU47DQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7IA0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERpc2FibGUgRGl0aGVyLg0KICAqIEBwYXJhbSAgaGx0ZGMgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19EaXNhYmxlRGl0aGVyKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMpDQp7DQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBEaXNhYmxlIERpdGhlciBieSBzZXR0aW5nIERURU4gYml0ICovDQogIExUREMtPkdDUiAmPSB+KHVpbnQzMl90KUxURENfR0NSX0RFTjsNCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXQgdGhlIExUREMgd2luZG93IHNpemUuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIFhTaXplICAgICBMVERDIFBpeGVsIHBlciBsaW5lDQogICogQHBhcmFtICBZU2l6ZSAgICAgTFREQyBMaW5lIG51bWJlcg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19TZXRXaW5kb3dTaXplKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IFhTaXplLCB1aW50MzJfdCBZU2l6ZSwgdWludDMyX3QgTGF5ZXJJZHgpIA0Kew0KICBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzIChMYXllcnMgcGFyYW1ldGVycykqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19DRkJMTChYU2l6ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19DRkJMTkJSKFlTaXplKSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOyANCg0KICAvKiBHZXQgbGF5ZXIgY29uZmlndXJhdGlvbiBmcm9tIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgcExheWVyQ2ZnID0gJmhsdGRjLT5MYXllckNmZ1tMYXllcklkeF07DQoNCiAgLyogdXBkYXRlIGhvcml6b250YWwgc3RvcCAqLw0KICBwTGF5ZXJDZmctPldpbmRvd1gxID0gWFNpemUgKyBwTGF5ZXJDZmctPldpbmRvd1gwOw0KDQogIC8qIHVwZGF0ZSB2ZXJ0aWNhbCBzdG9wICovICANCiAgcExheWVyQ2ZnLT5XaW5kb3dZMSA9IFlTaXplICsgcExheWVyQ2ZnLT5XaW5kb3dZMDsNCg0KICAvKiBSZWNvbmZpZ3VyZXMgdGhlIGNvbG9yIGZyYW1lIGJ1ZmZlciBwaXRjaCBpbiBieXRlICovDQogIHBMYXllckNmZy0+SW1hZ2VXaWR0aCA9IFhTaXplOw0KDQogIC8qIFJlY29uZmlndXJlcyB0aGUgZnJhbWUgYnVmZmVyIGxpbmUgbnVtYmVyICovDQogIHBMYXllckNmZy0+SW1hZ2VIZWlnaHQgPSBZU2l6ZTsNCg0KICAvKiBTZXQgTFREQyBwYXJhbWV0ZXJzICovDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsNCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldCB0aGUgTFREQyB3aW5kb3cgcG9zaXRpb24uDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIFgwICAgICAgICBMVERDIHdpbmRvdyBYIG9mZnNldA0KICAqIEBwYXJhbSAgWTAgICAgICAgIExUREMgd2luZG93IFkgb2Zmc2V0DQogICogQHBhcmFtICBMYXllcklkeCAgTFREQyBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgICAgICAgIExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKQ0KICAqIEByZXR2YWwgIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MVERDX1NldFdpbmRvd1Bvc2l0aW9uKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IFgwLCB1aW50MzJfdCBZMCwgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIExURENfTGF5ZXJDZmdUeXBlRGVmICpwTGF5ZXJDZmc7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19DRkJMTChYMCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19DRkJMTkJSKFkwKSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOw0KDQogIC8qIEdldCBsYXllciBjb25maWd1cmF0aW9uIGZyb20gaGFuZGxlIHN0cnVjdHVyZSAqLw0KICBwTGF5ZXJDZmcgPSAmaGx0ZGMtPkxheWVyQ2ZnW0xheWVySWR4XTsNCg0KICAvKiB1cGRhdGUgaG9yaXpvbnRhbCBzdGFydC9zdG9wICovDQogIHBMYXllckNmZy0+V2luZG93WDAgPSBYMDsNCiAgcExheWVyQ2ZnLT5XaW5kb3dYMSA9IFgwICsgcExheWVyQ2ZnLT5JbWFnZVdpZHRoOw0KDQogIC8qIHVwZGF0ZSB2ZXJ0aWNhbCBzdGFydC9zdG9wICovDQogIHBMYXllckNmZy0+V2luZG93WTAgPSBZMDsNCiAgcExheWVyQ2ZnLT5XaW5kb3dZMSA9IFkwICsgcExheWVyQ2ZnLT5JbWFnZUhlaWdodDsNCg0KICAvKiBTZXQgTFREQyBwYXJhbWV0ZXJzICovDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsNCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY29uZmlndXJlIHRoZSBwaXhlbCBmb3JtYXQuDQogICogQHBhcmFtICBobHRkYyAgICAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIFBpeGVsZm9ybWF0ICBuZXcgcGl4ZWwgZm9ybWF0IHZhbHVlLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggICAgIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkuDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0UGl4ZWxGb3JtYXQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgUGl4ZWxmb3JtYXQsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX1BJWEVMX0ZPUk1BVChQaXhlbGZvcm1hdCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBHZXQgbGF5ZXIgY29uZmlndXJhdGlvbiBmcm9tIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgcExheWVyQ2ZnID0gJmhsdGRjLT5MYXllckNmZ1tMYXllcklkeF07ICANCg0KICAvKiBSZWNvbmZpZ3VyZSB0aGUgcGl4ZWwgZm9ybWF0ICovDQogIHBMYXllckNmZy0+UGl4ZWxGb3JtYXQgPSBQaXhlbGZvcm1hdDsNCg0KICAvKiBTZXQgTFREQyBwYXJhbWV0ZXJzICovDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsgICANCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY29uZmlndXJlIHRoZSBsYXllciBhbHBoYSB2YWx1ZS4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgQWxwaGEgICAgIG5ldyBhbHBoYSB2YWx1ZS4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0QWxwaGEoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgQWxwaGEsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0FMUEhBKEFscGhhKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOw0KDQogIC8qIEdldCBsYXllciBjb25maWd1cmF0aW9uIGZyb20gaGFuZGxlIHN0cnVjdHVyZSAqLw0KICBwTGF5ZXJDZmcgPSAmaGx0ZGMtPkxheWVyQ2ZnW0xheWVySWR4XTsNCg0KICAvKiBSZWNvbmZpZ3VyZSB0aGUgQWxwaGEgdmFsdWUgKi8NCiAgcExheWVyQ2ZnLT5BbHBoYSA9IEFscGhhOw0KDQogIC8qIFNldCBMVERDIHBhcmFtZXRlcnMgKi8NCiAgTFREQ19TZXRDb25maWcoaGx0ZGMsIHBMYXllckNmZywgTGF5ZXJJZHgpOw0KDQogIC8qIFNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCB0eXBlICovDQogIGhsdGRjLT5JbnN0YW5jZS0+U1JDUiA9IExURENfU1JDUl9JTVI7DQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQovKioNCiAgKiBAYnJpZWYgIFJlY29uZmlndXJlIHRoZSBmcmFtZSBidWZmZXIgQWRkcmVzcy4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgQWRkcmVzcyAgIG5ldyBhZGRyZXNzIHZhbHVlLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkuDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0QWRkcmVzcyhMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgTFREQ19MYXllckNmZ1R5cGVEZWYgKnBMYXllckNmZzsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBHZXQgbGF5ZXIgY29uZmlndXJhdGlvbiBmcm9tIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgcExheWVyQ2ZnID0gJmhsdGRjLT5MYXllckNmZ1tMYXllcklkeF07DQoNCiAgLyogUmVjb25maWd1cmUgdGhlIEFkZHJlc3MgKi8NCiAgcExheWVyQ2ZnLT5GQlN0YXJ0QWRyZXNzID0gQWRkcmVzczsNCg0KICAvKiBTZXQgTFREQyBwYXJhbWV0ZXJzICovDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsNCg0KICAvKiBTZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgdHlwZSAqLw0KICBobHRkYy0+SW5zdGFuY2UtPlNSQ1IgPSBMVERDX1NSQ1JfSU1SOw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZ1bmN0aW9uIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHBpdGNoIGZvciBzcGVjaWZpYyBjYXNlcyB3aGVyZSB0aGUgYXR0YWNoZWQgTGF5ZXJJZHggYnVmZmVyIGhhdmUgYSB3aWR0aCB0aGF0IGlzDQogICogICAgICAgICBsYXJnZXIgdGhhbiB0aGUgb25lIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBvbiBzY3JlZW4uIEV4YW1wbGUgb2YgYSBidWZmZXIgODAweDQ4MCBhdHRhY2hlZCB0byBsYXllciBmb3Igd2hpY2ggd2UgDQogICogICAgICAgICB3YW50IHRvIHJlYWQgYW5kIGRpc3BsYXkgb24gc2NyZWVuIG9ubHkgYSBwb3J0aW9uIDMyMHgyNDAgdGFrZW4gaW4gdGhlIGNlbnRlciBvZiB0aGUgYnVmZmVyLiBUaGUgcGl0Y2ggaW4gcGl4ZWxzIA0KICAqICAgICAgICAgd2lsbCBiZSBpbiB0aGF0IGNhc2UgODAwIHBpeGVscyBhbmQgbm90IDMyMCBwaXhlbHMgYXMgaW5pdGlhbGx5IGNvbmZpZ3VyZWQgYnkgcHJldmlvdXMgY2FsbCB0byBIQUxfTFREQ19Db25maWdMYXllcigpLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIEhBTF9MVERDX0NvbmZpZ0xheWVyKCkgdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IHBpdGNoDQogICogICAgICAgICBjb25maWd1cmVkIGJ5IEhBTF9MVERDX0NvbmZpZ0xheWVyKCkgd2hlbiByZXF1aXJlZCAocmVmZXIgdG8gZXhhbXBsZSBkZXNjcmliZWQganVzdCBhYm92ZSkuDQogICogQHBhcmFtICBobHRkYyAgICAgICAgICAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExpbmVQaXRjaEluUGl4ZWxzICBOZXcgbGluZSBwaXRjaCBpbiBwaXhlbHMgdG8gY29uZmlndXJlIGZvciBMVERDIGxheWVyICdMYXllcklkeCcuDQogICogQHBhcmFtICBMYXllcklkeCAgICAgICAgICAgTFREQyBsYXllciBpbmRleCBjb25jZXJuZWQgYnkgdGhlIG1vZGlmaWNhdGlvbiBvZiBsaW5lIHBpdGNoLg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0UGl0Y2goTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGluZVBpdGNoSW5QaXhlbHMsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICB1aW50MzJfdCB0bXAgPSAwVTsNCiAgdWludDMyX3QgcGl0Y2hVcGRhdGUgPSAwVTsNCiAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSAwVTsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KICANCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQogIA0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQogIA0KICAvKiBnZXQgTGF5ZXJJZHggdXNlZCBwaXhlbCBmb3JtYXQgKi8NCiAgcGl4ZWxGb3JtYXQgPSBobHRkYy0+TGF5ZXJDZmdbTGF5ZXJJZHhdLlBpeGVsRm9ybWF0Ow0KICANCiAgaWYocGl4ZWxGb3JtYXQgPT0gTFREQ19QSVhFTF9GT1JNQVRfQVJHQjg4ODgpDQogIHsNCiAgICB0bXAgPSA0VTsNCiAgfQ0KICBlbHNlIGlmIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9SR0I4ODgpDQogIHsNCiAgICB0bXAgPSAzVTsNCiAgfQ0KICBlbHNlIGlmKChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9BUkdCNDQ0NCkgfHwgXA0KICAgICAgICAgIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9SR0I1NjUpICAgfHwgXA0KICAgICAgICAgIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9BUkdCMTU1NSkgfHwgXA0KICAgICAgICAgKHBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FMODgpKQ0KICB7DQogICAgdG1wID0gMlU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgdG1wID0gMVU7DQogIH0NCiAgDQogIHBpdGNoVXBkYXRlID0gKChMaW5lUGl0Y2hJblBpeGVscyAqIHRtcCkgPDwgMTZVKTsNCiAgDQogIC8qIENsZWFyIHByZXZpb3VzbHkgc2V0IHN0YW5kYXJkIHBpdGNoICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0ZCTFIgJj0gfkxURENfTHhDRkJMUl9DRkJQOw0KICANCiAgLyogU2V0IHRoZSBSZWxvYWQgdHlwZSBhcyBpbW1lZGlhdGUgdXBkYXRlIG9mIExUREMgcGl0Y2ggY29uZmlndXJlZCBhYm92ZSAqLw0KICBMVERDLT5TUkNSIHw9IExURENfU1JDUl9JTVI7DQogIA0KICAvKiBTZXQgbmV3IGxpbmUgcGl0Y2ggdmFsdWUgKi8NCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DRkJMUiB8PSBwaXRjaFVwZGF0ZTsNCiAgDQogIC8qIFNldCB0aGUgUmVsb2FkIHR5cGUgYXMgaW1tZWRpYXRlIHVwZGF0ZSBvZiBMVERDIHBpdGNoIGNvbmZpZ3VyZWQgYWJvdmUgKi8NCiAgTFREQy0+U1JDUiB8PSBMVERDX1NSQ1JfSU1SOw0KICANCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQogIA0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQogIA0KICByZXR1cm4gSEFMX09LOyAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGVmaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGluZSBpbnRlcnJ1cHQuDQogICogQHBhcmFtICBobHRkYyAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgTGluZSAgICBMaW5lIEludGVycnVwdCBQb3NpdGlvbi4NCiAgKiBAbm90ZSAgIFVzZXIgYXBwbGljYXRpb24gbWF5IHJlc29ydCB0byBIQUxfTFREQ19MaW5lRXZlbnRDYWxsYmFjaygpIGF0IGxpbmUgaW50ZXJydXB0IGdlbmVyYXRpb24uIA0KICAqIEByZXR2YWwgIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MVERDX1Byb2dyYW1MaW5lRXZlbnQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGluZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTElQT1MoTGluZSkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBEaXNhYmxlIHRoZSBMaW5lIGludGVycnVwdCAqLw0KICBfX0hBTF9MVERDX0RJU0FCTEVfSVQoaGx0ZGMsIExURENfSVRfTEkpOw0KDQogIC8qIFNldCB0aGUgTGluZSBJbnRlcnJ1cHQgcG9zaXRpb24gKi8NCiAgTFREQy0+TElQQ1IgPSAodWludDMyX3QpTGluZTsNCg0KICAvKiBFbmFibGUgdGhlIExpbmUgaW50ZXJydXB0ICovDQogIF9fSEFMX0xURENfRU5BQkxFX0lUKGhsdGRjLCBMVERDX0lUX0xJKTsNCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWxvYWQgTFREQyBMYXllcnMgY29uZmlndXJhdGlvbi4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBSZWxvYWRUeXBlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOg0KICAqICAgICAgICAgICAgICAgICAgICAgIExURENfUkVMT0FEX0lNTUVESUFURSA6IEltbWVkaWF0ZSBSZWxvYWQNCiAgKiAgICAgICAgICAgICAgICAgICAgICBMVERDX1JFTE9BRF9WRVJUSUNBTF9CTEFOS0lORyAgOiBSZWxvYWQgaW4gdGhlIG5leHQgVmVydGljYWwgQmxhbmtpbmcNCiAgKiBAbm90ZSAgIFVzZXIgYXBwbGljYXRpb24gbWF5IHJlc29ydCB0byBIQUxfTFREQ19SZWxvYWRFdmVudENhbGxiYWNrKCkgYXQgcmVsb2FkIGludGVycnVwdCBnZW5lcmF0aW9uLiANCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0xURENfUmVsb2FkKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IFJlbG9hZFR5cGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX1JFTE9BRChSZWxvYWRUeXBlKSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOyAgDQogIA0KICAvKiBFbmFibGUgdGhlIFJlbG9hZCBpbnRlcnJ1cHQgKi8gIA0KICBfX0hBTF9MVERDX0VOQUJMRV9JVChobHRkYywgTFREQ19JVF9SUik7DQogICAgICAgDQogIC8qIEFwcGx5IFJlbG9hZCB0eXBlICovDQogIGhsdGRjLT5JbnN0YW5jZS0+U1JDUiA9IFJlbG9hZFR5cGU7ICAgICAgICANCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCiAgDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCiAgDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMVERDIExheWVyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHdpdGhvdXQgcmVsb2FkaW5nDQogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBMVERDX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfQ29uZmlnTGF5ZXIgd2l0aG91dCBpbW1lZGlhdGUgcmVsb2FkLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIHBMYXllckNmZyAgcG9pbnRlciB0byBhIExURENfTGF5ZXJDZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTGF5ZXIuDQogICogQHBhcmFtICBMYXllcklkeCAgIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgIExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfQ29uZmlnTGF5ZXJfTm9SZWxvYWQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgTFREQ19MYXllckNmZ1R5cGVEZWYgKnBMYXllckNmZywgdWludDMyX3QgTGF5ZXJJZHgpDQp7ICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0hDT05GSUdTVChwTGF5ZXJDZmctPldpbmRvd1gwKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0hDT05GSUdTUChwTGF5ZXJDZmctPldpbmRvd1gxKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX1ZDT05GSUdTVChwTGF5ZXJDZmctPldpbmRvd1kwKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX1ZDT05GSUdTUChwTGF5ZXJDZmctPldpbmRvd1kxKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX1BJWEVMX0ZPUk1BVChwTGF5ZXJDZmctPlBpeGVsRm9ybWF0KSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0FMUEhBKHBMYXllckNmZy0+QWxwaGEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQUxQSEEocExheWVyQ2ZnLT5BbHBoYTApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQkxFTkRJTkdfRkFDVE9SMShwTGF5ZXJDZmctPkJsZW5kaW5nRmFjdG9yMSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19CTEVORElOR19GQUNUT1IyKHBMYXllckNmZy0+QmxlbmRpbmdGYWN0b3IyKSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0NGQkxMKHBMYXllckNmZy0+SW1hZ2VXaWR0aCkpOwkNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTE5CUihwTGF5ZXJDZmctPkltYWdlSGVpZ2h0KSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQogIA0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogQ29weSBuZXcgbGF5ZXIgY29uZmlndXJhdGlvbiBpbnRvIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgaGx0ZGMtPkxheWVyQ2ZnW0xheWVySWR4XSA9ICpwTGF5ZXJDZmc7ICANCg0KICAvKiBDb25maWd1cmUgdGhlIExUREMgTGF5ZXIgKi8gIA0KICBMVERDX1NldENvbmZpZyhobHRkYywgcExheWVyQ2ZnLCBMYXllcklkeCk7DQoNCiAgLyogRG8gbm90IHNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCAgKi8NCg0KICAvKiBJbml0aWFsaXplIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlICA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldCB0aGUgTFREQyB3aW5kb3cgc2l6ZSB3aXRob3V0IHJlbG9hZGluZy4NCiAgKiAgICAgICAgIFZhcmlhbnQgb2YgdGhlIGZ1bmN0aW9uIEhBTF9MVERDX1NldFdpbmRvd1NpemUgd2l0aG91dCBpbW1lZGlhdGUgcmVsb2FkLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBYU2l6ZSAgICAgTFREQyBQaXhlbCBwZXIgbGluZQ0KICAqIEBwYXJhbSAgWVNpemUgICAgIExUREMgTGluZSBudW1iZXINCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0V2luZG93U2l6ZV9Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBYU2l6ZSwgdWludDMyX3QgWVNpemUsIHVpbnQzMl90IExheWVySWR4KSANCnsNCiAgTFREQ19MYXllckNmZ1R5cGVEZWYgKnBMYXllckNmZzsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAoTGF5ZXJzIHBhcmFtZXRlcnMpKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTEwoWFNpemUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTE5CUihZU2l6ZSkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsgDQoNCiAgLyogR2V0IGxheWVyIGNvbmZpZ3VyYXRpb24gZnJvbSBoYW5kbGUgc3RydWN0dXJlICovDQogIHBMYXllckNmZyA9ICZobHRkYy0+TGF5ZXJDZmdbTGF5ZXJJZHhdOw0KDQogIC8qIHVwZGF0ZSBob3Jpem9udGFsIHN0b3AgKi8NCiAgcExheWVyQ2ZnLT5XaW5kb3dYMSA9IFhTaXplICsgcExheWVyQ2ZnLT5XaW5kb3dYMDsNCg0KICAvKiB1cGRhdGUgdmVydGljYWwgc3RvcCAqLyAgDQogIHBMYXllckNmZy0+V2luZG93WTEgPSBZU2l6ZSArIHBMYXllckNmZy0+V2luZG93WTA7DQoNCiAgLyogUmVjb25maWd1cmVzIHRoZSBjb2xvciBmcmFtZSBidWZmZXIgcGl0Y2ggaW4gYnl0ZSAqLw0KICBwTGF5ZXJDZmctPkltYWdlV2lkdGggPSBYU2l6ZTsNCg0KICAvKiBSZWNvbmZpZ3VyZXMgdGhlIGZyYW1lIGJ1ZmZlciBsaW5lIG51bWJlciAqLw0KICBwTGF5ZXJDZmctPkltYWdlSGVpZ2h0ID0gWVNpemU7DQoNCiAgLyogU2V0IExUREMgcGFyYW1ldGVycyAqLw0KICBMVERDX1NldENvbmZpZyhobHRkYywgcExheWVyQ2ZnLCBMYXllcklkeCk7DQoNCiAgLyogRG8gbm90IHNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCAgKi8NCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXQgdGhlIExUREMgd2luZG93IHBvc2l0aW9uIHdpdGhvdXQgcmVsb2FkaW5nLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfU2V0V2luZG93UG9zaXRpb24gd2l0aG91dCBpbW1lZGlhdGUgcmVsb2FkLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBYMCAgICAgICAgTFREQyB3aW5kb3cgWCBvZmZzZXQNCiAgKiBAcGFyYW0gIFkwICAgICAgICBMVERDIHdpbmRvdyBZIG9mZnNldA0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19TZXRXaW5kb3dQb3NpdGlvbl9Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBYMCwgdWludDMyX3QgWTAsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICBMVERDX0xheWVyQ2ZnVHlwZURlZiAqcExheWVyQ2ZnOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTEwoWDApKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQ0ZCTE5CUihZMCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBHZXQgbGF5ZXIgY29uZmlndXJhdGlvbiBmcm9tIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgcExheWVyQ2ZnID0gJmhsdGRjLT5MYXllckNmZ1tMYXllcklkeF07DQoNCiAgLyogdXBkYXRlIGhvcml6b250YWwgc3RhcnQvc3RvcCAqLw0KICBwTGF5ZXJDZmctPldpbmRvd1gwID0gWDA7DQogIHBMYXllckNmZy0+V2luZG93WDEgPSBYMCArIHBMYXllckNmZy0+SW1hZ2VXaWR0aDsNCg0KICAvKiB1cGRhdGUgdmVydGljYWwgc3RhcnQvc3RvcCAqLw0KICBwTGF5ZXJDZmctPldpbmRvd1kwID0gWTA7DQogIHBMYXllckNmZy0+V2luZG93WTEgPSBZMCArIHBMYXllckNmZy0+SW1hZ2VIZWlnaHQ7DQoNCiAgLyogU2V0IExUREMgcGFyYW1ldGVycyAqLw0KICBMVERDX1NldENvbmZpZyhobHRkYywgcExheWVyQ2ZnLCBMYXllcklkeCk7DQoNCiAgLyogRG8gbm90IHNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCAgKi8NCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWNvbmZpZ3VyZSB0aGUgcGl4ZWwgZm9ybWF0IHdpdGhvdXQgcmVsb2FkaW5nLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfU2V0UGl4ZWxGb3JtYXQgd2l0aG91dCBpbW1lZGlhdGUgcmVsb2FkLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZmVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgUGl4ZWxmb3JtYXQgIG5ldyBwaXhlbCBmb3JtYXQgdmFsdWUuDQogICogQHBhcmFtICBMYXllcklkeCAgICAgTFREQyBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgICAgIExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKS4NCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19TZXRQaXhlbEZvcm1hdF9Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBQaXhlbGZvcm1hdCwgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIExURENfTGF5ZXJDZmdUeXBlRGVmICpwTGF5ZXJDZmc7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfUElYRUxfRk9STUFUKFBpeGVsZm9ybWF0KSk7DQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOw0KDQogIC8qIEdldCBsYXllciBjb25maWd1cmF0aW9uIGZyb20gaGFuZGxlIHN0cnVjdHVyZSAqLw0KICBwTGF5ZXJDZmcgPSAmaGx0ZGMtPkxheWVyQ2ZnW0xheWVySWR4XTsgIA0KDQogIC8qIFJlY29uZmlndXJlIHRoZSBwaXhlbCBmb3JtYXQgKi8NCiAgcExheWVyQ2ZnLT5QaXhlbEZvcm1hdCA9IFBpeGVsZm9ybWF0Ow0KDQogIC8qIFNldCBMVERDIHBhcmFtZXRlcnMgKi8NCiAgTFREQ19TZXRDb25maWcoaGx0ZGMsIHBMYXllckNmZywgTGF5ZXJJZHgpOyAgIA0KDQogIC8qIERvIG5vdCBzZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgICovDQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVjb25maWd1cmUgdGhlIGxheWVyIGFscGhhIHZhbHVlIHdpdGhvdXQgcmVsb2FkaW5nLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfU2V0QWxwaGEgd2l0aG91dCBpbW1lZGlhdGUgcmVsb2FkLg0KICAqIEBwYXJhbSAgaGx0ZGMgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBBbHBoYSAgICAgbmV3IGFscGhhIHZhbHVlLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19TZXRBbHBoYV9Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBBbHBoYSwgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIExURENfTGF5ZXJDZmdUeXBlRGVmICpwTGF5ZXJDZmc7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfQUxQSEEoQWxwaGEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogR2V0IGxheWVyIGNvbmZpZ3VyYXRpb24gZnJvbSBoYW5kbGUgc3RydWN0dXJlICovDQogIHBMYXllckNmZyA9ICZobHRkYy0+TGF5ZXJDZmdbTGF5ZXJJZHhdOw0KDQogIC8qIFJlY29uZmlndXJlIHRoZSBBbHBoYSB2YWx1ZSAqLw0KICBwTGF5ZXJDZmctPkFscGhhID0gQWxwaGE7DQoNCiAgLyogU2V0IExUREMgcGFyYW1ldGVycyAqLw0KICBMVERDX1NldENvbmZpZyhobHRkYywgcExheWVyQ2ZnLCBMYXllcklkeCk7DQoNCiAgLyogRG8gbm90IHNldCB0aGUgSW1tZWRpYXRlIFJlbG9hZCAgKi8NCg0KICAvKiBDaGFuZ2UgdGhlIExUREMgc3RhdGUqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWNvbmZpZ3VyZSB0aGUgZnJhbWUgYnVmZmVyIEFkZHJlc3Mgd2l0aG91dCByZWxvYWRpbmcuDQogICogICAgICAgICBWYXJpYW50IG9mIHRoZSBmdW5jdGlvbiBIQUxfTFREQ19TZXRBZGRyZXNzIHdpdGhvdXQgaW1tZWRpYXRlIHJlbG9hZC4gICANCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgQWRkcmVzcyAgIG5ldyBhZGRyZXNzIHZhbHVlLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkuDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfU2V0QWRkcmVzc19Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgTFREQ19MYXllckNmZ1R5cGVEZWYgKnBMYXllckNmZzsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBHZXQgbGF5ZXIgY29uZmlndXJhdGlvbiBmcm9tIGhhbmRsZSBzdHJ1Y3R1cmUgKi8NCiAgcExheWVyQ2ZnID0gJmhsdGRjLT5MYXllckNmZ1tMYXllcklkeF07DQoNCiAgLyogUmVjb25maWd1cmUgdGhlIEFkZHJlc3MgKi8NCiAgcExheWVyQ2ZnLT5GQlN0YXJ0QWRyZXNzID0gQWRkcmVzczsNCg0KICAvKiBTZXQgTFREQyBwYXJhbWV0ZXJzICovDQogIExURENfU2V0Q29uZmlnKGhsdGRjLCBwTGF5ZXJDZmcsIExheWVySWR4KTsNCg0KICAvKiBEbyBub3Qgc2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkICAqLw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZ1bmN0aW9uIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHBpdGNoIGZvciBzcGVjaWZpYyBjYXNlcyB3aGVyZSB0aGUgYXR0YWNoZWQgTGF5ZXJJZHggYnVmZmVyIGhhdmUgYSB3aWR0aCB0aGF0IGlzDQogICogICAgICAgICBsYXJnZXIgdGhhbiB0aGUgb25lIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBvbiBzY3JlZW4uIEV4YW1wbGUgb2YgYSBidWZmZXIgODAweDQ4MCBhdHRhY2hlZCB0byBsYXllciBmb3Igd2hpY2ggd2UgDQogICogICAgICAgICB3YW50IHRvIHJlYWQgYW5kIGRpc3BsYXkgb24gc2NyZWVuIG9ubHkgYSBwb3J0aW9uIDMyMHgyNDAgdGFrZW4gaW4gdGhlIGNlbnRlciBvZiB0aGUgYnVmZmVyLiBUaGUgcGl0Y2ggaW4gcGl4ZWxzIA0KICAqICAgICAgICAgd2lsbCBiZSBpbiB0aGF0IGNhc2UgODAwIHBpeGVscyBhbmQgbm90IDMyMCBwaXhlbHMgYXMgaW5pdGlhbGx5IGNvbmZpZ3VyZWQgYnkgcHJldmlvdXMgY2FsbCB0byBIQUxfTFREQ19Db25maWdMYXllcigpLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIEhBTF9MVERDX0NvbmZpZ0xheWVyKCkgdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IHBpdGNoDQogICogICAgICAgICBjb25maWd1cmVkIGJ5IEhBTF9MVERDX0NvbmZpZ0xheWVyKCkgd2hlbiByZXF1aXJlZCAocmVmZXIgdG8gZXhhbXBsZSBkZXNjcmliZWQganVzdCBhYm92ZSkuDQogICogICAgICAgICBWYXJpYW50IG9mIHRoZSBmdW5jdGlvbiBIQUxfTFREQ19TZXRQaXRjaCB3aXRob3V0IGltbWVkaWF0ZSByZWxvYWQuICAgIA0KICAqIEBwYXJhbSAgaGx0ZGMgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBMVERDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIExUREMuDQogICogQHBhcmFtICBMaW5lUGl0Y2hJblBpeGVscyAgTmV3IGxpbmUgcGl0Y2ggaW4gcGl4ZWxzIHRvIGNvbmZpZ3VyZSBmb3IgTFREQyBsYXllciAnTGF5ZXJJZHgnLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggICAgICAgICAgIExUREMgbGF5ZXIgaW5kZXggY29uY2VybmVkIGJ5IHRoZSBtb2RpZmljYXRpb24gb2YgbGluZSBwaXRjaC4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MVERDX1NldFBpdGNoX05vUmVsb2FkKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IExpbmVQaXRjaEluUGl4ZWxzLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgdWludDMyX3QgdG1wID0gMFU7DQogIHVpbnQzMl90IHBpdGNoVXBkYXRlID0gMFU7DQogIHVpbnQzMl90IHBpeGVsRm9ybWF0ID0gMFU7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTFREQ19MQVlFUihMYXllcklkeCkpOw0KICANCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQogIA0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQogIA0KICAvKiBnZXQgTGF5ZXJJZHggdXNlZCBwaXhlbCBmb3JtYXQgKi8NCiAgcGl4ZWxGb3JtYXQgPSBobHRkYy0+TGF5ZXJDZmdbTGF5ZXJJZHhdLlBpeGVsRm9ybWF0Ow0KICANCiAgaWYocGl4ZWxGb3JtYXQgPT0gTFREQ19QSVhFTF9GT1JNQVRfQVJHQjg4ODgpDQogIHsNCiAgICB0bXAgPSA0VTsNCiAgfQ0KICBlbHNlIGlmIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9SR0I4ODgpDQogIHsNCiAgICB0bXAgPSAzVTsNCiAgfQ0KICBlbHNlIGlmKChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9BUkdCNDQ0NCkgfHwgXA0KICAgICAgICAgIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9SR0I1NjUpICAgfHwgXA0KICAgICAgICAgIChwaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9BUkdCMTU1NSkgfHwgXA0KICAgICAgICAgKHBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FMODgpKQ0KICB7DQogICAgdG1wID0gMlU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgdG1wID0gMVU7DQogIH0NCiAgDQogIHBpdGNoVXBkYXRlID0gKChMaW5lUGl0Y2hJblBpeGVscyAqIHRtcCkgPDwgMTZVKTsNCiAgDQogIC8qIENsZWFyIHByZXZpb3VzbHkgc2V0IHN0YW5kYXJkIHBpdGNoICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0ZCTFIgJj0gfkxURENfTHhDRkJMUl9DRkJQOw0KICANCiAgLyogU2V0IG5ldyBsaW5lIHBpdGNoIHZhbHVlICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0ZCTFIgfD0gcGl0Y2hVcGRhdGU7DQogIA0KICAvKiBEbyBub3Qgc2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkICAqLw0KICANCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQogIA0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQogIA0KICByZXR1cm4gSEFMX09LOyAgDQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmUgdGhlIGNvbG9yIGtleWluZyB3aXRob3V0IHJlbG9hZGluZy4NCiAgKiAgICAgICAgIFZhcmlhbnQgb2YgdGhlIGZ1bmN0aW9uIEhBTF9MVERDX0NvbmZpZ0NvbG9yS2V5aW5nIHdpdGhvdXQgaW1tZWRpYXRlIHJlbG9hZC4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgUkdCVmFsdWUgdGhlIGNvbG9yIGtleSB2YWx1ZQ0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MVERDX0NvbmZpZ0NvbG9yS2V5aW5nX05vUmVsb2FkKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMsIHVpbnQzMl90IFJHQlZhbHVlLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IGNvbG9yIHZhbHVlcyAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNLQ1IgJj0gIH4oTFREQ19MeENLQ1JfQ0tCTFVFIHwgTFREQ19MeENLQ1JfQ0tHUkVFTiB8IExURENfTHhDS0NSX0NLUkVEKTsNCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DS0NSICA9IFJHQlZhbHVlOw0KDQogIC8qIERvIG5vdCBzZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgICovDQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGx0ZGMpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlIHRoZSBjb2xvciBrZXlpbmcgd2l0aG91dCByZWxvYWRpbmcuDQogICogICAgICAgICBWYXJpYW50IG9mIHRoZSBmdW5jdGlvbiBIQUxfTFREQ19FbmFibGVDb2xvcktleWluZyB3aXRob3V0IGltbWVkaWF0ZSByZWxvYWQuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRW5hYmxlQ29sb3JLZXlpbmdfTm9SZWxvYWQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGF5ZXJJZHgpDQp7ICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogRW5hYmxlIExUREMgY29sb3Iga2V5aW5nIGJ5IHNldHRpbmcgQ09MS0VOIGJpdCAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNSIHw9ICh1aW50MzJfdClMVERDX0x4Q1JfQ09MS0VOOw0KDQogIC8qIERvIG5vdCBzZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgICovDQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7IA0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOyAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY29sb3Iga2V5aW5nIHdpdGhvdXQgcmVsb2FkaW5nLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfRGlzYWJsZUNvbG9yS2V5aW5nIHdpdGhvdXQgaW1tZWRpYXRlIHJlbG9hZC4NCiAgKiBAcGFyYW0gIGhsdGRjICAgICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEBwYXJhbSAgTGF5ZXJJZHggIExUREMgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICBMVERDX0xBWUVSXzEgKDApIG9yIExURENfTEFZRVJfMiAoMSkNCiAgKiBAcmV0dmFsICBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFREQ19EaXNhYmxlQ29sb3JLZXlpbmdfTm9SZWxvYWQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQoNCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhobHRkYyk7DQoNCiAgLyogQ2hhbmdlIExUREMgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBobHRkYy0+U3RhdGUgPSBIQUxfTFREQ19TVEFURV9CVVNZOw0KDQogIC8qIERpc2FibGUgTFREQyBjb2xvciBrZXlpbmcgYnkgc2V0dGluZyBDT0xLRU4gYml0ICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q1IgJj0gfih1aW50MzJfdClMVERDX0x4Q1JfQ09MS0VOOw0KDQogIC8qIERvIG5vdCBzZXQgdGhlIEltbWVkaWF0ZSBSZWxvYWQgICovDQoNCiAgLyogQ2hhbmdlIHRoZSBMVERDIHN0YXRlKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfUkVBRFk7IA0KDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhsdGRjKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY29sb3IgbG9va3VwIHRhYmxlIHdpdGhvdXQgcmVsb2FkaW5nLg0KICAqICAgICAgICAgVmFyaWFudCBvZiB0aGUgZnVuY3Rpb24gSEFMX0xURENfRW5hYmxlQ0xVVCB3aXRob3V0IGltbWVkaWF0ZSByZWxvYWQuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRW5hYmxlQ0xVVF9Ob1JlbG9hZChMVERDX0hhbmRsZVR5cGVEZWYgKmhsdGRjLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0xURENfTEFZRVIoTGF5ZXJJZHgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhsdGRjKTsNCg0KICAvKiBDaGFuZ2UgTFREQyBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX0JVU1k7DQoNCiAgLyogRGlzYWJsZSBMVERDIGNvbG9yIGxvb2t1cCB0YWJsZSBieSBzZXR0aW5nIENMVVRFTiBiaXQgKi8NCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DUiB8PSAodWludDMyX3QpTFREQ19MeENSX0NMVVRFTjsNCg0KICAvKiBEbyBub3Qgc2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkICAqLw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOyANCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNhYmxlIHRoZSBjb2xvciBsb29rdXAgdGFibGUgd2l0aG91dCByZWxvYWRpbmcuDQogICogICAgICAgICBWYXJpYW50IG9mIHRoZSBmdW5jdGlvbiBIQUxfTFREQ19EaXNhYmxlQ0xVVCB3aXRob3V0IGltbWVkaWF0ZSByZWxvYWQuDQogICogQHBhcmFtICBobHRkYyAgICAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgTFREQ19MQVlFUl8xICgwKSBvciBMVERDX0xBWUVSXzIgKDEpICAgDQogICogQHJldHZhbCAgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xURENfRGlzYWJsZUNMVVRfTm9SZWxvYWQoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19MVERDX0xBWUVSKExheWVySWR4KSk7DQogDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGx0ZGMpOw0KDQogIC8qIENoYW5nZSBMVERDIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGx0ZGMtPlN0YXRlID0gSEFMX0xURENfU1RBVEVfQlVTWTsNCg0KICAvKiBEaXNhYmxlIExUREMgY29sb3IgbG9va3VwIHRhYmxlIGJ5IHNldHRpbmcgQ0xVVEVOIGJpdCAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNSICY9IH4odWludDMyX3QpTFREQ19MeENSX0NMVVRFTjsNCg0KICAvKiBEbyBub3Qgc2V0IHRoZSBJbW1lZGlhdGUgUmVsb2FkICAqLw0KDQogIC8qIENoYW5nZSB0aGUgTFREQyBzdGF0ZSovDQogIGhsdGRjLT5TdGF0ZSA9IEhBTF9MVERDX1NUQVRFX1JFQURZOyANCg0KICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhobHRkYyk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBMVERDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucw0KICogIEBicmllZiAgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zIA0KICoNCkB2ZXJiYXRpbSAgIA0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICANCiAgICBbLi5dDQogICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bw0KICAgICAgKCspIENoZWNrIHRoZSBMVERDIGhhbmRsZSBzdGF0ZS4NCiAgICAgICgrKSBHZXQgdGhlIExUREMgaGFuZGxlIGVycm9yIGNvZGUuICANCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8gDQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJuIHRoZSBMVERDIGhhbmRsZSBzdGF0ZS4NCiAgKiBAcGFyYW0gIGhsdGRjICBwb2ludGVyIHRvIGEgTFREQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KICAqIEByZXR2YWwgSEFMIHN0YXRlDQogICovDQpIQUxfTFREQ19TdGF0ZVR5cGVEZWYgSEFMX0xURENfR2V0U3RhdGUoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYykNCnsNCiAgcmV0dXJuIGhsdGRjLT5TdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm4gdGhlIExUREMgaGFuZGxlIGVycm9yIGNvZGUuDQogICogQHBhcmFtICBobHRkYyAgcG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBMVERDLg0KKiBAcmV0dmFsIExUREMgRXJyb3IgQ29kZQ0KKi8NCnVpbnQzMl90IEhBTF9MVERDX0dldEVycm9yKExURENfSGFuZGxlVHlwZURlZiAqaGx0ZGMpDQp7DQogIHJldHVybiBobHRkYy0+RXJyb3JDb2RlOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIExURENfUHJpdmF0ZV9GdW5jdGlvbnMgTFREQyBQcml2YXRlIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMVERDIHBlcmlwaGVyYWwgDQogICogQHBhcmFtICBobHRkYyAgICAgUG9pbnRlciB0byBhIExURENfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgTFREQy4NCiAgKiBAcGFyYW0gIHBMYXllckNmZyBQb2ludGVyIExUREMgTGF5ZXIgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUNCiAgKiBAcGFyYW0gIExheWVySWR4ICBMVERDIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IExURENfTEFZRVJfMSAoMCkgb3IgTFREQ19MQVlFUl8yICgxKQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgTFREQ19TZXRDb25maWcoTFREQ19IYW5kbGVUeXBlRGVmICpobHRkYywgTFREQ19MYXllckNmZ1R5cGVEZWYgKnBMYXllckNmZywgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIHVpbnQzMl90IHRtcCA9IDBVOw0KICB1aW50MzJfdCB0bXAxID0gMFU7DQogIHVpbnQzMl90IHRtcDIgPSAwVTsNCg0KICAvKiBDb25maWd1cmUgdGhlIGhvcml6b250YWwgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb24gKi8NCiAgdG1wID0gKChwTGF5ZXJDZmctPldpbmRvd1gxICsgKChobHRkYy0+SW5zdGFuY2UtPkJQQ1IgJiBMVERDX0JQQ1JfQUhCUCkgPj4gMTZVKSkgPDwgMTZVKTsNCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5XSFBDUiAmPSB+KExURENfTHhXSFBDUl9XSFNUUE9TIHwgTFREQ19MeFdIUENSX1dIU1BQT1MpOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPldIUENSID0gKChwTGF5ZXJDZmctPldpbmRvd1gwICsgKChobHRkYy0+SW5zdGFuY2UtPkJQQ1IgJiBMVERDX0JQQ1JfQUhCUCkgPj4gMTZVKSArIDFVKSB8IHRtcCk7DQoNCiAgLyogQ29uZmlndXJlIHRoZSB2ZXJ0aWNhbCBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbiAqLw0KICB0bXAgPSAoKHBMYXllckNmZy0+V2luZG93WTEgKyAoaGx0ZGMtPkluc3RhbmNlLT5CUENSICYgTFREQ19CUENSX0FWQlApKSA8PCAxNlUpOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPldWUENSICY9IH4oTFREQ19MeFdWUENSX1dWU1RQT1MgfCBMVERDX0x4V1ZQQ1JfV1ZTUFBPUyk7DQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+V1ZQQ1IgID0gKChwTGF5ZXJDZmctPldpbmRvd1kwICsgKGhsdGRjLT5JbnN0YW5jZS0+QlBDUiAmIExURENfQlBDUl9BVkJQKSArIDFVKSB8IHRtcCk7ICANCg0KICAvKiBTcGVjaWZpZXMgdGhlIHBpeGVsIGZvcm1hdCAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPlBGQ1IgJj0gfihMVERDX0x4UEZDUl9QRik7DQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+UEZDUiA9IChwTGF5ZXJDZmctPlBpeGVsRm9ybWF0KTsNCg0KICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgY29sb3IgdmFsdWVzICovDQogIHRtcCA9ICgodWludDMyX3QpKHBMYXllckNmZy0+QmFja2NvbG9yLkdyZWVuKSA8PCA4VSk7DQogIHRtcDEgPSAoKHVpbnQzMl90KShwTGF5ZXJDZmctPkJhY2tjb2xvci5SZWQpIDw8IDE2VSk7DQogIHRtcDIgPSAocExheWVyQ2ZnLT5BbHBoYTAgPDwgMjRVKTsgIA0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkRDQ1IgJj0gfihMVERDX0x4RENDUl9EQ0JMVUUgfCBMVERDX0x4RENDUl9EQ0dSRUVOIHwgTFREQ19MeERDQ1JfRENSRUQgfCBMVERDX0x4RENDUl9EQ0FMUEhBKTsNCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5EQ0NSID0gKHBMYXllckNmZy0+QmFja2NvbG9yLkJsdWUgfCB0bXAgfCB0bXAxIHwgdG1wMik7IA0KDQogIC8qIFNwZWNpZmllcyB0aGUgY29uc3RhbnQgYWxwaGEgdmFsdWUgKi8NCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DQUNSICY9IH4oTFREQ19MeENBQ1JfQ09OU1RBKTsNCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DQUNSID0gKHBMYXllckNmZy0+QWxwaGEpOw0KDQogIC8qIFNwZWNpZmllcyB0aGUgYmxlbmRpbmcgZmFjdG9ycyAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkJGQ1IgJj0gfihMVERDX0x4QkZDUl9CRjIgfCBMVERDX0x4QkZDUl9CRjEpOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkJGQ1IgPSAocExheWVyQ2ZnLT5CbGVuZGluZ0ZhY3RvcjEgfCBwTGF5ZXJDZmctPkJsZW5kaW5nRmFjdG9yMik7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBjb2xvciBmcmFtZSBidWZmZXIgc3RhcnQgYWRkcmVzcyAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNGQkFSICY9IH4oTFREQ19MeENGQkFSX0NGQkFERCk7DQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0ZCQVIgPSAocExheWVyQ2ZnLT5GQlN0YXJ0QWRyZXNzKTsNCg0KICBpZihwTGF5ZXJDZmctPlBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FSR0I4ODg4KQ0KICB7DQogICAgdG1wID0gNFU7DQogIH0NCiAgZWxzZSBpZiAocExheWVyQ2ZnLT5QaXhlbEZvcm1hdCA9PSBMVERDX1BJWEVMX0ZPUk1BVF9SR0I4ODgpDQogIHsNCiAgICB0bXAgPSAzVTsNCiAgfQ0KICBlbHNlIGlmKChwTGF5ZXJDZmctPlBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FSR0I0NDQ0KSB8fCBcDQogICAgKHBMYXllckNmZy0+UGl4ZWxGb3JtYXQgPT0gTFREQ19QSVhFTF9GT1JNQVRfUkdCNTY1KSAgIHx8IFwNCiAgICAgIChwTGF5ZXJDZmctPlBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FSR0IxNTU1KSB8fCBcDQogICAgICAgIChwTGF5ZXJDZmctPlBpeGVsRm9ybWF0ID09IExURENfUElYRUxfRk9STUFUX0FMODgpKQ0KICB7DQogICAgdG1wID0gMlU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgdG1wID0gMVU7DQogIH0NCg0KICAvKiBDb25maWd1cmUgdGhlIGNvbG9yIGZyYW1lIGJ1ZmZlciBwaXRjaCBpbiBieXRlICovDQogIExURENfTEFZRVIoaGx0ZGMsIExheWVySWR4KS0+Q0ZCTFIgICY9IH4oTFREQ19MeENGQkxSX0NGQkxMIHwgTFREQ19MeENGQkxSX0NGQlApOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNGQkxSICA9ICgoKHBMYXllckNmZy0+SW1hZ2VXaWR0aCAqIHRtcCkgPDwgMTZVKSB8ICgoKHBMYXllckNmZy0+V2luZG93WDEgLSBwTGF5ZXJDZmctPldpbmRvd1gwKSAqIHRtcCkgICsgM1UpKTsNCg0KICAvKiBDb25maWd1cmUgdGhlIGZyYW1lIGJ1ZmZlciBsaW5lIG51bWJlciAqLw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNGQkxOUiAgJj0gfihMVERDX0x4Q0ZCTE5SX0NGQkxOQlIpOw0KICBMVERDX0xBWUVSKGhsdGRjLCBMYXllcklkeCktPkNGQkxOUiAgPSAocExheWVyQ2ZnLT5JbWFnZUhlaWdodCk7DQoNCiAgLyogRW5hYmxlIExURENfTGF5ZXIgYnkgc2V0dGluZyBMRU4gYml0ICovICANCiAgTFREQ19MQVlFUihobHRkYywgTGF5ZXJJZHgpLT5DUiB8PSAodWludDMyX3QpTFREQ19MeENSX0xFTjsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCiNlbmRpZiAvKiBTVE0zMkY0Mjl4eCB8fCBTVE0zMkY0Mzl4eCAgfHwgU1RNMzJGNDY5eHggfHwgU1RNMzJGNDc5eHggKi8NCiNlbmRpZiAvKiBIQUxfTFREQ19NT0RVTEVfRU5BQkxFRCAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K