I2lmbmRlZiBDT05GSUdfTUlOXzhNX1ZFUlNJT04NCiNpbmNsdWRlICJhdF9jb250ZXh0LmgiDQoNCmludCBleHRfTG9ja2xpc3RBdXRoX2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTElTVEFVVEhfUkVRLHN0cmxlbihhdF9wYXJhcyksICh1bnNpZ25lZCBjaGFyICopYXRfcGFyYXMsMCk7DQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KfQ0KDQppbnQgZXh0X0xvY2tuZXRMaXN0X3NldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVExJU1RfU0VUX1JFUSxzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0S2V5X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUS0VZX1JFUSxzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0QW10U3RhdHVzX2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVEFNVFNUQVRVU19HRVRfUkVRLCAwLCBOVUxMLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0RGlnZXN0X2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVERJR0VTVF9HRVRfUkVRLCAwLCBOVUxMLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0U2lnbl9zZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQ0Kew0KCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRTSUdOX1NFVF9SRVEsc3RybGVuKGF0X3BhcmFzKSwgKHVuc2lnbmVkIGNoYXIgKilhdF9wYXJhcywwKTsNCglyZXR1cm4gQVRfQ09OVElOVUU7DQp9DQoNCmludCBleHRfTG9ja25ldExldmVsX2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVExFVkVMX0dFVF9SRVEsIDAsIE5VTEwsMCk7DQoJcmV0dXJuIEFUX0NPTlRJTlVFOw0KfQ0KDQppbnQgZXh0X0xvY2tuZXRMaXN0X2dldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVExJU1RfR0VUX1JFUSxzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0QXV0aF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVEFVVEhfUkVRLCAwLCBOVUxMLDApOw0KCXJldHVybiBBVF9DT05USU5VRTsNCn0NCg0KaW50IGV4dF9Mb2NrbmV0VW5sb2NrVGltZXNfZ2V0X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykNCnsNCglpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9BVF9DVEwsTU9EVUxFX0lEX0xPQ0tORVQsTVNHX0NNRF9MT0NLTkVUVU5MT0NLVElNRVNfR0VUX1JFUSwgMCwgTlVMTCwwKTsNCglyZXR1cm4gQVRfQ09OVElOVUU7DQp9DQoNCmludCBleHRfTG9ja25ldFN0YXR1c19nZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQ0Kew0KCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX0FUX0NUTCxNT0RVTEVfSURfTE9DS05FVCxNU0dfQ01EX0xPQ0tORVRTVEFUVVNfR0VUX1JFUSwgMCwgTlVMTCwwKTsNCglyZXR1cm4gQVRfQ09OVElOVUU7DQp9DQoNCmludCBleHRfTG9ja25ldFVubG9ja19mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpDQp7DQoJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLE1PRFVMRV9JRF9MT0NLTkVULE1TR19DTURfTE9DS05FVFVOTE9DS19SRVEsc3RybGVuKGF0X3BhcmFzKSwgKHVuc2lnbmVkIGNoYXIgKilhdF9wYXJhcywwKTsNCglyZXR1cm4gQVRfQ09OVElOVUU7DQp9DQoNCi8vytW1vXp1ZHJ51ve2r8nPsajD/MHuuvOjrM/Ct6JBVCtaU0NIUExNTj0xyrltb2RlbdTK0O3L0c34KLjDw/zB7srH1NrL+M34uabE3NbQyrnTwykNCmludCB6dXJkeV9hdXRvX2FjdChjaGFyICphdF9wYXJhcyAsaW50IGlzX3F1ZXJ5X3JlcG9ydCkNCnsNCiAgICBpbnQgYXBwbW9kZSA9IDA7DQogICAgaW50IGluaXRyZXN1bHQgPSAwOw0KICAgIHZvaWQgKnBbMl0gPSB7JmFwcG1vZGUsICZpbml0cmVzdWx0fTsNCiAgICANCiAgICBwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApOw0KICAgIGF0X3ByaW50KEFUX0VSUiwienVyZHlfYXV0b19hY3QgYXBwbW9kZTolZCxpbml0cmVzdWx0OiVkIVxuIixhcHBtb2RlLGluaXRyZXN1bHQpOw0KICAgIGlmKGFwcG1vZGUgIT0gMCAmJiAoaW5pdHJlc3VsdCA9PSAzMCB8fCBpbml0cmVzdWx0ID09IDMxKSkNCiAgICB7ICAgCQkNCgkJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfQVRfQ1RMLCBNT0RVTEVfSURfTE9DS05FVCwgTVNHX0NNRF9aVVJEWV9MT0NLQVVUSF9SRVEsIDAsIE5VTEwsMCk7DQoJfQ0KICAgIHJldHVybiBBVF9FTkQ7DQp9DQoNCnZvaWQgZXh0X2xvY2tuZXRfcmVnaXN0X2luaXQoKQ0Kew0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTE9DS0xJU1RBVVRIPSIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja2xpc3RBdXRoX2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTE9DS05FVExJU1Q9IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0TGlzdF9zZXRfZnVuYyk7CQ0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiVU5MT0NLS0VZPSIsIE1PRFVMRV9JRF9MT0NLTkVULCBleHRfTG9ja25ldEtleV9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIlVOTE9DS0tFWT8iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXRBbXRTdGF0dXNfZ2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTE9DS0RJR0VTVD8iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXREaWdlc3RfZ2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiTE9DS1NJR049IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0U2lnbl9zZXRfZnVuYyk7DQoJcmVnaXN0ZXJfc2Vydl9mdW5jKCJMT0NLTEVWRUw/IiwgTU9EVUxFX0lEX0xPQ0tORVQsZXh0X0xvY2tuZXRMZXZlbF9nZXRfZnVuYyk7DQoJcmVnaXN0ZXJfc2Vydl9mdW5jKCJNRVBDRz0iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXRMaXN0X2dldF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkxPQ0tORVRBVVRIIiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0QXV0aF9mdW5jKTsNCglyZWdpc3Rlcl9zZXJ2X2Z1bmMoIlpOQ0s/IiwgTU9EVUxFX0lEX0xPQ0tORVQsIGV4dF9Mb2NrbmV0VW5sb2NrVGltZXNfZ2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiWlNFQz8iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXRTdGF0dXNfZ2V0X2Z1bmMpOw0KCXJlZ2lzdGVyX3NlcnZfZnVuYygiWk5DSz0iLCBNT0RVTEVfSURfTE9DS05FVCwgZXh0X0xvY2tuZXRVbmxvY2tfZnVuYyk7DQoNCglyZWdpc3Rlcl9pbmZvcm1fZnVuYygiWlVSRFkiLHp1cmR5X2F1dG9fYWN0KTsNCn0NCiNlbmRpZg0KDQo=