LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydA0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChjKSAyMDExLCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCiANCi8qKiBcYWRkdG9ncm91cCBmdXNlX21vZHVsZSBXb3JraW5nIHdpdGggRlVTRQ0KICogVGhlIEZ1c2UgZHJpdmVyIHByb3ZpZGVzIHRoZSBJbnRlcmZhY2UgZm9yIGNvbmZpZ3VyYXRpb24gdGhlIEZVU0UgDQogKiBwZXJpcGhlcmFsLg0KICoNCiAqIEZvciBtb3JlIGFjY3VyYXRlIGluZm9ybWF0aW9uLCBwbGVhc2UgbG9vayBhdCB0aGUgRlVTRSBzZWN0aW9uIG9mIHRoZQ0KICogRGF0YXNoZWV0Lg0KICoNCiAqIFJlbGF0ZWQgZmlsZXMgOlxuDQogKiBccmVmIGZ1c2UuY1xuDQogKiBccmVmIGZ1c2UuaC5cbg0KKi8NCi8qQHsqLw0KLypAfSovDQoNCi8qKg0KICogXGZpbGUNCiAqDQogKiBJbXBsZW1lbnRhdGlvbiBvZiBGVVNFIGNvbnRyb2xsZXIuDQogKg0KICovDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBIZWFkZXJzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiY2hpcC5oIg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBFeHBvcnRlZCBmdW5jdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KIC8qKg0KICogXGJyaWVmIFJlYWQgZnVzZSB2bGF1ZSBieSBnaXZlbiB3b3JkIHBvc2l0aW9uLiANCiAqDQogKiBccGFyYW0gd29yZFBvc2l0aW9uICBzZWxlY3QgdGhlIDMyLWJpdCB3b3JkIDAgdG8gOS4NCiAqLw0KDQp1aW50MzJfdCBGVVNFX1JlYWQgKHVpbnQ4X3Qgd29yZFBvc2l0aW9uICkNCnsNCiAgICB1aW50MzJfdCBmdXNlOw0KICAgIC8qIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrLiAqLw0KICAgIFBNQy0+UE1DX1BDRVIxID0gKDEgPDwgKElEX0ZVU0UgLSAzMiApKTsNCiAgICAvKiBSZXF1ZXN0IHJlYWQgZnVzZSAqLw0KICAgIEZVU0UtPkZVU0VfQ1IgPSBGVVNFX0NSX1JSUSB8IEZVU0VfQ1JfS0VZX1ZBTElEOw0KICAgIC8qIFJTIGFuZCBXUyBiaXRzIG9mIHRoZSBGdXNlIEluZGV4IHJlZ2lzdGVyIChGVVNFX0lSKSBtdXN0IGJlIGF0IGxldmVsIG9uZQ0KICAgIGJlZm9yZSBpc3N1aW5nIHRoZSByZWFkIHJlcXVlc3QgKi8NCiAgICB3aGlsZSAoISgoRlVTRS0+RlVTRV9JUiAmIChGVVNFX0lSX1dTIHwgRlVTRV9JUl9SUykpID09IChGVVNFX0lSX1dTIHwgRlVTRV9JUl9SUykpKTsNCiAgICAvKiBSZWFkIGZ1c2UgdmFsdWVzLCBUaGUgZnVzZSBzdGF0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVhZCBvbiBDT1JFIHN0YXJ0dXAgYW5kIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgaW4gdGhlDQogICAgU1JfUkVHX05CIEZ1c2UgU3RhdHVzIChGVVNFX1NSeCkgcmVnaXN0ZXJzLiAqLw0KICAgIGZ1c2UgPSBGVVNFLT5GVVNFX1NSW3dvcmRQb3NpdGlvbl07DQogICAgLyogRGlzYWJsZSBwZXJpcGhlcmFsIGNsb2NrLiovDQogICAgUE1DLT5QTUNfUENEUjEgPSAoMSA8PCAoSURfRlVTRSAtMzIgKSk7DQogICAgcmV0dXJuIGZ1c2U7DQp9DQoNCi8qKg0KICogXGJyaWVmIFByb2dyYW0gZnVzZSB2bGF1ZSBieSBnaXZlbiB3b3JkIHBvc2l0aW9uLiANCiAqDQogKiBccGFyYW0gZGF0YSAgd29yZCB0byBiZSBwcm9ncmFtLg0KICogXHBhcmFtIHdvcmRQb3NpdGlvbiAgc2VsZWN0IHRoZSAzMi1iaXQgd29yZCAwIHRvIDkuDQogKi8NCg0Kdm9pZCBGVVNFX1dyaXRlICh1aW50MzJfdCBkYXRhLCB1aW50OF90IHdvcmRQb3NpdGlvbiApDQp7DQogICAgLyogRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2suICovDQogICAgUE1DLT5QTUNfUENFUjEgPSAoMSA8PCAoSURfRlVTRSAtIDMyICkpOw0KICAgIC8qIFNlbGVjdCB0aGUgd29yZCB0byB3cml0ZSwgdXNpbmcgdGhlIFNFTFcgZmllbGQgb2YgdGhlIEZ1c2VfSW5kZXggcmVnaXN0ZXIgKEZVU0VfSVIpLiAqLw0KICAgIEZVU0UtPkZVU0VfSVIgPSAoRlVTRV9JUl9XU0VMKHdvcmRQb3NpdGlvbikpOw0KICAgIC8qIFdyaXRlIHRoZSB3b3JkIHRvIHByb2dyYW0gaW4gdGhlIEZ1c2VfRGF0YSByZWdpc3RlciAoRlVTRV9EUikuKi8NCiAgICBGVVNFLT5GVVNFX0RSID0gZGF0YTsNCiAgICAvKiBDaGVjayB0aGF0IFJTIGFuZCBXUyBiaXRzIG9mIHRoZSBGdXNlX0luZGV4IHJlZ2lzdGVyIGFyZSBhdCBsZXZlbCBvbmUgKG5vIHJlYWQgYW5kDQogICAgbm8gd3JpdGUgcGVuZGluZykuICovDQogICAgd2hpbGUgKCEoKEZVU0UtPkZVU0VfSVIgJiAoRlVTRV9JUl9XUyB8IEZVU0VfSVJfUlMpKSA9PSAoRlVTRV9JUl9XUyB8IEZVU0VfSVJfUlMpKSk7DQogICAgLyogV3JpdGUgdGhlIFdSUSBiaXQgb2YgdGhlIEZ1c2VfQ29udHJvbCByZWdpc3RlciAoRlVTRV9DUikgdG8gYmVnaW4gdGhlIGZ1c2UgcHJvZ3JhbW1pbmcuICovDQogICAgRlVTRS0+RlVTRV9DUiA9IEZVU0VfQ1JfV1JRIHwgRlVTRV9DUl9LRVlfVkFMSUQ7DQogICAgLyogQ2hlY2sgdGhlIFdTIGJpdCBvZiBGVVNFX1NSeCwgd2hlbiBXUyBoYXMgYSB2YWx1ZSBvZiChsDGhsSB0aGUgZnVzZSB3cml0ZSBwcm9jZXNzDQogICAgaXMgb3Zlci4gKi8NCiAgICB3aGlsZSAoISgoRlVTRS0+RlVTRV9JUiAmIEZVU0VfSVJfV1MpID09IEZVU0VfSVJfV1MpKTsNCiAgICAvKiBEaXNhYmxlIHBlcmlwaGVyYWwgY2xvY2suICovDQogICAgUE1DLT5QTUNfUENEUjEgPSAoMSA8PCAoSURfRlVTRSAtIDMyICkpOw0KfQ0K