LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqIFxhZGR0b2dyb3VwIGFkY19tb2R1bGUgV29ya2luZyB3aXRoIEFEQw0KICogXGluZ3JvdXAgcGVyaXBoZXJhbHNfbW9kdWxlDQogKiBUaGUgQURDIGRyaXZlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSBhbmQgdXNlIHRoZSBBREMgcGVyaXBoZXJhbC4NCiAqIFxuDQogKg0KICogSXQgY29udmVydHMgdGhlIGFuYWxvZyBpbnB1dCB0byBkaWdpdGFsIGZvcm1hdC4gVGhlIGNvbnZlcnRlZCByZXN1bHQgY291bGQgYmUNCiAqIDEyYml0IG9yIDEwYml0LiBUaGUgQURDIHN1cHBvcnRzIHVwIHRvIDE2IGFuYWxvZyBsaW5lcy4NCiAqDQogKiBUbyBFbmFibGUgYSBBREMgY29udmVyc2lvbix0aGUgdXNlciBoYXMgdG8gZm9sbG93IHRoZXNlIGZldyBzdGVwczoNCiAqIDx1bD4NCiAqIDxsaT4gU2VsZWN0IGFuIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSB2b2x0YWdlIG9uIEFEVlJFRiAgIDwvbGk+DQogKiA8bGk+IENvbmZpZ3VyZSB0aGUgQURDIGFjY29yZGluZyB0byBpdHMgcmVxdWlyZW1lbnRzIGFuZCBzcGVjaWFsIG5lZWRzLHdoaWNoDQogKiBjb3VsZCBiZSAgYnJva2VuIGRvd24gaW50byBzZXZlcmFsIHBhcnRzOg0KICogLSMgICBTZWxlY3QgdGhlIHJlc29sdXRpb24gYnkgc2V0dGluZyBvciBjbGVhcmluZyBBRENfTVJfTE9XUkVTIGJpdCBpbg0KICogICAgICBBRENfTVIgKE1vZGUgUmVnaXN0ZXIpDQogKiAtIyAgIFNldCBBREMgY2xvY2sgYnkgc2V0dGluZyBBRENfTVJfUFJFU0NBTCBiaXRzIGluIEFEQ19NUiwgdGhlIGNsb2NrIGlzDQogKiAgICAgIGNhbGN1bGF0ZWQgd2l0aCBBRENDbG9jayA9IE1DSyAvICggKFBSRVNDQUwrMSkgKiAyICkNCiAqIC0jICAgU2V0IFN0YXJ0dXAgVGltZSxUcmFja2luZyBDbG9jayBjeWNsZXMgYW5kIFRyYW5zZmVyIENsb2NrIHJlc3BlY3RpdmVseQ0KICogICAgICBpbiBBRENfTVIuDQogPC9saT4NCiAqIDxsaT4gU3RhcnQgY29udmVyc2lvbiBieSBzZXR0aW5nIEFEQ19DUl9TVEFSVCBpbiBBRENfQ1IuIDwvbGk+DQogKiA8L3VsPg0KICoNCiAqIEZvciBtb3JlIGFjY3VyYXRlIGluZm9ybWF0aW9uLCBwbGVhc2UgbG9vayBhdCB0aGUgQURDIHNlY3Rpb24gb2YgdGhlDQogKiBEYXRhc2hlZXQuDQogKg0KICogUmVsYXRlZCBmaWxlcyA6XG4NCiAqIFxyZWYgYWRjLmNcbg0KICogXHJlZiBhZGMuaFxuDQogKi8NCi8qQHsqLw0KLypAfSovDQovKioNCiAqIFxmaWxlDQogKg0KICogSW1wbGVtZW50YXRpb24gb2YgQW5hbG9nLXRvLURpZ2l0YWwgQ29udmVydGVyIChBREMpLg0KICoNCiAqLw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgSGVhZGVycw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2luY2x1ZGUgImNoaXAuaCINCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgICBMb2NhbCB2YXJpYWJsZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKiBDdXJyZW50IHdvcmtpbmcgY2xvY2sgKi8NCnN0YXRpYyB1aW50MzJfdCBkd0FkY0Nsb2NrID0gMDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIFxicmllZiBJbml0aWFsaXplIHRoZSBBREMgY29udHJvbGxlcg0KICoNCiAqIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3SUQgQURDIEluZGV4DQogKi8NCmV4dGVybiB2b2lkIEFEQ19Jbml0aWFsaXplKCBBZGMqIHBBZGMsIHVpbnQzMl90IGR3SUQgKQ0Kew0KICAgIC8qIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrKi8NCiAgICBQTUNfRW5hYmxlUGVyaXBoZXJhbChkd0lEKTsNCg0KICAgIC8qICBSZXNldCB0aGUgY29udHJvbGxlciAqLw0KICAgIHBBZGMtPkFEQ19DUiA9IEFEQ19DUl9TV1JTVDsNCg0KICAgIC8qIFJlc2V0IE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwQWRjLT5BRENfTVIgPSAwOw0KDQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCBBREMgY2xvY2suDQogKg0KICogXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdQcmVzIHByZXNjYWwgdmFsdWUNCiAqIFxwYXJhbSBkd01jayBCb2FyZCBNQ0sgKEh6KQ0KICoNCiAqIFxyZXR1cm4gQURDIGNsb2NrDQogKi8NCg0KZXh0ZXJuIHVpbnQzMl90IEFEQ19TZXRDbG9jayggQWRjKiBwQWRjLCB1aW50MzJfdCBkd0NsaywgdWludDMyX3QgZHdNY2sgKQ0KeyANCiAgICB1aW50MzJfdCBkd1ByZXMsIGR3TXI7DQogICAgLyogRm9ybXVsYSBmb3IgUFJFU0NBTCBpczoNCiAgICAgICBQUkVTQ0FMID0gKE1DSyAvICgyICogQURDQ0xLKSkgKyAxDQogICAgICAgRmlyc3QsIHdlIGRvIHRoZSBkaXZpc2lvbiwgbXVsdGlwbGllZCBieSAxMCB0byBnZXQgaGlnaGVyIHByZWNpc2lvbg0KICAgICAgIElmIHRoZSBsYXN0IGRpZ2l0IGlzIG5vdCB6ZXJvLCB3ZSByb3VuZCB1cCB0byBhdm9pZCBnZW5lcmF0aW5nIGEgaGlnaGVyDQogICAgICAgdGhhbiByZXF1aXJlZCBmcmVxdWVuY3kuICovDQogICAgZHdQcmVzID0gKGR3TWNrICogNSkgLyBkd0NsazsNCiAgICBpZiAoZHdQcmVzICUgMTApIGR3UHJlcyA9IGR3UHJlcyAvIDEwOw0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGlmIChkd1ByZXMgPT0gMCkgcmV0dXJuIDA7DQogICAgICAgIGR3UHJlcyA9IGR3UHJlcyAvIDEwIC0gMTsNCiAgICB9DQoNCiAgICBkd01yID0gQURDX01SX1BSRVNDQUwoZHdQcmVzKTsNCiAgICBpZiAoZHdNciA9PSAwKSByZXR1cm4gMDsNCg0KICAgIGR3TXIgfD0gKHBBZGMtPkFEQ19NUiAmIH5BRENfTVJfUFJFU0NBTF9Nc2spOw0KICAgIHBBZGMtPkFEQ19NUiA9IGR3TXI7DQoNCiAgICBkd0FkY0Nsb2NrID0gZHdNY2sgLyAoZHdQcmVzICsgMSkgLyAyOw0KICAgIC8vZHdBZGNDbG9jayA9IGR3QWRjQ2xvY2sgLyAxMDAwICogMTAwMDsNCiAgICByZXR1cm4gZHdBZGNDbG9jazsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IEFEQyB0aW1pbmcuDQogKg0KICogXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdTdGFydHVwIHN0YXJ0dXAgdmFsdWUNCiAqIFxwYXJhbSBkd1RyYWNraW5nIHRyYWNraW5nIHZhbHVlDQogKiBccGFyYW0gZHdTZXR0bGluZyBzZXR0bGluZyB2YWx1ZQ0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0VGltaW5nKCBBZGMqIHBBZGMsIHVpbnQzMl90IGR3U3RhcnR1cCwgdWludDMyX3QgZHdUcmFja2luZywgdWludDMyX3QgZHdTZXR0bGluZyApDQp7DQogICAgdWludDMyX3QgZHdNcjsNCg0KICAgIGR3TXIgPSBwQWRjLT5BRENfTVI7DQogICAgZHdNciAmPSAofkFEQ19NUl9TVEFSVFVQX01zaykgJiAofkFEQ19NUl9UUkFDS1RJTV9Nc2spICYgKH5BRENfTVJfU0VUVExJTkdfTXNrKTsNCg0KICAgIC8qIEZvcm11bGE6DQogICAgICogICAgIFN0YXJ0dXAgIFRpbWUgPSBzdGFydHVwIHZhbHVlIC8gQURDQ2xvY2sNCiAgICAgKiAgICAgVHJhbnNmZXIgVGltZSA9IChUUkFOU0ZFUiAqIDIgKyAzKSAvIEFEQ0Nsb2NrDQogICAgICogICAgIFRyYWNraW5nIFRpbWUgPSAoVFJBQ0tUSU0gKyAxKSAvIEFEQ0Nsb2NrDQogICAgICogICAgIFNldHRsaW5nIFRpbWUgPSBzZXR0bGluZyB2YWx1ZSAvIEFEQ0Nsb2NrDQogICAgICovDQogICAgZHdNciB8PSBkd1N0YXJ0dXAgfCBkd1RyYWNraW5nIHwgZHdTZXR0bGluZzsNCiAgICBwQWRjLT5BRENfTVIgfD0gZHdNcjsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IEFEQyB0cmlnZ2VyLg0KICoNCiAqIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3VHJnU2VsIFRyaWdnZXIgc2VsZWN0aW9uDQogKi8NCmV4dGVybiB2b2lkIEFEQ19TZXRUcmlnZ2VyKCBBZGMqIHBBZGMsIHVpbnQzMl90IGR3VHJnU2VsICkNCnsNCiAgICB1aW50MzJfdCBkd01yOw0KDQogICAgZHdNciA9IHBBZGMtPkFEQ19NUjsNCiAgICBkd01yICY9IH5BRENfTVJfVFJHU0VMX01zazsNCiAgICBkd01yIHw9IGR3VHJnU2VsOw0KICAgIHBBZGMtPkFEQ19NUiB8PSBkd01yOw0KfQ0KDQovKioNCiAqIFNldHMgdGhlIHRyaWdnZXIgbW9kZSB0byBmb2xsb3dpbmc6DQogKiAtIFxyZWYgQURDX1RSR1JfVFJHTU9EX05PX1RSSUdHRVINCiAqIC0gXHJlZiBBRENfVFJHUl9UUkdNT0RfRVhfVFJJR19SSVNFDQogKiAtIFxyZWYgQURDX1RSR1JfVFJHTU9EX0VYX1RSSUdfRkFMTA0KICogLSBccmVmIEFEQ19UUkdSX1RSR01PRF9FWF9UUklHX0FOWQ0KICogLSBccmVmIEFEQ19UUkdSX1RSR01PRF9QRU5fVElSRw0KICogLSBccmVmIEFEQ19UUkdSX1RSR01PRF9QRVJJRF9UUklHDQogKiAtIFxyZWYgQURDX1RSR1JfVFJHTU9EX0NPTlRJTlVPVVMNCiAqIFxwYXJhbSBwQWRjICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdNb2RlIFRyaWdnZXIgbW9kZS4NCiAqLw0Kdm9pZCBBRENfU2V0VHJpZ2dlck1vZGUoQWRjICpwQWRjLCB1aW50MzJfdCBkd01vZGUpDQp7DQogICAgdWludDMyX3QgZHdUcmdyID0gcEFkYy0+QURDX1RSR1IgJiB+QURDX1RSR1JfVFJHTU9EX01zazsNCiAgICBwQWRjLT5BRENfVFJHUiA9IGR3VHJnciB8IGR3TW9kZTsNCn0NCg0KLyoqDQogKiBcYnJpZWYgRW5hYmxlL0Rpc2FibGUgbG93IHJlc29sdXRpb24uDQogKg0KICogXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gYkVuRGlzIEVuYWJsZS9EaXNhYmxlIGxvdyByZXNvbHV0aW9uLg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0TG93UmVzb2x1dGlvbiggQWRjKiBwQWRjLCB1aW50MzJfdCBiRW5EaXMgKQ0Kew0KICAgIGlmICggYkVuRGlzICkNCiAgICB7DQogICAgICAgIHBBZGMtPkFEQ19NUiB8PSBBRENfTVJfTE9XUkVTOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwQWRjLT5BRENfTVIgJj0gfkFEQ19NUl9MT1dSRVM7DQogICAgfQ0KfQ0KDQovKioNCiAqIFxicmllZiBFbmFibGUvRGlzYWJsZSBzbGVlcCBtb2RlLg0KICoNCiAqIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGJFbkRpcyBFbmFibGUvRGlzYWJsZSBzbGVlcCBtb2RlLg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0U2xlZXBNb2RlKCBBZGMgKnBBZGMsIHVpbnQ4X3QgYkVuRGlzICkNCnsNCiAgICBpZiAoIGJFbkRpcyApDQogICAgew0KICAgICAgICBwQWRjLT5BRENfTVIgfD0gIEFEQ19NUl9TTEVFUDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcEFkYy0+QURDX01SICY9IH5BRENfTVJfU0xFRVA7DQogICAgfQ0KfQ0KDQovKioNCiAqIFxicmllZiBFbmFibGUvRGlzYWJsZSBmYXN0IHdha2UgdXAuDQogKg0KICogXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gYkVuRGlzIEVuYWJsZS9EaXNhYmxlIGZhc3Qgd2FrZSB1cCBpbiBzbGVlcCBtb2RlLg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0RmFzdFdha2V1cCggQWRjICpwQWRjLCB1aW50OF90IGJFbkRpcyApDQp7DQogICAgaWYgKCBiRW5EaXMgKQ0KICAgIHsNCiAgICAgICAgcEFkYy0+QURDX01SIHw9ICBBRENfTVJfRldVUDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcEFkYy0+QURDX01SICY9IH5BRENfTVJfRldVUDsNCiAgICB9DQp9DQoNCi8qKg0KICogXGJyaWVmIEVuYWJsZS9EaXNhYmxlIHNlcW5lbmNlIG1vZGUuDQogKg0KICogXHBhcmFtIHBBZGMgIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGJFbkRpcyBFbmFibGUvRGlzYWJsZSBzZXFuZW5jZSBtb2RlLg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0U2VxdWVuY2VNb2RlKCBBZGMgKnBBZGMsIHVpbnQ4X3QgYkVuRGlzICkNCnsNCiAgICBpZiAoIGJFbkRpcyApDQogICAgew0KICAgICAgICAvKiBVc2VyIFNlcXVlbmNlIE1vZGU6IFRoZSBzZXF1ZW5jZSByZXNwZWN0cyB3aGF0IGlzIGRlZmluZWQgaW4NCiAgICAgICAgQURDX1NFUVIxIGFuZCBBRENfU0VRUjIgKi8NCiAgICAgICAgcEFkYy0+QURDX01SIHw9ICBBRENfTVJfVVNFUTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgLyogTm9ybWFsIE1vZGU6IFRoZSBjb250cm9sbGVyIGNvbnZlcnRzIGNoYW5uZWxzIGluIGEgc2ltcGxlIG51bWVyaWMgb3JkZXIuICovDQogICAgICAgIHBBZGMtPkFEQ19NUiAmPSB+QURDX01SX1VTRVE7DQogICAgfQ0KfQ0KDQovKioNCiAqIFxicmllZiBTZXQgY2hhbm5lbCBzZXF1ZW5jZS4NCiAqDQogKiBccGFyYW0gcEFkYyAgIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3U0VRMSBTZXF1ZW5jZSAxIH4gOCAgY2hhbm5lbCBudW1iZXIuDQogKiBccGFyYW0gZHdTRVEyIFNlcXVlbmNlIDkgfiAxNiBjaGFubmVsIG51bWJlci4NCiAqLw0KZXh0ZXJuIHZvaWQgQURDX1NldFNlcXVlbmNlKCBBZGMgKnBBZGMsIHVpbnQzMl90IGR3U0VRMSwgdWludDMyX3QgZHdTRVEyICkNCnsNCiAgICBwQWRjLT5BRENfU0VRUjEgPSBkd1NFUTE7DQogICAgcEFkYy0+QURDX1NFUVIyID0gZHdTRVEyOw0KfQ0KDQovKioNCiAqIFxicmllZiBTZXQgY2hhbm5lbCBzZXF1ZW5jZSBieSBnaXZlbiBjaGFubmVsIGxpc3QuDQogKg0KICogXHBhcmFtIHBBZGMgICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gdWNDaExpc3QgQ2hhbm5lbCBsaXN0Lg0KICogXHBhcmFtIHVjTnVtQ2ggIE51bWJlciBvZiBjaGFubmVscyBpbiBsaXN0Lg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0U2VxdWVuY2VCeUxpc3QoIEFkYyAqcEFkYywgdWludDhfdCB1Y0NoTGlzdFtdLCB1aW50OF90IHVjTnVtQ2ggKQ0Kew0KICAgIHVpbnQ4X3QgaTsNCiAgICB1aW50OF90IHVjU2hpZnQ7DQoNCiAgICBwQWRjLT5BRENfU0VRUjEgPSAwOw0KICAgIGZvciAoaSA9IDAsIHVjU2hpZnQgPSAwOyBpIDwgODsgaSArKywgdWNTaGlmdCArPSA0KQ0KICAgIHsNCiAgICAgICAgaWYgKGkgPj0gdWNOdW1DaCkgcmV0dXJuOw0KICAgICAgICBwQWRjLT5BRENfU0VRUjEgfD0gdWNDaExpc3RbaV0gPDwgdWNTaGlmdDsNCg0KICAgIH0NCiAgICBwQWRjLT5BRENfU0VRUjIgPSAwOw0KICAgIGZvciAodWNTaGlmdCA9IDA7IGkgPCAxNjsgaSArKywgdWNTaGlmdCArPSA0KQ0KICAgIHsNCiAgICAgICAgaWYgKGkgPj0gdWNOdW1DaCkgcmV0dXJuOw0KICAgICAgICBwQWRjLT5BRENfU0VRUjIgfD0gdWNDaExpc3RbaV0gPDwgdWNTaGlmdDsNCiAgICB9DQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCBhbmFsb2cgY2hhbmdlLg0KICogSUYgZW5hYmxlZCwgaXQgYWxsb3dzIGRpZmZlcmVudCBhbmFsb2cgc2V0dGluZ3MgZm9yIGVhY2ggY2hhbm5lbCwNCiAqIG90aGVyd2lzZSwgRElGRjAsIEdBSU4wIGFuZCBPRkYwIGFyZSB1c2VkIGZvciBhbGwgY2hhbm5lbHMuDQogKg0KICogXHBhcmFtIHBBZGMgICBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqIFxwYXJhbSBiRW5EaXMgRW5hYmxlL0Rpc2FibGUuDQogKi8NCmV4dGVybiB2b2lkIEFEQ19TZXRBbmFsb2dDaGFuZ2UoIEFkYyAqcEFkYywgdWludDhfdCBiRW5EaXMgKQ0Kew0KICAgIGlmICggYkVuRGlzICkNCiAgICB7DQogICAgICAgIHBBZGMtPkFEQ19NUiB8PSAgQURDX01SX0FOQUNIOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwQWRjLT5BRENfTVIgJj0gfkFEQ19NUl9BTkFDSDsNCiAgICB9DQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCAiVEFHIiBtb2RlLCBzaG93IGNoYW5uZWwgbnVtYmVyIGluIGxhc3QgZGF0YSBvciBub3QuDQogKg0KICogXHBhcmFtIHBBZGMgICBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqIFxwYXJhbSBiRW5EaXMgRW5hYmxlL0Rpc2FibGUgVEFHIHZhbHVlLg0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0VGFnRW5hYmxlKCBBZGMgKnBBZGMsIHVpbnQ4X3QgYkVuRGlzICkNCnsNCiAgICBpZiAoIGJFbkRpcyApDQogICAgew0KICAgICAgICBwQWRjLT5BRENfRU1SIHw9ICBBRENfRU1SX1RBRzsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcEFkYy0+QURDX0VNUiAmPSB+QURDX0VNUl9UQUc7DQogICAgfQ0KfQ0KDQovKioNCiAqIFxicmllZiBTZXQgY29tcGFyZSBjaGFubmVsLg0KICoNCiAqIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3Q2hhbm5lbCBjaGFubmVsIG51bWJlciB0byBiZSBzZXQsMTYgZm9yIGFsbCBjaGFubmVscw0KICovDQpleHRlcm4gdm9pZCBBRENfU2V0Q29tcGFyZUNoYW5uZWwoIEFkYyogcEFkYywgdWludDMyX3QgZHdDaGFubmVsICkNCnsNCiAgICBhc3NlcnQoIGR3Q2hhbm5lbCA8PSAxNiApIDsNCg0KICAgIGlmICggZHdDaGFubmVsIDwgMTYgKQ0KICAgIHsNCiAgICAgICAgcEFkYy0+QURDX0VNUiAmPSB+KEFEQ19FTVJfQ01QQUxMKTsNCiAgICAgICAgcEFkYy0+QURDX0VNUiAmPSB+KEFEQ19FTVJfQ01QU0VMX01zayk7DQogICAgICAgIHBBZGMtPkFEQ19FTVIgfD0gKGR3Q2hhbm5lbCA8PCBBRENfRU1SX0NNUFNFTF9Qb3MpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwQWRjLT5BRENfRU1SIHw9IEFEQ19FTVJfQ01QQUxMOw0KICAgIH0NCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IGNvbXBhcmUgbW9kZS4NCiAqDQogKiBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqIFxwYXJhbSBkd01vZGUgY29tcGFyZSBtb2RlDQogKi8NCmV4dGVybiB2b2lkIEFEQ19TZXRDb21wYXJlTW9kZSggQWRjKiBwQWRjLCB1aW50MzJfdCBkd01vZGUgKQ0Kew0KICAgIHBBZGMtPkFEQ19FTVIgJj0gfihBRENfRU1SX0NNUE1PREVfTXNrKTsNCiAgICBwQWRjLT5BRENfRU1SIHw9IChkd01vZGUgJiBBRENfRU1SX0NNUE1PREVfTXNrKTsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IGNvbXBhcnNpb24gd2luZG93Lg0KICoNCiAqIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3SGlfTG8gQ29tcGFyaXNvbiBXaW5kb3cNCiAqLw0KZXh0ZXJuIHZvaWQgQURDX1NldENvbXBhcmlzb25XaW5kb3coIEFkYyogcEFkYywgdWludDMyX3QgZHdIaV9MbyApDQp7DQogICAgcEFkYy0+QURDX0NXUiA9IGR3SGlfTG8gOw0KfQ0KDQovKioNCiAqIFxicmllZiBHZXQgc3RhcnR1cCB2YWx1ZS4NCiAqLw0Kc3RhdGljIHVpbnQzMl90IEdldFN0YXJ0dXBWYWx1ZSggdWludDMyX3QgZHdTdGFydHVwICkNCnsNCiAgICB1aW50MzJfdCBkd1N0YXJ0dXBWYWx1ZSA9IDA7DQoNCiAgICBpZiggZHdTdGFydHVwID09IDAgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDA7DQogICAgZWxzZSBpZiggZHdTdGFydHVwID09IDEgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDg7DQogICAgZWxzZSBpZiggZHdTdGFydHVwID09IDIgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDE2Ow0KICAgIGVsc2UgaWYoIGR3U3RhcnR1cCA9PSAzICkNCiAgICAgICAgZHdTdGFydHVwVmFsdWUgPSAyNDsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gNCApDQogICAgICAgIGR3U3RhcnR1cFZhbHVlID0gNjQ7DQogICAgZWxzZSBpZiggZHdTdGFydHVwID09IDUgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDgwOw0KICAgIGVsc2UgaWYoIGR3U3RhcnR1cCA9PSA2ICkNCiAgICAgICAgZHdTdGFydHVwVmFsdWUgPSA5NjsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gNyApDQogICAgICAgIGR3U3RhcnR1cFZhbHVlID0gMTEyOw0KICAgIGVsc2UgaWYoIGR3U3RhcnR1cCA9PSA4ICkNCiAgICAgICAgZHdTdGFydHVwVmFsdWUgPSA1MTI7DQogICAgZWxzZSBpZiggZHdTdGFydHVwID09IDkgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDU3NjsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTAgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDY0MDsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTEgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDcwNDsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTIgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDc2ODsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTMgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDgzMjsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTQgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDg5NjsNCiAgICBlbHNlIGlmKCBkd1N0YXJ0dXAgPT0gMTUgKQ0KICAgICAgICBkd1N0YXJ0dXBWYWx1ZSA9IDk2MDsNCg0KICAgIHJldHVybiBkd1N0YXJ0dXBWYWx1ZTsNCn0NCg0KLyoqDQogKiBcYnJpZWYgQ2hlY2sgaWYgQURDIGNvbmZpZ3VyYXRpb24gaXMgcmlnaHQuDQogKg0KICogXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdNY2sgQm9hcmQgTUNLIChIeikNCiAqDQogKiBccmV0dXJuIDAgaWYgY2hlY2sgb2ssIG90aGVycyBpZiBub3Qgb2suDQogKi8NCmV4dGVybiB1aW50OF90IEFEQ19DaGVja0NvbmZpZ3VyYXRpb24oIEFkYyogcEFkYywgdWludDMyX3QgZHdNY2sgKQ0Kew0KICAgIHVpbnQ4X3QgIGJPayA9IDA7DQogICAgdWludDMyX3QgZHdNcjsNCiAgICB1aW50MzJfdCBkd1ByZXM7DQogICAgdWludDMyX3QgZHdTdGFydHVwOw0KICAgIHVpbnQzMl90IGR3Q2xvY2s7DQogICAgdWludDMyX3QgZHdUZW1wOw0KDQogICAgZHdNciA9IHBBZGMtPkFEQ19NUjsNCg0KICAgIGR3UHJlcyA9IChkd01yICYgQURDX01SX1BSRVNDQUxfTXNrKSA+PiBBRENfTVJfUFJFU0NBTF9Qb3M7DQogICAgLyogRm9ybXVsYTogQURDQ2xvY2sgPSBNQ0sgLyAoIChQUkVTQ0FMKzEpICogMiApICovDQogICAgZHdDbG9jayA9IGR3TWNrIC8gKCAoZHdQcmVzICsgMSkgKiAyICk7DQogICAgaWYgKGR3Q2xvY2sgPiBBRENfQ0xPQ0tfTUFYKQ0KICAgIHsNCiAgICAgICAgcHJpbnRmKCJBREMgY2xvY2sgaXMgdG9vIGhpZ2ggKG91dCBvZiBzcGVjaWZpY2F0aW9uOiAlZCBIeilcclxuIiwgKGludClBRENfQ0xPQ0tfTUFYKTsNCiAgICAgICAgYk9rID0gMTsNCiAgICB9DQoNCiAgICBkd1N0YXJ0dXAgPSAoZHdNciAmIEFEQ19NUl9TVEFSVFVQX01zaykgPj4gQURDX01SX1NUQVJUVVBfUG9zOw0KICAgIGlmIChkd01yICYgQURDX01SX1NMRUVQX1NMRUVQKQ0KICAgIHsNCiAgICAgICAgaWYoIHBBZGMtPkFEQ19NUiAmIEFEQ19NUl9GV1VQX09OICkNCiAgICAgICAgew0KICAgICAgICAgICAgLyogRmFzdCBXYWtlIFVwIFNsZWVwIE1vZGU6IDEytXMgKi8NCiAgICAgICAgICAgIGR3VGVtcCA9IEFEQ19TVEFSVFVQX0ZBU1RfTUFYICogZHdDbG9jayAvIDEwMDAwMDA7DQogICAgICAgICAgICBpZiggZHdUZW1wID4gR2V0U3RhcnR1cFZhbHVlKGR3U3RhcnR1cCkgKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHByaW50ZigiU3RhcnR1cCB0aW1lIHRvbyBzbWFsbDogJWQsIHByb2dyYW1tZWQ6ICVkXHJcbiIsIChpbnQpZHdUZW1wLCAoaW50KShHZXRTdGFydHVwVmFsdWUoZHdTdGFydHVwKSkpOw0KICAgICAgICAgICAgICAgIGJPayA9IDE7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gYk9rOw0KfQ0KDQovKioNCiAqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgQ29udmVydGVkIERhdGENCiAqDQogKiBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqIFxwYXJhbSBkd0NoYW5uZWwgY2hhbm5lbCB0byBnZXQgY29udmVydGVkIHZhbHVlDQogKi8NCmV4dGVybiB1aW50MzJfdCBBRENfR2V0Q29udmVydGVkRGF0YSggQWRjKiBwQWRjLCB1aW50MzJfdCBkd0NoYW5uZWwgKQ0Kew0KICAgIHVpbnQzMl90IGR3RGF0YSA9IDA7DQoNCiAgICBhc3NlcnQoIGR3Q2hhbm5lbCA8IDE2ICkgOw0KDQogICAgZHdEYXRhID0gcEFkYy0+QURDX0NEUltkd0NoYW5uZWxdOw0KDQogICAgcmV0dXJuIGR3RGF0YSA7DQp9DQoNCg0KLyoqDQogKiBTZXRzIHRoZSBBREMgc3RhcnR1cCB0aW1lLg0KICogXHBhcmFtIHBBZGMgIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3VXMgIFN0YXJ0dXAgdGltZSBpbiB1Uy4NCiAqLw0Kdm9pZCBBRENfU2V0U3RhcnR1cFRpbWUoIEFkYyAqcEFkYywgdWludDMyX3QgZHdVcyApDQp7DQogICAgdWludDMyX3QgZHdTdGFydDsNCiAgICB1aW50MzJfdCBkd01yOw0KDQogICAgaWYgKGR3QWRjQ2xvY2sgPT0gMCkgcmV0dXJuOw0KICAgIC8qIEZvcm11bGEgZm9yIFNUQVJUVVAgaXM6DQogICAgICAgU1RBUlRVUCA9ICh0aW1lIHggQURDQ0xLKSAvICgxMDAwMDAwKSAtIDENCiAgICAgICBEaXZpc2lvbiBtdWx0aXBsaWVkIGJ5IDEwIGZvciBoaWdoZXIgcHJlY2lzaW9uICovDQogICAgDQogICAgZHdTdGFydCA9IChkd1VzICogZHdBZGNDbG9jaykgLyAoMTAwMDAwKTsNCiAgICBpZiAoZHdTdGFydCAlIDEwKSBkd1N0YXJ0IC89IDEwOw0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGR3U3RhcnQgLz0gMTA7DQogICAgICAgIGlmIChkd1N0YXJ0KSBkd1N0YXJ0IC0tOw0KICAgIH0NCiAgICBpZiAgICAgIChkd1N0YXJ0ID4gIDg5NikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDk2MDsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDgzMikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDg5NjsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDc2OCkgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDgzMjsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDcwNCkgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDc2ODsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDY0MCkgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDcwNDsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDU3NikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDY0MDsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDUxMikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDU3NjsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gIDExMikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDUxMjsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gICA5NikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDExMjsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gICA4MCkgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDk2Ow0KICAgIGVsc2UgaWYgKGR3U3RhcnQgPiAgIDY0KSBkd01yID0gQURDX01SX1NUQVJUVVBfU1VUODA7DQogICAgZWxzZSBpZiAoZHdTdGFydCA+ICAgMjQpIGR3TXIgPSBBRENfTVJfU1RBUlRVUF9TVVQ2NDsNCiAgICBlbHNlIGlmIChkd1N0YXJ0ID4gICAxNikgZHdNciA9IEFEQ19NUl9TVEFSVFVQX1NVVDI0Ow0KICAgIGVsc2UgaWYgKGR3U3RhcnQgPiAgICA4KSBkd01yID0gQURDX01SX1NUQVJUVVBfU1VUMTY7DQogICAgZWxzZSBpZiAoZHdTdGFydCA+ICAgIDApIGR3TXIgPSBBRENfTVJfU1RBUlRVUF9TVVQ4Ow0KICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICBkd01yID0gQURDX01SX1NUQVJUVVBfU1VUMDsNCg0KICAgIGR3TXIgfD0gcEFkYy0+QURDX01SICYgfkFEQ19NUl9TVEFSVFVQX01zazsNCiAgICBwQWRjLT5BRENfTVIgPSBkd01yOw0KfQ0KDQoNCi8qKg0KICogU2V0IEFEQyB0cmFja2luZyB0aW1lDQogKiBccGFyYW0gcEFkYyAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdOcyAgVHJhY2tpbmcgdGltZSBpbiBuUy4NCiAqLw0Kdm9pZCBBRENfU2V0VHJhY2tpbmdUaW1lKCBBZGMgKnBBZGMsIHVpbnQzMl90IGR3TnMgKQ0Kew0KICAgIHVpbnQzMl90IGR3U2h0aW07DQogICAgdWludDMyX3QgZHdNcjsNCg0KICAgIGlmIChkd0FkY0Nsb2NrID09IDApIHJldHVybjsNCiAgICAvKiBGb3JtdWxhIGZvciBTSFRJTSBpczoNCiAgICAgICBTSFRJTSA9ICh0aW1lIHggQURDQ0xLKSAvICgxMDAwMDAwMDAwKSAtIDENCiAgICAgICBTaW5jZSAxIGJpbGxpb24gaXMgY2xvc2UgdG8gdGhlIG1heGltdW0gdmFsdWUgZm9yIGFuIGludGVnZXIsIHdlIGZpcnN0DQogICAgICAgZGl2aWRlIEFEQ0NMSyBieSAxMDAwIHRvIGF2b2lkIGFuIG92ZXJmbG93ICovDQogICAgZHdTaHRpbSA9IChkd05zICogKGR3QWRjQ2xvY2sgLyAxMDAwKSkgLyAxMDAwMDA7DQogICAgaWYgKGR3U2h0aW0gJSAxMCkgZHdTaHRpbSAvPSAxMDsNCiAgICBlbHNlDQogICAgew0KICAgICAgICBkd1NodGltIC89IDEwOw0KICAgICAgICBpZiAoZHdTaHRpbSkgZHdTaHRpbSAtLTsNCiAgICB9DQogICAgZHdNciAgPSBBRENfTVJfVFJBQ0tUSU0oZHdTaHRpbSk7DQogICAgZHdNciB8PSBwQWRjLT5BRENfTVIgJiB+QURDX01SX1RSQUNLVElNX01zazsNCiAgICBwQWRjLT5BRENfTVIgPSBkd01yOw0KfQ0KDQoNCi8qKg0KICogU2V0cyB0aGUgdHJpZ2dlciBwZXJpb2QuDQogKiBccGFyYW0gcEFkYyAgIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3UGVyaW9kIFRyaWdnZXIgcGVyaW9kIGluIG5TLg0KICovDQp2b2lkIEFEQ19TZXRUcmlnZ2VyUGVyaW9kKEFkYyAqcEFkYywgdWludDMyX3QgZHdQZXJpb2QpDQp7DQogICAgdWludDMyX3QgZHdUcmdwZXI7DQogICAgdWludDMyX3QgZHdEaXYgPSAxMDAwMDAwMDA7DQogICAgdWludDMyX3QgZHdUcmdyOw0KICAgIGlmIChkd0FkY0Nsb2NrID09IDApIHJldHVybjsNCiAgICB3aGlsZSAoZHdQZXJpb2QgPj0gMTAgJiYgZHdEaXYgPj0gMTApDQogICAgew0KICAgICAgICBkd1BlcmlvZCAvPSAxMDsgZHdEaXYgLz0gMTA7DQogICAgfQ0KICAgIGR3VHJncGVyID0gKGR3UGVyaW9kICogZHdBZGNDbG9jaykgLyBkd0RpdjsNCiAgICBpZiAoZHdUcmdwZXIgJSAxMCkgZHdUcmdwZXIgLz0gMTA7DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgZHdUcmdwZXIgLz0gMTA7DQogICAgICAgIGlmIChkd1RyZ3BlcikgZHdUcmdwZXIgLS07DQogICAgfQ0KICAgIGR3VHJnciA9IEFEQ19UUkdSX1RSR1BFUihkd1RyZ3Blcik7DQogICAgZHdUcmdyIHw9IHBBZGMtPkFEQ19UUkdSICYgfkFEQ19UUkdSX1RSR1BFUl9Nc2s7DQogICAgcEFkYy0+QURDX1RSR1IgPSBkd1RyZ3I7DQp9DQoNCg0KLyoqDQogKiBTdGFydCBzY3JlZW4gY2FsaWJyYXRpb24gKFZERC9HTkQgbWVhc3VyZW1lbnQpDQogKiBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqLw0Kdm9pZCBBRENfVHNDYWxpYnJhdGlvbiggQWRjICpwQWRjICkNCnsNCiAgICBwQWRjLT5BRENfQ1IgPSBBRENfQ1JfVFNDQUxJQjsNCn0NCg0KLyoqDQogKiBTZXRzIHRoZSBvcGVyYXRpb24gbW9kZSBvZiB0aGUgdG91Y2ggc2NyZWVuIEFEQy4gVGhlIG1vZGUgY2FuIGJlOg0KICogLSBccmVmIEFEQ19UU01SX1RTTU9ERV9OT05FIChUU0FEQyBvZmYpDQogKiAtIFxyZWYgQURDX1RTTVJfVFNNT0RFXzRfV0lSRV9OT19QTQ0KICogLSBccmVmIEFEQ19UU01SX1RTTU9ERV80X1dJUkUgKENIIDB+MyB1c2VkKQ0KICogLSBccmVmIEFEQ19UU01SX1RTTU9ERV81X1dJUkUgKENIIDB+NCB1c2VkKQ0KICogXHBhcmFtIHBBREMgICBQb2ludGVyIHRvIGFuIEFkYyBpbnN0YW5jZS4NCiAqIFxwYXJhbSBkd01vZGUgRGVzaXJlZCBtb2RlDQogKi8NCnZvaWQgQURDX1NldFRzTW9kZShBZGMqIHBBREMsIHVpbnQzMl90IGR3TW9kZSkNCnsNCiAgICBwQURDLT5BRENfVFNNUiA9IChwQURDLT5BRENfVFNNUiAmIH5BRENfVFNNUl9UU01PREVfTXNrKSB8IGR3TW9kZTsNCn0NCg0KLyoqDQogKiBTZXRzIHRoZSB0b3VjaHNjcmVlbiBwYW4gZGVib3VuY2UgdGltZS4NCiAqIFxwYXJhbSBwQURDICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gZHdUaW1lIERlYm91bmNlIHRpbWUgaW4gblMuDQogKi8NCnZvaWQgQURDX1NldFRzRGVib3VuY2UoQWRjICpwQURDLCB1aW50MzJfdCBkd1RpbWUpDQp7DQogICAgdWludDMyX3QgZHdEaXYgPSAxMDAwMDAwMDAwOw0KICAgIHVpbnQzMl90IGR3Q2xrID0gZHdBZGNDbG9jazsNCiAgICB1aW50MzJfdCBkd1BlbmJjID0gMDsNCiAgICB1aW50MzJfdCBkd1RhcmdldCwgZHdDdXJyZW50Ow0KICAgIHVpbnQzMl90IGR3VHNtcjsNCiAgICBpZiAoZHdUaW1lID09IDAgfHwgZHdBZGNDbG9jayA9PSAwKSByZXR1cm47DQogICAgLyogRGl2aWRlIHRpbWUgJiBBRENDTEsgdG8gYXZvaWQgb3ZlcmZsb3dzICovDQogICAgd2hpbGUgKChkd0RpdiA+IDEpICYmICgoZHdUaW1lICUgMTApID09IDApKQ0KICAgIHsNCiAgICAgICAgZHdUaW1lIC89IDEwOyBkd0RpdiAvPSAxMDsNCiAgICB9DQogICAgd2hpbGUgKChkd0RpdiA+IDEpICYmICgoZHdDbGsgJiAxMCkgPT0gMCkpDQogICAgew0KICAgICAgICBkd0NsayAvPSAxMDsgZHdEaXYgLz0gMTA7DQogICAgfQ0KICAgIC8qIENvbXB1dGUgUEVOREJDICovDQogICAgZHdUYXJnZXQgPSBkd1RpbWUgKiBkd0NsayAvIGR3RGl2Ow0KICAgIGR3Q3VycmVudCA9IDE7DQogICAgd2hpbGUgKGR3Q3VycmVudCA8IGR3VGFyZ2V0KQ0KICAgIHsNCiAgICAgICAgZHdQZW5iYyArKzsgZHdDdXJyZW50ICo9IDI7DQogICAgfQ0KICAgIGR3VHNtciA9IEFEQ19UU01SX1BFTkRCQyhkd1BlbmJjKTsNCiAgICBpZiAoZHdUc21yID09IDApIHJldHVybjsNCiAgICBkd1RzbXIgfD0gcEFEQy0+QURDX1RTTVIgJiB+QURDX1RTTVJfUEVOREJDX01zazsNCiAgICBwQURDLT5BRENfVFNNUiA9IGR3VHNtcjsNCn0NCg0KLyoqDQogKiBFbmFibGUvRGlzYWJsZSB0b3VjaCBzY3JlZW4gcGVuIGRldGVjdGlvbi4NCiAqIFxwYXJhbSBwQURDICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKiBccGFyYW0gYkVuRGlzIElmIHRydWUsIHBlbiBkZXRlY3Rpb24gaXMgZW5hYmxlZDsNCiAqICAgICAgICAgICAgICAgaW4gbm9ybWFsIG1vZGUgb3RoZXJ3aXNlLg0KICovDQp2b2lkIEFEQ19TZXRUc1BlbkRldGVjdChBZGMqIHBBREMsIHVpbnQ4X3QgYkVuRGlzKQ0Kew0KICAgIGlmIChiRW5EaXMpDQogICAgICAgIHBBREMtPkFEQ19UU01SIHw9ICBBRENfVFNNUl9QRU5ERVQ7DQogICAgZWxzZQ0KICAgICAgICBwQURDLT5BRENfVFNNUiAmPSB+QURDX1RTTVJfUEVOREVUOw0KfQ0KDQoNCi8qKg0KICogU2V0cyB0aGUgYXZlcmFnZSBvZiB0aGUgdG91Y2ggc2NyZWVuIEFEQy4gVGhlIG1vZGUgY2FuIGJlOg0KICogLSBccmVmIEFEQ19UU01SX1RTQVZfTk9fRklMVEVSIChObyBmaWx0ZXJpbmcpDQogKiAtIFxyZWYgQURDX1RTTVJfVFNBVl9BVkcyQ09OViAoQXZlcmFnZSAyIGNvbnZlcnNpb25zKQ0KICogLSBccmVmIEFEQ19UU01SX1RTQVZfQVZHNENPTlYgKEF2ZXJhZ2UgNCBjb252ZXJzaW9ucykNCiAqIC0gXHJlZiBBRENfVFNNUl9UU0FWX0FWRzhDT05WIChBdmVyYWdlIDggY29udmVyc2lvbnMpDQogKiBccGFyYW0gcEFEQyAgIFBvaW50ZXIgdG8gYW4gQWRjIGluc3RhbmNlLg0KICogXHBhcmFtIGR3TW9kZSBEZXNpcmVkIG1vZGUNCiAqLw0Kdm9pZCBBRENfU2V0VHNBdmVyYWdlKEFkYyogcEFEQywgdWludDMyX3QgZHdBdmcyQ29udikNCnsNCiAgICB1aW50MzJfdCBkd01yID0gcEFEQy0+QURDX1RTTVIgJiB+QURDX1RTTVJfVFNBVl9Nc2s7DQogICAgdWludDMyX3QgZHdUU0FWID0gZHdBdmcyQ29udiA+PiBBRENfVFNNUl9UU0FWX1BvczsNCiAgICB1aW50MzJfdCBkd1RTRlJFUSA9IChkd01yICYgQURDX1RTTVJfVFNGUkVRX01zaykgPj4gQURDX1RTTVJfVFNGUkVRX1BvczsNCiAgICBpZiAoZHdUU0FWKQ0KICAgIHsNCiAgICAgICAgaWYgKGR3VFNBViA+IGR3VFNGUkVRKQ0KICAgICAgICB7DQogICAgICAgICAgICBkd01yICY9IH5BRENfVFNNUl9UU0ZSRVFfTXNrOw0KICAgICAgICAgICAgZHdNciB8PSAgQURDX1RTTVJfVFNGUkVRKGR3VFNBVik7DQogICAgICAgIH0NCiAgICB9DQogICAgcEFEQy0+QURDX1RTTVIgPSBkd01yIHwgZHdBdmcyQ29udjsNCn0NCg0KLyoqDQogKiBSZXR1cm4gWCBtZWFzdXJlbWVudCBwb3NpdGlvbiB2YWx1ZS4NCiAqIFxwYXJhbSBwQURDICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKi8NCnVpbnQzMl90IEFEQ19HZXRUc1hQb3NpdGlvbihBZGMgKnBBREMpDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19YUE9TUjsNCn0NCg0KLyoqDQogKiBSZXR1cm4gWSBtZWFzdXJlbWVudCBwb3NpdGlvbiB2YWx1ZS4NCiAqIFxwYXJhbSBwQURDICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKi8NCnVpbnQzMl90IEFEQ19HZXRUc1lQb3NpdGlvbihBZGMgKnBBREMpDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19ZUE9TUjsNCn0NCg0KLyoqDQogKiBSZXR1cm4gWiBtZWFzdXJlbWVudCBwb3NpdGlvbiB2YWx1ZS4NCiAqIFxwYXJhbSBwQURDICAgUG9pbnRlciB0byBhbiBBZGMgaW5zdGFuY2UuDQogKi8NCnVpbnQzMl90IEFEQ19HZXRUc1ByZXNzdXJlKEFkYyAqcEFEQykNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX1BSRVNTUjsNCn0NCg==