LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKLyoKICogJEZpbGU6IC8vZGVwb3Qvc29mdHdhcmUvcHJvamVjdHMvZmVhdHVyZV9icmFuY2hlcy9nZW41X3BoYXNlMS9vcy9saW51eC9jbGFzc2ljL2FwL2FwcHMvc3NtL2F1dGg4MDIxeC9hbmk4MDIxeEZzbS5oICQKICogQ29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIEF1dGggQWdlbnQncyBGU00ncyB0byB3b3JrLgogKgogKiBBdXRob3I6ICAgICAgTWF5YW5rIEQuIFVwYWRoeWF5CiAqIERhdGU6ICAgICAgICAyMS1KdW5lLTIwMDIKICogSGlzdG9yeTotCiAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKi8KI2lmbmRlZiBfX0FBR19GU01fSF8KI2RlZmluZSBfX0FBR19GU01fSF8KCiNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKI2luY2x1ZGUgInZvc190cmFjZS5oIgojaW5jbHVkZSAidm9zX3RpbWVyLmgiCiNpbmNsdWRlIDxiYXBSc25Tc21SZXBsYXlDdHIuaD4KI2luY2x1ZGUgPGJhcFJzbkFzZlBhY2tldC5oPgojaW5jbHVkZSA8YmFwUnNuU3NtRWFwb2wuaD4KI2luY2x1ZGUgImJhcFJzbjgwMjF4UHJmLmgiCi8vI2luY2x1ZGUgImJhcEludGVybmFsLmgiCiNpbmNsdWRlICJjc3JBcGkuaCIKCnR5cGVkZWYgc3RydWN0IHNCdGFtcENvbnRleHQgdEJ0YW1wQ29udGV4dDsKdHlwZWRlZiBzdHJ1Y3QgdFN0YUNvbnRleHQgdFN0YUNvbnRleHQ7CnR5cGVkZWYgc3RydWN0IHRTdXBwQ29udGV4dCB0U3VwcENvbnRleHQ7CgojZGVmaW5lIFJTTl9NQVhfUEFDS0VUX1NJWkUgNTEyCiNkZWZpbmUgUlNOXzgwMjExX0tFWV9MRU4gICAgMTYKI2RlZmluZSBSU05fSUVfTUFYX1BBQ0tFVF9TSVpFIDI1NgojZGVmaW5lIFJTTl9JRV9IRUFERVJfU0laRSAwCiNkZWZpbmUgQUNDVEdfU0VTU0lPTl9JRF9TSVpFIDgKI2RlZmluZSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFIDggLy8gQnl0ZXMKCiNkZWZpbmUgIEJBUF9TRVRfUlNOX0tFWSAgIDEKI2RlZmluZSAgQkFQX1JFU0VUX1JTTl9LRVkgIDAgCgoKI2RlZmluZSBBQUdfQUNMX0xPT0tVUF9ORUVERUQoY3R4KSBcCiAgICAgICAgICAgICgoY3R4KS0+YXV0aFR5cGUgPT0gZUFOSV9TU01fQVRfTk9ORSB8fCBcCiAgICAgICAgICAgICAoY3R4KS0+YXV0aFR5cGUgPT0gZUFOSV9TU01fQVRfUlNOX1BTSyB8fCBcCiAgICAgICAgICAgICAoY3R4KS0+YXV0aFR5cGUgPT0gZUFOSV9TU01fQVRfU0hBUkVEX0tFWSkKCiNkZWZpbmUgQUFHX0FDTF9MT09LVVBfUEVORElORyhjdHgpIFwKICAgICAgICAgICAgKChjdHgpLT5hY2xMb29rdXBGc20gIT0gTlVMTCAmJiAoY3R4KS0+cmFkaXVzSW5mby5yZXEgIT0gTlVMTCkKCiNkZWZpbmUgQUFHX1NUQV9BV0FJVElOR19DTEVBTlVQKGN0eCkgXAogICAgICAgICAgICAoKGN0eCktPnNzaWQgPT0gTlVMTCkKCiNkZWZpbmUgQUFHX01BUktfU1RBX0FTX0FXQUlUSU5HX0NMRUFOVVAoY3R4KSBcCiAgICAgICAgICAgICgoY3R4KS0+c3NpZCA9IE5VTEwpCgovKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEF1dGhSc25Gc20gc3RydWN0dXJlOgogKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QgdGFnQXV0aFJzbkZzbSAKewogICAgdl9VOF90IGN1cnJlbnRTdGF0ZTsKICAgIAogICAgdEJ0YW1wQ29udGV4dCAqY3R4OwogICAgdFN0YUNvbnRleHQgKnN0YUN0eDsgCgogICAgLy8gVmFyaWFibGVzIHVzZWQgZm9yIEVBUE9MLUtleSBtZXNzYWdlcwogICAgdl9VOF90IGFOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXTsKICAgIHZfVThfdCBzTm9uY2VbQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRV07CiAKICAgIC8vIEZsYWdzIHNldCBieSBleHRlcm5hbCBldmVudHMKICAgIHZfVThfdCBhdXRoUmVxOwogICAgdl9VOF90IGVhcG9sQXZhaWw7CiAgICB2X1U4X3QgZGlzY29ubmVjdDsKICAgIHZfVThfdCBpbnRlZ0ZhaWxlZDsKICAgIHZfVThfdCBwbWtBdmFpbGFibGU7CgogICAgLy8gVmFyaWFibGVzIG1haW50YWluZWQgaW50ZXJuYWxseQogICAgdl9VOF90IG51bVRyaWVzOwogICAgdEFuaVBhY2tldCAqbGFzdEVhcG9sOyAgLy9UeAogICAgdl9CT09MX3QgZlJlY2VpdmluZzsKICAgIHZfVTMyX3QgY3J5cHRIYW5kbGU7CgogICAgLy8gVGltZXJzIHVzZWQuLmFsdGVybmF0ZSB0aGVtIGluIGRpZmZlcmVudCBzdGF0ZXMKICAgIHZvc190aW1lcl90IG1zZzJUaW1lcjsKICAgIHZvc190aW1lcl90IG1zZzRUaW1lcjsKICAgIHZfQk9PTF90IG1zZzJUaW1lT3V0OwogICAgdl9CT09MX3QgbXNnNFRpbWVPdXQ7CiAgICB2X1U4X3QgYWR2ZXJ0aXplZFJzbkllWzI1Nl07Cn0gdEF1dGhSc25Gc207CgovKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN1cHBSc25Gc20gc3RydWN0dXJlOgogKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0IHRhZ1N1cHBSc25Gc20gewoKICAgIHZfVThfdCBjdXJyZW50U3RhdGU7CiAgICAKICAgIHRCdGFtcENvbnRleHQgKmN0eDsKICAgIHRTdXBwQ29udGV4dCAqc3VwcEN0eDsKCiAgICAvLyBWYXJpYWJsZXMgdXNlZCBmb3IgRUFQT0wtS2V5IG1lc3NhZ2VzCiAgICB0QW5pU3NtUmVwbGF5Q3RyICpsb2NhbFJlcGxheUN0cjsKICAgIHRBbmlTc21SZXBsYXlDdHIgKnBlZXJSZXBsYXlDdHI7CiAgICB2X1U4X3QgYU5vbmNlW0FOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkVdOwogICAgdl9VOF90IHNOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXTsKCiAgICAvLyBGbGFncyBzZXQgYnkgZXh0ZXJuYWwgZXZlbnRzCiAgICB2X1U4X3QgYXV0aFJlcTsKICAgIHZfVThfdCBwbWtBdmFpbDsKICAgIHZfVThfdCBlYXBvbEF2YWlsOwogICAgdl9VOF90IGludGVnRmFpbGVkOwogICAgdl9VOF90IHVwZGF0ZUtleXM7CgogICAgLy8gVmFyaWFibGVzIG1haW50YWluZWQgaW50ZXJuYWxseQogICAgaW50IG51bVRyaWVzOwogICAgdEFuaVBhY2tldCAqbGFzdEVhcG9sOwogICAgdl9CT09MX3QgZlJlY2VpdmluZzsKICAgIHZfVTMyX3QgY3J5cHRIYW5kbGU7Cn0gdFN1cHBSc25Gc207CgoKdHlwZWRlZiBzdHJ1Y3Qgc0FhZ1pvbmVFbnRyeSB0QWFnWm9uZUVudHJ5Owp0eXBlZGVmIHN0cnVjdCBzQWFnU3NpZEVudHJ5IHRBYWdTc2lkRW50cnk7Cgp0eXBlZGVmIGVudW0KewogICAgLy9JbnRlcm5hbCB0byBSU04KICAgIC8vVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgUlNOknMgdGltZXJzCiAgICBSU05fRlNNX1RJTUVSX0VYUElSRUQsICAKICAgIC8vQkFQIHVzZSB0aGlzIGV2ZW50IHRvIGluZm9ybSBhdXRoL3N1cHAgdG8gc3RhcnQgcHJvY2Vzc2luZwogICAgLy9hdXRoZW50aWNhdGlvbi4gV2hlbiBCQVAgc2VuZCB0aGlzIGV2ZW50IHRvIFJTTiwgaXQgaXMgcHJlc3VtZWQgCiAgICAvL3RoYXQgdGhlIFBNSyBpcyBhdmFpbGFibGUuCiAgICBSU05fRlNNX0FVVEhfU1RBUlQsICAgIAogICAgLy9JbnRlcm5hbCB0byBSU04KICAgIC8vVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgdGhlIFJ4IHJvdXRpbmUgd2hlbiBjYWxsZWQgYnkgVEwKICAgIFJTTl9GU01fRUFQT0xfRlJBTUVfQVZBSUxBQkxFLCAgCiAgICAvL0JBUCB1c2UgdGhpcyBldmVudCB0byBpbmZvcm0gUlNOIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdCAgCiAgICBSU05fRlNNX0RJU0NPTk5FQ1QsICAgIAogICAgLy9JbnRlcm5hbCB0byBSU04KICAgIC8vVGhpcyBldmVudCBoYW5ucGVucyB3aGVuIFJTTiBkZXRlY3Qga2V5IGludGVncmF0eSBjaGVjayBmYWlscwogICAgUlNOX0ZTTV9JTlRFR19GQUlMRUQsICAKCn10UnNuRnNtRXZlbnQ7CgovKioKICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIEVBUCBtZXNzYWdlIHRoYXQgd2FzIGxhc3QgcmVjZWl2ZWQgb3IKICogRUFQT0wgbWVzc2FnZXMgdGhhdCB3ZXJlIGxhc3Qgc2VudC4KICoKICogMS4gRUFQIG1lc3NhZ2VzIGxhc3QgcmVjZWl2ZWQgYXJlIHN0cmlwcGVkIG91dCBvZiB0aGVpciBvdXRlcgogKiAgICBlbmNhcHN1bGF0aW9uIHdoaWNoIG1heSBiZSBlaXRoZXIgRUFQT0wgb3IgUkFESVVTLCBhbmQgYXJlCiAqICAgIHByZXNlcnZlZCB3aXRoaW4gdGhpcyBzdHJ1Y3R1cmUgZm9yIHRoZSBsaWZldGltZSBvZiBvbmUgZXZlbnQ6CiAqICAgICAgICAtIEVBUE9MX01FU1NBR0VfQVZBSUxBQkxFICA9PiBwcm9jZXNzIGFuZCBzZW5kIHRvIFJBRElVUwogKiAgICAgICAgLSBSQURJVVNfTUVTU0FHRV9BVkFJTEFCTEUgPT4gcHJvY2VzcyBhbmQgc2VuZCB0byBTVEEKICogICAgV2hlbiB0aGUgZXZlbnQgaXMgZnVsbHkgaGFuZGxlZCwgdGhlIGluY29taW5nIHBhY2tldCBpcyBmcmVlZCwKICogICAgdGhlcmVmb3JlLCB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIG5vIGxvbmdlciB2YWxpZC4KICoKICogMi4gRUFQT0wgbWVzc2FnZXMgbGFzdCBzZW50IGFyZSBzdG9yZWQgaW4gdGhlaXIgZW50aXJldHkuIFRoZXkgYXJlCiAqICAgICBjcmVhdGVkIGFuZCBkZWxldGUgYSBsaXR0bGUgZGlmZmVyZW50bHkgb24gdGhlIEFQIGFuZCBCUCBzaWRlczoKICogICAgICAgLSBBUCBzaWRlOiBUaGUgRUFQT0wgbWVzc2FnZSBjb250YWlucyB0aGUgbGFzdCBFQVAgbWVzc2FnZQogKiAgICAgdGhhdCB3YXMgc2VudCB0byB0aGUgU1RBLiBBcyBzb29uIGFzIGEgbmV3IEVBUCBtZXNzYWdlIGFycml2ZXMKICogICAgIGZyb20gUkFESVVTLCB0aGlzIEVBUE9MIG1lc2FnZSBpcyBmcmVlZCBiZWNhdXNlIGEgbmV3IG9uZSB3aWxsCiAqICAgICBiZSBnZW5lcmF0ZWQuCiAqICAgICAgIC0gQlAgc2lkZTogVGhlIEVBUE9MIG1lc3NhZ2UgY29udGFpbnMgdGhlIGxhc3QgRUFQIG1lc3NhZ2UKICogICAgIGdlbmVyYXRlZCBieSB0aGUgbG9jYWwgc3VwcGxpY2FudC4gQXMgc29vbiBhcyBhIG5ldyBFQVBPTAogKiAgICAgbWVzc2FnZSBpcyBnZW5lcmF0ZWQsIHRoaXMgb25lIGlzIGZyZWVkIGFuZCB0aGUgbmV3IG9uZSBpcwogKiAgICAgc3RvcmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QgdEVhcEluZm8gCgp7CiAgICB0QW5pUGFja2V0ICptZXNzYWdlOwogICAgdl9VOF90IGlkOwp9IHRFYXBJbmZvOwoKCnR5cGVkZWYgZW51bSBlQW5pU3NtQXV0aFN0YXRlIHsKICAgIGVBTklfU1NNX0FVVEhfU1RBVEVfSU5JVCA9IDAsCiAgICBlQU5JX1NTTV9BU19QV19LRVlfQ09ORl9BV0FJVEVELAogICAgZUFOSV9TU01fQVNfUFdfS0VZX1NFVCwKfSB0QW5pU3NtQXV0aFN0YXRlOwoKCi8qKgogKiBUaGUgU3RhdGlvbidzIGNvbnRleHQgaXMgc3RvcmVkIGluIHRoaXMgc3RydWN0dXJlLiBJdCBjb250YWlucwogKiBwb2ludGVycyB0byB0aGUgRlNNJ3MgdXNlZCBieSB0aGUgU1RBICh3aGljaCBpbiB0dXJuIHBvaW50IGJhY2sgdG8KICogdGhlIGNvbnRleHQpLiBJdCBhbHNvIGNvbnRhaW5zIHRoZSB0cmFuc2llbnQgZXZlbnQgZGF0YSBsaWtlCiAqIEVBUC1NZXNzYWdlIGFuZCBSQURJVVMgc3RhdGUgdGhhdCBpcyBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgbmV0d29yawogKiBwYWNrZXRzLgogKi8Kc3RydWN0IHRTdGFDb250ZXh0IHsKCiAgICAvLyBTVEEgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24KICAgIHRBbmlNYWNBZGRyIHN1cHBNYWM7CiAgICB2X0JPT0xfdCBicEluZGljYXRvcjsKCiAgICAvLyBMb2NhbCBhc3NvY2lhdGlvbiBwb2ludAogICAgdEFuaU1hY0FkZHIgYXV0aE1hYzsKICAgIHZfVThfdCBzc2lkTmFtZVtTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCArIDFdOyAgICAKICAgIHRBYWdTc2lkRW50cnkgKnNzaWQ7CgogICAgLy8gVGhlIGRpZmZlcmVudCBGU00ncyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgZm9yIHRoZSBTVEEKICAgIHRBdXRoUnNuRnNtICphdXRoUnNuRnNtOwoKICAgIC8vIEtleXMgZGVyaXZlZCBmb3IgU1RBCiAgICB2X1U4X3QgcHRrW0FBR19QUkZfTUFYX09VVFBVVF9TSVpFXTsKICAgIHRBbmlQYWNrZXQgKnBtazsgLy8gTVMtTVBQRS1SZWN2LUtleQogICAgdEFuaVBhY2tldCAqc2VydmVyS2V5OyAvLyBNUy1NUFBFLVNlbmQtS2V5CiAgICB2X1U4X3Qga2V5SWQ7CgogICAgLy8gU1RBIGNvbnRleHQgdGltZXJzCiAgICB2X1UzMl90ICBzZXNzaW9uVGltZW91dDsKICAgIHZvc190aW1lcl90IHJlQXV0aFRpbWVyOwogICAgdm9zX3RpbWVyX3Qgc2Vzc2lvbkNsZWFudXBUaW1lcjsKCiAgICAvLyBSYWRpdXMgQXV0aGVudGljYXRpb24gYXR0cmlidXRlcwogICAgdl9VOF90ICphdXRoQ2xhc3NBdHRyOwoKICAgIC8vIE1pc2MuIGF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgc3RhdGUKICAgIGVDc3JBdXRoVHlwZSBhdXRoVHlwZTsKICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBwd0NpcGhlclR5cGU7CiAgICB0QW5pUGFja2V0ICppZVN0YTsKICAgIHRBbmlTc21BdXRoU3RhdGUgYXV0aFN0YXRlOwogICAgdl9CT09MX3QgcHJtTG9va3VwSW5Qcm9ncmVzczsKICAgIHZfQk9PTF90IGZpcnN0VGltZUF1dGg7CiAgICB2X0JPT0xfdCBzZWN1cmVMaW5rOyAvLyA0LXdheSBoL3MgcmVxdXJpZXMgdGhpcyB0byBiZSAwIGF0IHN0YXJ0dXAgb3Igb24gTUlDIGZhaWx1cmVzCiAgICB0QW5pU3NtUmVwbGF5Q3RyICpsb2NhbFJlcGxheUN0cjsKICAgIHRBbmlTc21SZXBsYXlDdHIgKnBlZXJSZXBsYXlDdHI7IC8vIEdvZXMgaGFuZCBpbiBoYW5kIHdpdGggZmxhZyBiZWxvdwogICAgdl9CT09MX3QgcGFzdEZpcnN0UGVlclJlcXVlc3Q7IC8vIEZvciB1c2Ugd2l0aCBwZWVyIHJlcGxheSBjb3VudGVyCgogICAgdEFuaVBhY2tldCAqY2FjaGVkUG1rOyAvLyBNUy1NUFBFLVJlY3YtS2V5CiAgICB0QW5pUGFja2V0ICpjYWNoZWRTZXJ2ZXJLZXk7IC8vIE1TLU1QUEUtU2VuZC1LZXkKICAgIHZfVThfdCBjYWNoZWRLZXlJZDsKCn07CgoKc3RydWN0IHRTdXBwQ29udGV4dCB7CgogICAgLy8gQVAgKHBlZXIpIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uCiAgICB0QW5pTWFjQWRkciBhdXRoTWFjOwogICAgdl9VOF90ICpzc2lkU3RyOwoKICAgIC8vIExvY2FsIGFzc29jaWF0aW9uIHBvaW50CiAgICB0QW5pTWFjQWRkciBzdXBwTWFjOwoKICAgIC8vIEtleXMgZGVyaXZlZCBvbiBzdXBwbGljYW50CiAgICB2X1U4X3QgcHRrW0FBR19QUkZfTUFYX09VVFBVVF9TSVpFXTsKICAgIHZfVThfdCBwd0tleUxlbjsgLy8gIyBvZiBieXRlcyBvZiBQVEsgdG8gc2VuZCB0byBMSU0KICAgIHRBbmlQYWNrZXQgKnBtazsgLy8gTVMtTVBQRS1SZWN2LUtleQogICAgdEFuaVBhY2tldCAqc2VydmVyS2V5OyAvLyBNUy1NUFBFLVNlbmQtS2V5CgogICAgLy8gTWlzYy4gYXV0aGVudGljYXRpb24gcmVsYXRlZCBzdGF0ZQogICAgZUNzckF1dGhUeXBlIGF1dGhUeXBlOwogICAgZUNzckVuY3J5cHRpb25UeXBlIHB3Q2lwaGVyVHlwZTsKICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBncnBDaXBoZXJUeXBlOwogICAgdEFuaVBhY2tldCAqaWVCcDsKICAgIHRBbmlQYWNrZXQgKmllQXA7CiAgICB2X0JPT0xfdCBmaXJzdFRpbWVBdXRoOwoKfTsKCnR5cGVkZWYgc3RydWN0IHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhIHsKICAgIHZvaWQgKmtleURlc2M7CiAgICB0QW5pUGFja2V0ICplYXBvbEZyYW1lOwp9IHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhOwoKdHlwZWRlZiBzdHJ1Y3QgdEFuaUFhZ1RpbWVyRXZlbnREYXRhIHsKICAgIHZvc190aW1lcl90IHRpbWVyOwogICAgdm9pZCAqYXBwRGF0YTsKfSB0QW5pQWFnVGltZXJFdmVudERhdGE7CgoKLyoqCiAqIENhbGxiYWNrIGZ1bnRpb24gdGhhdCBzZXRzIHNvbWUgc3RhdHVzIGZvciBhIGdpdmVuIFNUQSBjb250ZXh0LAogKiBlLmcuLCB0aGUgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVkIHBvcnQuCiAqLwojaWYgMAp0eXBlZGVmIGludCAoKnRBYWdTZXRTdGF0dXMpKHRTdGFDb250ZXh0ICpjdHgpOwoKdHlwZWRlZiBpbnQgKCp0QWFnVHhFYXBvbFN1cHApKHRTdXBwQ29udGV4dCAqY3R4KTsKdHlwZWRlZiBpbnQgKCp0QWFnU2V0U3RhdHVzU3VwcCkodFN1cHBDb250ZXh0ICpjdHgpOwp0eXBlZGVmIGludCAoKnRBYWdTZW5kRXZlbnRUb0ZzbVN1cHApKHRTdXBwQ29udGV4dCAqY3R4KTsKI2VuZGlmCgovKioKICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBwb3N0cyBhIFhYWF9USU1FUl9FWFBJUkVEIGV2ZW50IHdoZW4gYSB0aW1lcgogKiBnb2VzIG9mZi4gWFhYIHJlcHJlc2VudHMgdGhlIGtpbmQgb2YgdGltZXIgdGhhdCBjYXVzZWQgdGhlIGV2ZW50LgogKi8KdHlwZWRlZiB2b2lkICgqdEFhZ1RpbWVyQ2FsbGJhY2spKHZvaWQgKmRhdGEpOwoKLyoqCiAqIENhbGxiYWNrcyBwcm92aWRlZCB0byB0aGUgR3JvdXBLZXlGc20gbW9kdWxlIGZyb20gdGhlIEZTTSBNYW5hZ2VyCiAqIG1vZHVsZSBzbyB0aGF0IGl0IGNhbiBhY2Nlc3MgcHJvY2VkdXJlcyBuZWVkZWQgZm9yIG5ldHdvcmsKICogdHJhbnNtaXNzaW9uLCBpbnRlci1GU00gc2lnbmFsbGluZywgYW5kIGNvbW11bmljYXRpb24gd2l0aCB0aGUgbWFpbgogKiBhcHBsaWNhdGlvbi4KICovCi8qdHlwZWRlZiBzdHJ1Y3QgdEdyb3VwS2V5RnNtQ2FsbGJhY2tzIHsKICAgIGludCAoKmdldERlZmF1bHRXZXBLZXlJZCkodl9VMzJfdCByYWRpb0lkKTsKICAgIGludCAoKmNvcHlEZWZhdWx0V2VwS2V5KSh2X1UzMl90IHJhZGlvSWQpOwogICAgaW50ICgqdXBkYXRlQWxsU3RhKSh2X1UzMl90IHJhZGlvSWQpOwp9IHRHcm91cEtleUZzbUNhbGxiYWNrczsqLwoKLyoqCiAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBjb250YW50cyB1c2VkIGJ5IHRoZSBBdXRoRnNtIGFzIGRlZmluZWQgaW4KICogWzgwMi4xWF0uCiAqLwp0eXBlZGVmIHN0cnVjdCB0QXV0aEZzbUNvbnN0cyB7CiAgICAvLyBBbW91bnQgb2YgdGltZSB0byBpZ25vcmUgYSBtaXNiZWhhdmluZyBTVEEKICAgIHZfVTE2X3QgcXVpZXRQZXJpb2Q7CiAgICAvLyBOdW1iZXIgb2YgcmVhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyBhbGxvd2VkIGJlZm9yZSBpZ25vcmluZyBTVEEKICAgIHZfVThfdCByZUF1dGhNYXg7CiAgICAvLyBBbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciByZXNwb25zZSBmcm9tIFNUQQogICAgdl9VMTZfdCB0eFBlcmlvZDsKfSB0QXV0aEZzbUNvbnN0czsKCgoKLyoqCiAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBjb25zdGFudHMgdXNlZCBieSB0aGUgQXV0aFJzbkZzbSBhcyBkZWZpbmVkIGluCiAqIFs4MDIuMTFpXS4KICovCnR5cGVkZWYgc3RydWN0IHRBdXRoUnNuRnNtQ29uc3RzIHsKICAgIHZfVTMyX3QgdGltZW91dFBlcmlvZDsKICAgIHZfVTMyX3QgbWF4VHJpZXM7Cn0gdEF1dGhSc25Gc21Db25zdHM7CgoKLyoqCiAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBjb250YW50cyB1c2VkIGJ5IHRoZSBTdXBwRnNtIGFzIGRlZmluZWQgaW4KICogWzgwMi4xWF0uCiAqLwp0eXBlZGVmIHN0cnVjdCB0U3VwcEZzbUNvbnN0cyB7CiAgICB2X1UxNl90IGF1dGhQZXJpb2Q7CiAgICB2X1UxNl90IGhlbGRQZXJpb2Q7CiAgICB2X1UxNl90IHN0YXJ0UGVyaW9kOwogICAgdl9VOF90IG1heFN0YXJ0OyAgICAKfSB0U3VwcEZzbUNvbnN0czsKCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFN1cHBSc25Gc20gYXMgZGVmaW5lZCBpbgogKiBbODAyLjExaV0uCiAqLwp0eXBlZGVmIHN0cnVjdCB0U3VwcFJzbkZzbUNvbnN0cyB7CiAgICB2X1UzMl90IHRpbWVvdXRQZXJpb2Q7CiAgICB2X1UzMl90IG1heFRyaWVzOwp9IHRTdXBwUnNuRnNtQ29uc3RzOwoKCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgY29uc3RhbnRzIHVzZWQgYnkgdGhlIEF1dGhSc25Hcm91cEtleUZzbSBhcwogKiBkZWZpbmVkIGluIFs4MDIuMTFpXS4KICovCnR5cGVkZWYgc3RydWN0IHRBdXRoUnNuR3JvdXBLZXlGc21Db25zdHMgewogICAgdl9VMzJfdCB0aW1lb3V0UGVyaW9kOwogICAgdl9VMzJfdCBtYXhUcmllczsKfSB0QXV0aFJzbkdyb3VwS2V5RnNtQ29uc3RzOwoKLyoqCiAqIGF1dGhSc25Gc21GcmVlCiAqCiAqIEZVTkNUSU9OCiAqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgUlNOIEtleSBGU00gaW4gYSBTVEEgY29udGV4dC4gSWYgdGhlCiAqIFJTTiBLZXkgRlNNIGlzIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuCiAqIAogKiBAcGFyYW0gY3R4IHRoZSBTVEEgY29udGV4dCB3aG9zZSBGU00gaW5zdGFuY2UgaXMgdG8gYmUgZnJlZWQKICoKICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwogKi8KaW50CmF1dGhSc25Gc21GcmVlKHRCdGFtcENvbnRleHQgKmN0eCk7CgovKioKICogYXV0aFJzbkZzbVByb2Nlc3NFdmVudAogKgogKiBGVU5DVElPTgogKiBQYXNzZXMgYW4gZXZlbnQgdG8gdGhlIFJTTiBrZXkgRlNNIGluc3RhbmNlIGZvciBpbW1lZGlhdGUgcHJvY2Vzc2luZy4KICogCiAqIEBwYXJhbSBmc20gdGhlIFJTTiBLZXkgRlNNIGluc3RhbmNlCiAqIEBwYXJhbSBldmVudElkIHRoZSBBQUcgZXZlbnQgdG8gcHJvY2VzcwogKiBAcGFyYW0gYXJnIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGlzIGV2ZW50CiAqCiAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKICovCmludAphdXRoUnNuRnNtUHJvY2Vzc0V2ZW50KHRBdXRoUnNuRnNtICpmc20sIHRSc25Gc21FdmVudCBldmVudElkLCB2b2lkICphcmcpOwoKCi8qKgogKiBzdXBwRnNtQ3JlYXRlCiAqCiAqIEZVTkNUSU9OCiAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIGFuIFN1cHBGc20gaW5zdGFuY2UgZm9yIHRoZQogKiBnaXZlbiBTVEEgY29udGV4dC4KICogCiAqIEBwYXJtIGN0eCB0aGUgc3VwcGxpY2FudCBjb250ZXh0IHdob3NlIFN1cHBGc20gaXMgYmVpbmcgY3JlYXRlZAogKgogKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCiAqLwppbnQKc3VwcFJzbkZzbUNyZWF0ZSh0QnRhbXBDb250ZXh0ICpjdHgpOwoKLyoqCiAqIHN1cHBGc21GcmVlCiAqCiAqIEZVTkNUSU9OCiAqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgU3VwcEZzbS4KICogCiAqIEBwYXJhbSBzdXBwQ3R4IHRoZSBzdXBwbGljYW50IGNvbnRleHQgd2hvc2Ugc3VwcEZzbSBpcyB0byBiZSBmcmVlZAogKgogKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCiAqLwppbnQKc3VwcFJzbkZzbUZyZWUodEJ0YW1wQ29udGV4dCAqY3R4KTsKCi8qKgogKiBzdXBwRnNtUHJvY2Vzc0V2ZW50CiAqCiAqIEZVTkNUSU9OCiAqIFBhc3NlcyBhbiBldmVudCB0byB0aGUgc3VwcEZzbSBmb3IgaW1tZWRpYXRlIHByb2Nlc3NpbmcuCiAqIAogKiBOb3RlOiBUaGUgcGVydGluZW50IGV2ZW50IGRhdGEgaXMgYWxyZWFkeSBzdG9yZWQgaW4gdGhlIGNvbnRleHQuCiAqCiAqIEBwYXJhbSBzdXBwRnNtIHRoZSBzdXBwRnNtCiAqIEBwYXJhbSBldmVudElkIHRoZSBBQUcgZXZlbnQgdG8gcHJvY2VzcwogKgogKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCiAqLwppbnQKc3VwcFJzbkZzbVByb2Nlc3NFdmVudCh0U3VwcFJzbkZzbSAqZnNtLCB0UnNuRnNtRXZlbnQgZXZlbnRJZCwgdm9pZCAqYXJnKTsKCiNlbmRpZiAvLyBfX0FBR19GU01fSF8K