LyoKICogbGludXgvZHJpdmVycy9jaGFyL3RpODF4eF9oZG1pL2hkbWlfbGliLmMKICoKICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzCiAqCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCiAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCgovKioKICogS2V5IG5vdGVzCiAqIDEuIFdyYXBwZXIgZG9lc24ndCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGZvciBhbGwgdGhlIGV2ZW50cywgZ2VuZXJhdGVzIGZvciBIUEQuCiAqCSAgVXNpbmcgY29yZSBpbnRlcnJ1cHQgaW5zdGVhZC4KICogMi4gRFZJIG1vZGUgaXMgbm90IGNvbmZpZ3VyYWJsZSwgb3BlcmF0ZXMgaW4gSERNSSBtb2RlIG9ubHksIGNvbnRyb2wgaW4KICoJICBIRE1JX0NUUkwKICogMy4gVGhlIENvcmUgc3lzdGVtIHNob3VsZCBvcGVyYXRlIGFzIGEgU0xBVkUuIE1BU1RFUi9TTEFWRSBtb2RlIGRlcGVuZHMgb24KICoJICBjb3JlL3dyYXBwZXIgaW50ZWdyYXRpb24uCiAqCiAqLwoKLyoKICogT3BlbiBpdGVtcwogKiAxLiBIYW5kbGUgRERDIGJ1cyBoYW5ndXBzIC8gbG9ja3VwcyBkdXJpbmcgRURJRCBSZWFkIFtEb25lXQogKiAyLiB1c2UgY29weSB0byB1c2VyIGFuZCBjb3B5IGZyb20gdXNlcgogKi8KCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKglJbmNsdWRlIEZpbGVzCQkJCQkJCSAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC90aTgxeHhoZG1pLmg+CgojaW5jbHVkZSAidGk4MXh4X2hkbWlfY2ZnLmgiCiNpbmNsdWRlICJ0aTgxeHhfaGRtaV9yZWdvZmZzZXRzLmgiCiNpbmNsdWRlIDxhc20vaW8uaD4KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qCUxvY2FsIENvbmZpZ3VyYXRpb25zCQkJCQkJICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KI2RlZmluZSBIRE1JX0REQ19DTURfVElNRU9VVCAoMHhGRkZGRnUpCi8qIFRpbWVvdXQgcGVyaW9kcyB1c2VkIHRvIHdhaXQgZm9yIGEgRERDIG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLwojZGVmaW5lIEhETUlfV1BfUkVTRVRfVElNRU9VVCAoMHhGRkZGRnUpCi8qIFRpbWVvdXQgcGVyaW9kcyB1c2VkIHRvIHdhaXQgZm9yIGEgRERDIG9wZWF0aW9uIHRvIGNvbXBsZXRlICovCiNkZWZpbmUgSERNSV9QSFlfMl9XUF9QTExfTE9DS19USU1FT1VUICgweEZGRkZGdSkKLyogVGltZW91dCBwZXJpb2RzIHVzZWQgdG8gd2FpdCBUQ0xLIHRvIHN0YWJpbGl6ZSAtIFRDTEsgd291bGQgYmUgZ2VuZXJhdGVkCiAgIGJ5IFBIWSB0byBvcGVyYXRlIHdyYXBwZXIgKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qCUxvY2FsIERlZmluZXMJCQkJCQkJICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCiNkZWZpbmUgSERNSV9DVFJMX1BBQ0tFVF9NT0RFXzI0QklUU19QSVhFTAkoMHg0dSkKLyogRGVmaW5lcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGJpdHMvcGl4ZWwgdGhhdCB3b3VsZCBzZW50IHRvCiAgIHBhY2tldGl6ZXIgKi8KI2RlZmluZSBIRE1JX0NUUkxfUEFDS0VUX01PREVfMzBCSVRTX1BJWEVMCSgweDV1KQovKiBEZWZpbmVzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBudW1iZXIgb2YgYml0cy9waXhlbCB0aGF0IHdvdWxkIHNlbnQgdG8KICAgcGFja2V0aXplciAqLwojZGVmaW5lIEhETUlfQ1RSTF9QQUNLRVRfTU9ERV8zNkJJVFNfUElYRUwJKDB4NnUpCi8qIERlZmluZXMgdXNlZCB0byBjb25maWd1cmUgdGhlIG51bWJlciBvZiBiaXRzL3BpeGVsIHRoYXQgd291bGQgc2VudCB0bwogICBwYWNrZXRpemVyICovCiNkZWZpbmUgSERNSV9WSURfTU9ERV9ESVRIRVJfVE9fMjRfQklUU19NT0RFICgweDB1KQovKiBEZWZpbmVzIHRvIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXRoZXJpbmcgd2lkdGggKi8KI2RlZmluZSBIRE1JX1ZJRF9NT0RFX0RJVEhFUl9UT18zMF9CSVRTX01PREUgKDB4MXUpCi8qIERlZmluZXMgdG8gdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRpdGhlcmluZyB3aWR0aCAqLwojZGVmaW5lIEhETUlfVklEX01PREVfRElUSEVSX1RPXzM2X0JJVFNfTU9ERSAoMHgydSkKLyogRGVmaW5lcyB0byB1c2VkIHRvIGRldGVybWluZSB0aGUgZGl0aGVyaW5nIHdpZHRoICovCiNkZWZpbmUgSERNSV9UTURTX0NUUkxfSVBfQ0xPQ0tfTVVMVElQTElFUl9BVURJTwkoMHgxdSkKLyogRGVmaW5lcyB0aGUgbXVsdGlwbGllciB2YWx1ZSB1c2VkIHRvIG11bHRpcGx5IHRoZSBpbnB1dCBjbG9jayBJRENLLCBpbiBvcmRlcgogICB0byBzdXBwb3J0IGhpZ2hlciBzYW1wbGluZyByYXRlcyAvIGNoYW5uZWxzIGF1ZGlvICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9UWVBFIAkoMHg4MnUpCi8qIEFWSSBJbmZvIGZyYW1lIGhlYWRlciAtIHBhY2tldCB0eXBlIC0gZGVmaW5lZCBieSBzdGFuZGFyZCAqLwojZGVmaW5lIEhETUlfQVZJX0lORk9GUkFNRV9QS1RfVkVSCQkoMHgwMikKLyogQVZJIEluZm8gZnJhbWUgaGVhZGVyIC0gcGFja2V0IHZlcnNpb24gLSBkZWZpbmVkIGJ5IHN0YW5kYXJkICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9MRU4JCSgweDBEKQovKiBBVkkgSW5mbyBmcmFtZSBoZWFkZXIgLSBwYWNrZXQgdmVyc2lvbiAtIGRlZmluZWQgYnkgc3RhbmRhcmQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfWTBfWTFfTUFTSwkJKDB4NjB1KQovKiBNYXNrIHRvIHNldC9leHRyYWN0IFkwLTEgYml0IG9mIGZpcnN0IGJ5dGUgb2YgQVZJIGluZm8gcGFja2V0ICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX0EwX01BU0sJCSgweDEwdSkKLyogTWFzayB0byBzZXQvZXh0cmFjdCBBMCBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBBVkkgaW5mbyBwYWNrZXQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfQjBfQjFfTUFTSwkJKDB4MEN1KQovKiBNYXNrIHRvIHNldC9leHRyYWN0IEIwLTEgYml0IG9mIGZpcnN0IGJ5dGUgb2YgQVZJIGluZm8gcGFja2V0ICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX1MwX1MxX01BU0sJCSgweDAzdSkKLyogTWFzayB0byBzZXQvZXh0cmFjdCBTMC0xIGJpdCBvZiBmaXJzdCBieXRlIG9mIEFWSSBpbmZvIHBhY2tldCAqLwojZGVmaW5lIEhETUlfQVZJX0lORk9GUkFNRV9DMF9DMV9NQVNLCQkoMHhDMHUpCi8qIE1hc2sgdG8gc2V0L2V4dHJhY3QgQzAtMSBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBBVkkgaW5mbyBwYWNrZXQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfTTBfTTFfTUFTSwkJKDB4MzB1KQovKiBNYXNrIHRvIHNldC9leHRyYWN0IE0wLTEgYml0IG9mIGZpcnN0IGJ5dGUgb2YgQVZJIGluZm8gcGFja2V0ICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX1IwX1IzX01BU0sJCSgweDBGdSkKLyogTWFzayB0byBzZXQvZXh0cmFjdCBSMC0zIGJpdCBvZiBmaXJzdCBieXRlIG9mIEFWSSBpbmZvIHBhY2tldCAqLwojZGVmaW5lIEhETUlfQVZJX0lORk9GUkFNRV9JVENfTUFTSyAJKDB4ODB1KQovKiBNYXNrIHRvIHNldC9leHRyYWN0IElUQyBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBBVkkgaW5mbyBwYWNrZXQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfRUMyX0VDMF9NQVNLIAkoMHg3MHUpCi8qIE1hc2sgdG8gc2V0L2V4dHJhY3QgRUMwLTMgYml0IG9mIGZpcnN0IGJ5dGUgb2YgQVZJIGluZm8gcGFja2V0ICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX1ExX1EwX01BU0sJCSgweDBDdSkKLyogTWFzayB0byBzZXQvZXh0cmFjdCBRMC0xIGJpdCBvZiBmaXJzdCBieXRlIG9mIEFWSSBpbmZvIHBhY2tldCAqLwojZGVmaW5lIEhETUlfQVZJX0lORk9GUkFNRV9TQzFfU0MwX01BU0sgCSgweDAzdSkKLyogTWFzayB0byBzZXQvZXh0cmFjdCBTQzAtMSBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBBVkkgaW5mbyBwYWNrZXQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfVklDNl9WSUMwX01BU0sJKDB4N0Z1KQovKiBNYXNrIHRvIHNldC9leHRyYWN0IFZJQzYtMCBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBBVkkgaW5mbyBwYWNrZXQgKi8KI2RlZmluZSBIRE1JX0FWSV9JTkZPRlJBTUVfUFIzX1BSMF9NQVNLIAkoMHgwRnUpCi8qIE1hc2sgdG8gc2V0L2V4dHJhY3QgUFIzLTAgYml0IG9mIGZpcnN0IGJ5dGUgb2YgQVZJIGluZm8gcGFja2V0ICovCiNkZWZpbmUgSERNSV9BVklfSU5GT0ZSQU1FX0NPTlNUXzB4MTAwCQkoMHgxMDB1KQovKiBDb25zdGFudCB1c2VkIHRvIGNhbGN1bGF0ZSBBVkkgaW5mbyBmcmFtZSBjaGVja3N1bSAqLwojZGVmaW5lIEhETUlfTUlOSU1VTV9QSVhFTFNfU0VDIAkJKDI1MDAwMDAwdSkKLyogSERNSSBzdGFuZGFyZCBNYW5kYXRlcyB0aGF0IGF0IGEgbWluaW11bSB0aGVyZSBzaG91bGQgYmUgMjUgTVBpeGVscy9zZWMuICovCiNkZWZpbmUgSERNSV9QSVhFTF9SRVBMRUNBVEVEX09OQ0UJCSgweDIpCi8qIEVhY2ggcGl4ZWwgd291bGQgYmUgc2VudCB0d2ljZSAqLwojZGVmaW5lIEhETUlfUElYRUxfUkVQTEVDQVRFRF9GT1VSX1RJTUVTCSgweDQpCi8qIEVhY2ggcGl4ZWwgd291bGQgYmUgc2VudCBmb3VyIHRpbWVzICovCgovKiBTdGFuZGFyZCByZXNvbHV0aW9ucyBjb2x1bW4gWCByb3cgWCBGUFMgKi8KI2RlZmluZSBIRE1JX1ZJREVPX1NUQU5EX05UU0MJCQkoODU4ICogNTI1ICogMzApCiNkZWZpbmUgSERNSV9WSURFT19TVEFORF9QQUwJCQkoODU4ICogNjI1ICogMjUpCiNkZWZpbmUgSERNSV9WSURFT19TVEFORF83MjBQNjAgCQkoMTY1MCAqIDc1MCAqIDYwKQojZGVmaW5lIEhETUlfVklERU9fU1RBTkRfMTA4MFA2MAkJKDIyMDAgKiAxMTI1ICogNjApCiNkZWZpbmUgSERNSV9WSURFT19TVEFORF8xMDgwSTYwCQkoMjIwMCAqIDExMjUgKiAzMCkKI2RlZmluZSBIRE1JX1ZJREVPX1NUQU5EXzEwODBQMzAJCSgyMjAwICogMTEyNSAqIDMwKQovKiBVbmRlZiB0aGlzIHRvIHRlc3QgSERNSSAqLwovLyNkZWZpbmUgSERNSV9URVNUCQkJCSgxKQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKgkJCQlMb2NhbCBTdHJ1Y3R1cmUgCQkJICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCnN0cnVjdCBpbnN0YW5jZV9jZmcgewoJdTMyIGluc3RhbmNlOwoJdTMyIGNvcmVfYmFzZV9hZGRyOwoJdTMyIHdwX2Jhc2VfYWRkcjsKCXUzMiBwaHlfYmFzZV9hZGRyOwoJdTMyIHByY21fYmFzZV9hZGRyOwoJdTMyIHZlbmNfYmFzZV9hZGRyOwoJYm9vbCBpc19yZWN2cl9zZW5zZWQ7Cglib29sIGlzX3NjbF9jbG9ja2VkOwoJYm9vbCBpc19zdHJlYW1pbmc7CglzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zIGNvbmZpZzsKCXUzMiB2U3luY19jb3VudGVyOwoJYm9vbCBpc19pbnRlcmxhY2VkOwoJZW51bSB0aTgxeHhoZG1pX21vZGUgaGRtaV9tb2RlOwoJdTMyIGhkbWlfcGxsX2Jhc2VfYWRkcjsKfTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qCQkJICAgTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCQkJICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8Kc3RhdGljIGludCBjb25maWd1cmVfcGh5KHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCk7CnN0YXRpYyBpbnQgY29uZmlndXJlX3dyYXBwZXIoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0KTsKc3RhdGljIGludCBjb25maWd1cmVfY29yZV9pbnB1dChzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpOwpzdGF0aWMgaW50IGNvbmZpZ3VyZV9jb3JlX2RhdGFfcGF0aChzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpOwpzdGF0aWMgaW50IGNvbmZpZ3VyZV9jb3JlKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCk7CnN0YXRpYyBpbnQgY29uZmlndXJlX3BvbGljaWVzKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCk7CnN0YXRpYyBpbnQgY29uZmlndXJlX2F2aV9pbmZvX2ZyYW1lKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCk7CnN0YXRpYyBpbnQgY29uZmlndXJlX2N0cmxfcGFja2V0cyhzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpOwpzdGF0aWMgaW50IGNvbmZpZ3VyZV9jc2NfeWNiY3JfcmdiKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCk7CgpzdGF0aWMgaW50IHZhbGlkYXRlX2luZm9fZnJhbWVfY2ZnKHN0cnVjdCBoZG1pX2luZm9fZnJhbWVfY2ZnICpjb25maWcpOwpzdGF0aWMgaW50IHZhbGlkYXRlX2NvcmVfY29uZmlnKHN0cnVjdCBoZG1pX2NvcmVfaW5wdXRfY2ZnICpjb25maWcpOwpzdGF0aWMgaW50IHZhbGlkYXRlX3dwX2NmZyhzdHJ1Y3QgaGRtaV93cF9jb25maWcgKmNvbmZpZyk7CnN0YXRpYyBpbnQgdmFsaWRhdGVfcGF0aF9jb25maWcoc3RydWN0IGhkbWlfY29yZV9kYXRhX3BhdGggKmNvbmZpZyk7CnN0YXRpYyBpbnQgY2hlY2tfY29weV9jb25maWcoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jbnR4dCwKCQlzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zICpjb25maWcpOwppbnQgdGk4MXh4X2hkbWlfc2V0X21vZGUoZW51bSB0aTgxeHhoZG1pX21vZGUgaGRtaV9tb2RlLAoJCXN0cnVjdCBpbnN0YW5jZV9jZmcgKmNmZyk7CmludCB0aTgxeHhfaGRtaV9jb3B5X21vZGVfY29uZmlnKGVudW0gdGk4MXh4aGRtaV9tb2RlIG1vZGUsCgkJc3RydWN0IGluc3RhbmNlX2NmZyAqY2ZnKTsKc3RhdGljIGludCBkZXRlcm1pbmVfcGl4ZWxfcmVwZWF0YXRpb24oc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0KTsKCgpzdGF0aWMgaW50IHRpODF4eF9oZG1pX2xpYl9yZWFkX2VkaWQodm9pZCAqaGFuZGxlLAoJCXN0cnVjdCB0aTgxeHhkaG1pX2VkaWRfcGFyYW1zICpyX3BhcmFtcywKCQl2b2lkICphcmdzKTsKc3RhdGljIGludCBnZXRfcGh5X3N0YXR1cyhzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQsCgkJc3RydWN0IHRpODF4eGhkbWlfcGh5X3N0YXR1cyAqc3RhdCk7CiNpZiAwCnN0YXRpYyBpbnQgdGk4MXh4X2hkbWlfbGliX2dldF9jZmcodm9pZCAqaGFuZGxlLAoJCXN0cnVjdCBoZG1pX2NmZ19wYXJhbXMgKmNvbmZpZywKCQl2b2lkICphcmdzKTsKI2VuZGlmCnN0YXRpYyB2b2lkIEhETUlfQVJHU19DSEVDSyh1MzIgY29uZGl0aW9uKTsKc3RhdGljIGludCB0aTgxeHhfaGRtaV9saWJfY29uZmlnKHN0cnVjdCBoZG1pX2NmZ19wYXJhbXMgKmNvbmZpZyk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKgkJCQlHbG9iYWwgVmFyaWFibGVzCQkJICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8Kc3RhdGljIHN0cnVjdCBpbnN0YW5jZV9jZmcgaGRtaV9jb25maWc7Ci8qIFBvb2wgb2YgSERNSSBvYmplY3RzICovCnN0YXRpYyBzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zIGRlZmF1bHRfY29uZmlnID0KVEk4MVhYX0hETUlfOEJJVF8xMDgwcF82MF8xNl85X0hEOwovKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gc3RhcnQgd2l0aCAqLwoKc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyBjb25maWdfMTA4MHA2MCA9IFRJODFYWF9IRE1JXzhCSVRfMTA4MHBfNjBfMTZfOV9IRDsKc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyBjb25maWdfNzIwcDYwID0gVEk4MVhYX0hETUlfOEJJVF83MjBfNjBfMTZfOV9IRDsKc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyBjb25maWdfMTA4MGk2MCA9IFRJODFYWF9IRE1JXzhCSVRfMTA4MGlfNjBfMTZfOV9IRDsKc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyBjb25maWdfMTA4MHAzMCA9IFRJODFYWF9IRE1JXzhCSVRfMTA4MHBfMzBfMTZfOV9IRDsKCnN0cnVjdCBoZG1pX3BsbF9jdHJsIGdwbGxfY3RybFtdID0gewoJezE5LCAxNDg1LCAxMCwgMHgyMDAyMTAwMX0sCgl7MTksIDc0NSwgICAxMCwgMHgyMDAyMTAwMX0KfTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qCQkJCUxvY2FsIEZ1bmN0aW9ucyAJCQkgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKI2lmbmRlZiBDT05GSUdfQVJDSF9USTgxNlgKLyogY29tbWFuZAogKiAweDA6IENvbW1hbmQgdG8gY2hhbmdlIExETyB0byBPRkYgc3RhdGUKICogMHgxOglDb21tYW5kIHRvIGNoYW5nZSBMRE8gdG8gT04gc3RhdGUKICogMHgyOglDb21tYW5kIHRvIGdvIHRvIExETyBUWE9OIFBvd2VyCiAqLwpzdGF0aWMgaW50IHdwX3BoeV9wd3JfY3RybChpbnQgd3BfcHdyX2N0cmxfYWRkciwgaW50IGNvbW1hbmQpCnsKCXZvbGF0aWxlIHUzMiByZWdfdmFsdWU7Cgl1MzIgY250ID0gMDsKCXUzMiBtYXhfY291bnQgPSAxMDAwMDsKCWludCByZXRfdmFsID0gMDsKCXN3aXRjaCAoY29tbWFuZCkKCXsKCQljYXNlIDB4MDoKCQkJcmVnX3ZhbHVlID0gX19yYXdfcmVhZGwod3BfcHdyX2N0cmxfYWRkcik7CgkJCXJlZ192YWx1ZSAmPSB+KEhETUlfV1BfUFdSX0NUUkxfUEhZX1BXUl9DTURfTUFTSyk7CgkJCV9fcmF3X3dyaXRlbChyZWdfdmFsdWUsIHdwX3B3cl9jdHJsX2FkZHIpOwoJCQljbnQgPSAwOwoJCQlkbwoJCQl7CgkJCQlyZWdfdmFsdWUgPSBfX3Jhd19yZWFkbCh3cF9wd3JfY3RybF9hZGRyKTsKCQkJCXJlZ192YWx1ZSAmPSBIRE1JX1dQX1BXUl9DVFJMX1BIWV9QV1JfU1RBVFVTX01BU0s7CgkJCQl1ZGVsYXkoMTApOwoJCQkJY250Kys7CgkJCX13aGlsZShyZWdfdmFsdWUgIT0gMCAmJiAgKGNudCA8IG1heF9jb3VudCkpOwoJCQlpZiAocmVnX3ZhbHVlICE9IDApCgkJCXsKCQkJCXJldF92YWwgPSAtMTsKCQkJfQoJCQlicmVhazsKCQljYXNlIDB4MToKCQkJcmVnX3ZhbHVlID0gX19yYXdfcmVhZGwod3BfcHdyX2N0cmxfYWRkcik7CgkJCXJlZ192YWx1ZSAmPSB+KEhETUlfV1BfUFdSX0NUUkxfUEhZX1BXUl9DTURfTUFTSyk7CgkJCXJlZ192YWx1ZSB8PSAweDEgPDwgSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX0NNRF9TSElGVDsKCQkJX19yYXdfd3JpdGVsKHJlZ192YWx1ZSwgd3BfcHdyX2N0cmxfYWRkcik7CgkJCWNudCA9IDA7CgkJCWRvCgkJCXsKCQkJCXJlZ192YWx1ZSA9IF9fcmF3X3JlYWRsKHdwX3B3cl9jdHJsX2FkZHIpOwoJCQkJcmVnX3ZhbHVlICY9IEhETUlfV1BfUFdSX0NUUkxfUEhZX1BXUl9TVEFUVVNfTUFTSzsKCQkJCXVkZWxheSgxMCk7CgkJCQljbnQrKzsKCQkJfXdoaWxlKChyZWdfdmFsdWUgPj4gSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX1NUQVRVU19TSElGVCkgIT0gMHgxICYmCgkJCQkJKGNudCA8IG1heF9jb3VudCkpOwoJCQlpZiAoKHJlZ192YWx1ZSAgPj4gSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX1NUQVRVU19TSElGVCkgIT0gMHgxKQoJCQl7CgkJCQlyZXRfdmFsID0gLTE7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAgMHgyOgoJCQlyZWdfdmFsdWUgPSBfX3Jhd19yZWFkbCh3cF9wd3JfY3RybF9hZGRyKTsKCQkJcmVnX3ZhbHVlICY9IH4oSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX0NNRF9NQVNLKTsKCQkJcmVnX3ZhbHVlIHw9IDB4MiA8PCBIRE1JX1dQX1BXUl9DVFJMX1BIWV9QV1JfQ01EX1NISUZUOwoJCQlfX3Jhd193cml0ZWwocmVnX3ZhbHVlLCB3cF9wd3JfY3RybF9hZGRyKTsKCQkJY250ID0gMDsKCQkJZG8KCQkJewoJCQkJcmVnX3ZhbHVlID0gX19yYXdfcmVhZGwod3BfcHdyX2N0cmxfYWRkcik7CgkJCQlyZWdfdmFsdWUgJj0gSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX1NUQVRVU19NQVNLOwoJCQkJdWRlbGF5KDEwKTsKCQkJCWNudCsrOwoJCQl9d2hpbGUoKHJlZ192YWx1ZSAgPj4gSERNSV9XUF9QV1JfQ1RSTF9QSFlfUFdSX1NUQVRVU19TSElGVCkgIT0gMHgyICYmICAoY250IDwgbWF4X2NvdW50KSk7CgkJCWlmICgocmVnX3ZhbHVlID4+IEhETUlfV1BfUFdSX0NUUkxfUEhZX1BXUl9TVEFUVVNfU0hJRlQpICE9IDB4MikKCQkJewoJCQkJcmV0X3ZhbCA9IC0xOwoJCQl9CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldF92YWwgPSAtMTsKCX0KCXJldHVybiByZXRfdmFsOwp9CgovKiBDb21tYW5kCiAqIDB4MDogQ29tbWFuZCB0byBjaGFuZ2UgdG8gT0ZGIHN0YXRlCiAqIDB4MTogQ29tbWFuZCB0byBjaGFuZ2UgdG8gT04gc3RhdGUgZm9yICBQTEwgb25seSAoSFNESVZJU0VSIGlzIE9GRikKICogMHgyOiBDb21tYW5kIHRvIGNoYW5nZSB0byBPTiBzdGF0ZSBmb3IgYm90aCBQTEwgYW5kIEhTRElWSVNFUgogKiAweDM6IENvbW1hbmQgdG8gY2hhbmdlIHRvIE9OIHN0YXRlIGZvciBib3RoIFBMTCBhbmQgSFNESVZJU0VSCiAobm8gY2xvY2sgb3V0cHV0IHRvIHRoZSBEU0kgY29tcGxleCBJTykKICovCnN0YXRpYyBpbnQgd3BfcGxsX3B3cl9jdHJsKGludCB3cF9wd3JfY3RybF9hZGRyLCBpbnQgY29tbWFuZCkKewoJdm9sYXRpbGUgdTMyIHJlZ192YWx1ZTsKCXUzMiBjbnQgPSAwOwoJdTMyIG1heF9jb3VudCA9IDEwMDAwOwoJaW50IHJldF92YWwgPSAwOwoJc3dpdGNoIChjb21tYW5kKQoJewoJCWNhc2UgMHgwOgoJCQlyZWdfdmFsdWUgPSBfX3Jhd19yZWFkbCh3cF9wd3JfY3RybF9hZGRyKTsKCQkJcmVnX3ZhbHVlICY9IH4oSERNSV9XUF9QV1JfQ1RSTF9QTExfUFdSX0NNRF9NQVNLKTsKCQkJX19yYXdfd3JpdGVsKHJlZ192YWx1ZSwgd3BfcHdyX2N0cmxfYWRkcik7CgkJCWNudCA9IDA7CgkJCWRvCgkJCXsKCQkJCXJlZ192YWx1ZSA9IF9fcmF3X3JlYWRsKHdwX3B3cl9jdHJsX2FkZHIpOwoJCQkJcmVnX3ZhbHVlICY9IEhETUlfV1BfUFdSX0NUUkxfUExMX1BXUl9TVEFUVVNfTUFTSzsKCQkJCXVkZWxheSgxMCk7CgkJCQljbnQrKzsKCQkJfXdoaWxlKHJlZ192YWx1ZSAhPSAwICYmICAoY250IDwgbWF4X2NvdW50KSk7CgkJCWlmIChyZWdfdmFsdWUgIT0gMCkKCQkJewoJCQkJcmV0X3ZhbCA9IC0xOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgMHgxOgoJCQlyZWdfdmFsdWUgPSBfX3Jhd19yZWFkbCh3cF9wd3JfY3RybF9hZGRyKTsKCQkJcmVnX3ZhbHVlICY9IH4oSERNSV9XUF9QV1JfQ1RSTF9QTExfUFdSX0NNRF9NQVNLKTsKCQkJcmVnX3ZhbHVlIHw9IDB4MSA8PCBIRE1JX1dQX1BXUl9DVFJMX1BMTF9QV1JfQ01EX1NISUZUOwoJCQlfX3Jhd193cml0ZWwocmVnX3ZhbHVlLCB3cF9wd3JfY3RybF9hZGRyKTsKCQkJY250ID0gMDsKCQkJZG8KCQkJewoJCQkJcmVnX3ZhbHVlID0gX19yYXdfcmVhZGwod3BfcHdyX2N0cmxfYWRkcik7CgkJCQlyZWdfdmFsdWUgJj0gSERNSV9XUF9QV1JfQ1RSTF9QTExfUFdSX1NUQVRVU19NQVNLOwoJCQkJdWRlbGF5KDEwKTsKCQkJCWNudCsrOwoJCQl9d2hpbGUocmVnX3ZhbHVlICE9IDB4MSAmJiAgKGNudCA8IG1heF9jb3VudCkpOwoJCQlpZiAocmVnX3ZhbHVlICE9IDB4MSkKCQkJewoJCQkJcmV0X3ZhbCA9IC0xOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgIDB4MjoKCQkJcmVnX3ZhbHVlID0gX19yYXdfcmVhZGwod3BfcHdyX2N0cmxfYWRkcik7CgkJCXJlZ192YWx1ZSAmPSB+KEhETUlfV1BfUFdSX0NUUkxfUExMX1BXUl9DTURfTUFTSyk7CgkJCXJlZ192YWx1ZSB8PSAweDIgPDwgSERNSV9XUF9QV1JfQ1RSTF9QTExfUFdSX0NNRF9TSElGVDsKCQkJX19yYXdfd3JpdGVsKHJlZ192YWx1ZSwgd3BfcHdyX2N0cmxfYWRkcik7CgkJCWNudCA9IDA7CgkJCWRvCgkJCXsKCQkJCXJlZ192YWx1ZSA9IF9fcmF3X3JlYWRsKHdwX3B3cl9jdHJsX2FkZHIpOwoJCQkJcmVnX3ZhbHVlICY9IEhETUlfV1BfUFdSX0NUUkxfUExMX1BXUl9TVEFUVVNfTUFTSzsKCQkJCXVkZWxheSgxMCk7CgkJCQljbnQrKzsKCQkJfXdoaWxlKHJlZ192YWx1ZSAhPSAweDIgJiYgIChjbnQgPCBtYXhfY291bnQpKTsKCQkJaWYgKHJlZ192YWx1ZSAhPSAweDIpCgkJCXsKCQkJCXJldF92YWwgPSAtMTsKCQkJfQoJCQlicmVhazsKCQljYXNlICAweDM6CgkJCXJlZ192YWx1ZSA9IF9fcmF3X3JlYWRsKHdwX3B3cl9jdHJsX2FkZHIpOwoJCQlyZWdfdmFsdWUgJj0gfihIRE1JX1dQX1BXUl9DVFJMX1BMTF9QV1JfQ01EX01BU0spOwoJCQlyZWdfdmFsdWUgfD0gMHgzIDw8IEhETUlfV1BfUFdSX0NUUkxfUExMX1BXUl9DTURfU0hJRlQ7CgkJCV9fcmF3X3dyaXRlbChyZWdfdmFsdWUsIHdwX3B3cl9jdHJsX2FkZHIpOwoJCQljbnQgPSAwOwoJCQlkbwoJCQl7CgkJCQlyZWdfdmFsdWUgPSBfX3Jhd19yZWFkbCh3cF9wd3JfY3RybF9hZGRyKTsKCQkJCXJlZ192YWx1ZSAmPSBIRE1JX1dQX1BXUl9DVFJMX1BMTF9QV1JfU1RBVFVTX01BU0s7CgkJCQl1ZGVsYXkoMTApOwoJCQkJY250Kys7CgkJCX13aGlsZShyZWdfdmFsdWUgIT0gMHgzICYmICAoY250IDwgbWF4X2NvdW50KSk7CgkJCWlmIChyZWdfdmFsdWUgIT0gMHgzKQoJCQl7CgkJCQlyZXRfdmFsID0gLTE7CgkJCX0KCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCXJldF92YWwgPSAtMTsKCX0KCXJldHVybiByZXRfdmFsOwp9CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BUkNIX1RJODE2WAovKgogKgkgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB3aGVuIGluaXRpYWxpemluZyBvcgogKgkgICB3aGVuIHJlLWNvbmZpZ3VyaW5nLiBBZnRlciByZS1jb25maWd1cmF0aW9uIGl0cyByZWNvbWVuZGVkIHRvIHJlc2V0IHRoZQogKgkgICBjb3JlIGFuZCB3cmFwcGVyLiBUbyBzdGFiaWxpemUgdGhlIGNsb2NrcywgaXQgcmVjb21lbmRlZCB0byB3YWl0IGZvciBhCiAqCSAgIHBlcmlvZCBvZiB0aW1lLgogKi8Kc3RhdGljIGludCBjb25maWd1cmVfcGh5KHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCkKewoJaW50IHJ0bl92YWx1ZSA9IDB4MDsKCWludCBwaHlfYmFzZTsKCXZvbGF0aWxlIHUzMiB0ZW1wOwoKCVRIREJHKCI+Pj4+Y29uZmlndXJlX3BoeVxuIik7CgoJcGh5X2Jhc2UgPSBpbnN0X2NvbnRleHQtPnBoeV9iYXNlX2FkZHI7CgkvKiBTdGVwcwoJICogMC4gUG93ZXIgdXAgaWYgcG93ZXJlZCBkb3duCgkgKiAxLiBEZXRlcm1pbmUgdGhlIFRDTEsgYmFzZWQgaW4gRGVlcCBjb2xvciBtb2RlIChEaXRoZXIgbW9kZSBpcyB1c2VkCgkgKgkgIHRvIGdldCBkZXB0aCBvZiB0aGUgY29sb3IpIGFuZCBQaXhlbCByZXBlYXRhdGlvbiAoZGVwZW5kcyBvbiBkZWVwCgkgKgkgIGNvbG9yIC8gcmVzb2x1dGlvbiBhbmQgYXVkaW8pLiBUdXJuIE9GRiBCSVNUIHBhdHRlcm4gZ2VuZXJhdG9yCgkgKiAyLiBUdXJuIE9GRiBCSVNUIGFuZCBEVkkgRW5jb2RlcgoJICogMy4gQ29uZmlndXJlIHRoZSBzb3VyY2UgdGVybWluYXRpb24gZGV0ZXJtaW5hdGlvbiAtIHdlIHdvdWxkIHJlcXVpcmUKCSAqCSAgd2hlbiB0aGUgc2luayB0ZXJtaW5hdGVzIHRoZSBzb3VyY2UgLSByZWNvbWVuZGVkIGJ5IEhETUkgU3BlYyAxLjNBCgkgKgkgIHdoZW4gb3BlcmF0aW5nIGhpZ2VyIGZyZXF1ZW5jaWVzCgkgKiA0LiBFbmFibGUgdGhlIFBIWQoJICovCgl0ZW1wID0gX19yYXdfcmVhZGwoKHBoeV9iYXNlICsgUEhZX1RNRFNfQ05UTDNfT0ZGU0VUKSk7CglpZiAoKHRlbXAgJiBIRE1JX1BIWV9UTURTX0NOVEwzX1BEQl9NQVNLKSAhPQoJCQlIRE1JX1BIWV9UTURTX0NOVEwzX1BEQl9NQVNLKSB7CgkJdGVtcCB8PSBIRE1JX1BIWV9UTURTX0NOVEwzX1BEQl9NQVNLOwoJCV9fcmF3X3dyaXRlbCh0ZW1wLCAocGh5X2Jhc2UgKyBQSFlfVE1EU19DTlRMM19PRkZTRVQpKTsKCX0KCS8qIEJJU1QgUGF0dGVybiBnZW5lcmF0b3IgaXMgZGlzYWJsZWQgLSBsZWF2ZSBpdCBhdCB0aGF0ICovCgl0ZW1wID0gX19yYXdfcmVhZGwoKHBoeV9iYXNlICsgUEhZX1RNRFNfQ05UTDNfT0ZGU0VUKSk7Cgl0ZW1wICY9ICh+KChIRE1JX1BIWV9UTURTX0NOVEwzX0RQQ09MT1JfQ1RMX01BU0spIHwKCQkJCShIRE1JX1BIWV9UTURTX0NOVEwzX0NMS01VTFRfQ1RMX01BU0spIHwKCQkJCShIRE1JX1BIWV9UTURTX0NOVEwzX0JJU1RfU0VMX01BU0spKSk7CgoJLyogU3RlcCAxLjEgLSBPdXRwdXQgd2lkdGggb2YgdGhlIGRpdGhlciBtb2R1bGUgaW4gY29yZSwgZGV0ZXJtaW5lcwoJICoJCQkgIGRlZXAgY29sb3Igb3Igbm90CgkgKi8KCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy5jb3JlX3BhdGhfY29uZmlnLm91dHB1dF93aWR0aCA9PQoJCQloZG1pXzEwX2JpdHNfY2hhbl93aWR0aCkgewoJCXRlbXAgfD0gKEhETUlfUEhZX1RNRFNfQ05UTDNfRFBDT0xPUl9DVExfMTBCSVRDSEFOTkVMIDw8CgkJCQlIRE1JX1BIWV9UTURTX0NOVEwzX0RQQ09MT1JfQ1RMX1NISUZUKTsKCgl9IGVsc2UgaWYgKGluc3RfY29udGV4dC0+Y29uZmlnLmNvcmVfcGF0aF9jb25maWcub3V0cHV0X3dpZHRoID09CgkJCWhkbWlfOF9iaXRzX2NoYW5fd2lkdGgpIHsKCQl0ZW1wIHw9IChIRE1JX1BIWV9UTURTX0NOVEwzX0RQQ09MT1JfQ1RMX05PIDw8CgkJCQlIRE1JX1BIWV9UTURTX0NOVEwzX0RQQ09MT1JfQ1RMX1NISUZUKTsKCX0gZWxzZSB7CgkJdGVtcCB8PSAoSERNSV9QSFlfVE1EU19DTlRMM19EUENPTE9SX0NUTF8xMkJJVENIQU5ORUwgPDwKCQkJCUhETUlfUEhZX1RNRFNfQ05UTDNfRFBDT0xPUl9DVExfU0hJRlQpOwoJfQoKCXJ0bl92YWx1ZSA9IGRldGVybWluZV9waXhlbF9yZXBlYXRhdGlvbihpbnN0X2NvbnRleHQpOwoJaWYgKHJ0bl92YWx1ZSA9PSBIRE1JX1BJWEVMX1JFUExFQ0FURURfT05DRSkgewoJCXRlbXAgfD0gKEhETUlfUEhZX1RNRFNfQ05UTDNfQ0xLTVVMVF9DVExfMl8wWCA8PAoJCQkJSERNSV9QSFlfVE1EU19DTlRMM19DTEtNVUxUX0NUTF9TSElGVCk7Cgl9IGVsc2UgaWYgKHJ0bl92YWx1ZSA9PSBIRE1JX1BJWEVMX1JFUExFQ0FURURfRk9VUl9USU1FUykgewoJCXRlbXAgfD0gKEhETUlfUEhZX1RNRFNfQ05UTDNfQ0xLTVVMVF9DVExfNF8wWCA8PAoJCQkJSERNSV9QSFlfVE1EU19DTlRMM19DTEtNVUxUX0NUTF9TSElGVCk7Cgl9IGVsc2UgaWYgKHJ0bl92YWx1ZSA9PSAweDApIHsKCQl0ZW1wIHw9IChIRE1JX1BIWV9UTURTX0NOVEwzX0NMS01VTFRfQ1RMXzFfMFggPDwKCQkJCUhETUlfUEhZX1RNRFNfQ05UTDNfQ0xLTVVMVF9DVExfU0hJRlQpOwoJfSBlbHNlIHsKCQlUSERCRygiQ291bGQgbm90IGNhbGMgcGl4ZWwgcmVwZWF0YXRpb25cbiIpOwoJCVRIREJHKCJ0aGF0IHdvdWxkIGJlIHJlcXVpcmVkLlxuIik7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCXJ0bl92YWx1ZSA9IDB4MDsKCV9fcmF3X3dyaXRlbCh0ZW1wLCAocGh5X2Jhc2UgKyBQSFlfVE1EU19DTlRMM19PRkZTRVQpKTsKCgl0ZW1wID0gX19yYXdfcmVhZGwoKHBoeV9iYXNlICsgUEhZX0JJU1RfQ05UTF9PRkZTRVQpKTsKCXRlbXAgJj0gfkhETUlfUEhZX0JJU1RfQ05UTF9CSVNUX0VOX01BU0s7Cgl0ZW1wIHw9IEhETUlfUEhZX0JJU1RfQ05UTF9FTkNfQllQX01BU0s7CglfX3Jhd193cml0ZWwodGVtcCwgKHBoeV9iYXNlICsgUEhZX0JJU1RfQ05UTF9PRkZTRVQpKTsKCgkvKiBTaW5jZSB0aGUgMTBiaXQgZW5jb2RlIGlzIGRvbmUgYnkgdGhlIGNvcmUsIHdlIHdvdWxkIHJlcXVpcmUgdG8KCSAgIGRpc2FibGUgMTBiaXQgZW5jb2RlIGluIHRoZSBQSFkuIERvIFNvICovCglfX3Jhd193cml0ZWwoMHhFMCwgKHBoeV9iYXNlICsgUEhZX1RNRFNfQ05UTDlfT0ZGU0VUKSk7CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKiBQSFkgQklTVCBUZXN0IEAgaGFsZiBjbG9jayByYXRlICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBURVNUX1BIWV9TRU5EX09VVF8weEFBX0FUX0hBTEZfQ0xPQ0tfUkFURV9PTl9BTExfREFUQV9MSU5FUwoJX19yYXdfd3JpdGVsKDB4NDAsIChwaHlfYmFzZSArIFBIWV9CSVNUX0NOVExfT0ZGU0VUKSk7CglfX3Jhd193cml0ZWwoMHhFOSwgKHBoeV9iYXNlICsgUEhZX1RNRFNfQ05UTDNfT0ZGU0VUKSk7CglfX3Jhd193cml0ZWwoMHgwMCwgKHBoeV9iYXNlICsgUEhZX0JJU1RfUEFUVEVSTl9PRkZTRVQpKTsKCS8qIFByb2dyYW0gdGhlIGluc3RydWN0aW9uLCBwYXR0ZXJuLCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwoJX19yYXdfd3JpdGVsKDB4ODEsIChwaHlfYmFzZSArIFBIWV9CSVNUX0lOU1QwX09GRlNFVCkpOwoJX19yYXdfd3JpdGVsKDB4MDAsIChwaHlfYmFzZSArIFBIWV9CSVNUX0NPTkYwX09GRlNFVCkpOwoJX19yYXdfd3JpdGVsKDB4MjAsIChwaHlfYmFzZSArIFBIWV9CSVNUX0lOU1QxX09GRlNFVCkpOwoJdGVtcCA9IDB4RkY7CgkvKiBXYWl0IGZvciBmZXcgY2xvY2tzIChzYXkgMjAgVE1EUyBjbG9ja3MpIHdvdWxkIHJlcXVpcmUgdGhpcy4gKi8KCXdoaWxlICh0ZW1wKQoJCXRlbXAtLTsKCV9fcmF3X3dyaXRlbCgweDQxLCAocGh5X2Jhc2UgKyBQSFlfQklTVF9DTlRMX09GRlNFVCkpOwojZW5kaWYJLyogVEVTVF9QSFlfU0VORF9PVVRfMHhBQV9BVF9IQUxGX0NMT0NLX1JBVEVfT05fQUxMX0RBVEFfTElORVMgKi8KCS8qKioqKioqKioqKioqKioqKioqKioqKipQSFkgQklTVCBUZXN0IEAgaGFsZiBjbG9jayByYXRlKioqKioqKioqKioqKioqKioqKioqKiovCgoJLyogU3RlcCAzIGFuZCA0ICovCgl0ZW1wID0gX19yYXdfcmVhZGwoKHBoeV9iYXNlICsgUEhZX1RNRFNfQ05UTDJfT0ZGU0VUKSk7Cgl0ZW1wIHw9CgkJKEhETUlfUEhZX1RNRFNfQ05UTDJfVEVSTV9FTl9NQVNLIHwKCQkgSERNSV9QSFlfVE1EU19DTlRMMl9PRV9NQVNLKTsKCV9fcmF3X3dyaXRlbCh0ZW1wLCAocGh5X2Jhc2UgKyBQSFlfVE1EU19DTlRMMl9PRkZTRVQpKTsKCmV4aXRfdGhpc19mdW5jOgoJVEhEQkcoImNvbmZpZ3VyZV9waHk8PDw8Iik7CglyZXR1cm4gKHJ0bl92YWx1ZSk7Cn0KI2Vsc2UKc3RhdGljIGludCBjb25maWd1cmVfcGh5KHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCkKewoJaW50IHJ0bl92YWx1ZSA9IDB4MDsKCWludCBwaHlfYmFzZSwgd3BfYmFzZTsKCXZvbGF0aWxlIHUzMiB0ZW1wOwoJaW50IGNtZCwgY291bnQ7CgoJVEhEQkcoIj4+Pj5jb25maWd1cmVfcGh5XG4iKTsKCgkvKiBTdGVwcwoJICogTERPT24gYW5kIFRYIFBvd2VyIE9OCgkgKiBTZXQgdGhlIFRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIHBpeGVsIGNsb2NrIHNldHRpbmcuCgkgKiBTZXQgdGhlIGRpZ2l0YWwgY29udHJvbCByZWdpc3RlcgoJICogU2V0IHRoZSBwb3dlciBjb250cm9sCgkgKiBTZXQgdGhlIHBhZCBjb250cm9sIHJlZ2lzdGVyCgkgKiBEaXNhYmxlIFRyaW0gYW5kIFRlc3QgQ29udHJvbAoJICogQW5hbG9nIGludGVyZmFjZSBDb250cm9sCgkgKiBEaWdpdGFsIGludGVyZmFjZSBjb250cm9sCgkgKiBkaXNhYmxlIGJpc3QgdGVzdC4KCSAqLwoJcGh5X2Jhc2UgPSBpbnN0X2NvbnRleHQtPnBoeV9iYXNlX2FkZHI7Cgl3cF9iYXNlID0gaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHI7CgoJLyogUG93ZXIgb24gdGhlIFBMTCBhbmQgSFNEaXZpZGVyICovCgljbWQgPSAweDI7CglydG5fdmFsdWUgPSB3cF9wbGxfcHdyX2N0cmwod3BfYmFzZSArIEhETUlfV1BfUFdSX0NUUkxfT0ZGU0VULCBjbWQpOwoJaWYgKHJ0bl92YWx1ZSkKCXsKCQlydG5fdmFsdWUgPSAtMTsKCQlnb3RvIGV4aXQ7Cgl9CgkvKiBjaGFuZ2UgTERPIHRvIG9uIHN0YXRlICovCgljbWQgPSAxOwoJcnRuX3ZhbHVlID0gd3BfcGh5X3B3cl9jdHJsKHdwX2Jhc2UgKyBIRE1JX1dQX1BXUl9DVFJMX09GRlNFVCwgY21kKTsKCWlmIChydG5fdmFsdWUpCgl7CgkJcnRuX3ZhbHVlID0gLTE7CgkJZ290byBleGl0OwoJfQoJLyogVFhQb3dlciBPTiAqLwoJY21kID0gMjsKCXJ0bl92YWx1ZSA9IHdwX3BoeV9wd3JfY3RybCh3cF9iYXNlICsgSERNSV9XUF9QV1JfQ1RSTF9PRkZTRVQsIGNtZCk7CglpZiAocnRuX3ZhbHVlKQoJewoJCXJ0bl92YWx1ZSA9IC0xOwoJCWdvdG8gZXhpdDsKCX0KCS8qIHJlYWQgYWRkcmVzcyAwIGluIG9yZGVyIHRvIGdldCB0aGUgU0NQcmVzZXQgZG9uZSBjb21wbGV0ZWQgKi8KCS8qIER1bW15IGFjY2VzcyBwZXJmb3JtZWQgdG8gc29sdmUgcmVzZXRkb25lIGlzc3VlICovCglfX3Jhd19yZWFkbChwaHlfYmFzZSArIEhETUlfUEhZX1RYX0NUUkxfT0ZGKTsKCgkvKiBUWCBDb250cm9sIGJpdCAzMCBzZXQgYWNjb3JkaW5nIHRvIHBpeGVsIGNsb2NrIGZyZXF1ZW5jaWVzKi8KCXRlbXAgPSBfX3Jhd19yZWFkbChwaHlfYmFzZSArIEhETUlfUEhZX1RYX0NUUkxfT0ZGKTsKCXN3aXRjaCAoaW5zdF9jb250ZXh0LT5jb25maWcuZGlzcGxheV9tb2RlKQoJewoJCWNhc2UgaGRtaV8xMDgwUF8zMF9tb2RlOgoJCWNhc2UgaGRtaV83MjBQXzYwX21vZGU6CgkJY2FzZSBoZG1pXzEwODBJXzYwX21vZGU6CgkJCXRlbXAgfD0gMHgxIDw8IDMwOwoJCQlicmVhazsKCQljYXNlIGhkbWlfMTA4MFBfNjBfbW9kZToKCQkJdGVtcCB8PSAweDIgPDwgMzA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldHVybiAtMTsKCX0KCS8qIE5vdCBwcm9ncmFtbWVkIGluIE9NQTQgKi8KI2lmIDAKCS8qIEVuYWJsZSBkZS1lbXBoYXNpcyBvbiBhbGwgdGhlIGxpbmtzIEQwLCBEMSwgRDIgYW5kIENMSyAqLwoJdGVtcCB8PSAweDEgPDwgMjc7Cgl0ZW1wIHw9IDB4MSA8PCAyNjsKCXRlbXAgfD0gMHgxIDw8IDI1OwoJdGVtcCB8PSAweDEgPDwgMjQ7CgkvKiBTZXQgdGhlIGRlZmF1bHQgZGUtZW1waGFzaXMgdmFsdWUgZm9yIGFsbCB0aGUgbGlua3MKCSAqIFRPRE86IEdldCB0aGUgcHJvcGVyIGRlLWVtcGhhc2lzIHZhbHVlCgkgKi8KCXRlbXAgfD0gSERNSV9QSFlfREVGX0RFX0VNUEhBU0lTX1ZBTCA8PCAyMTsKCXRlbXAgfD0gSERNSV9QSFlfREVGX0RFX0VNUEhBU0lTX1ZBTCA8PCAxODsKCXRlbXAgfD0gSERNSV9QSFlfREVGX0RFX0VNUEhBU0lTX1ZBTCA8PCAxNTsKCXRlbXAgfD0gSERNSV9QSFlfREVGX0RFX0VNUEhBU0lTX1ZBTCA8PCAxMjsKCS8qIENvbmZpZ3VyZSB0aGUgc2xvdyBlZGdlIGZvciB0aGUgbm9ybWFsIHNldHRpbmcgKi8KCXRlbXAgfD0gMHgwIDw8IDEwOwoJdGVtcCB8PSAweDAgPDwgODsKCXRlbXAgfD0gMHgwIDw8IDY7Cgl0ZW1wIHw9IDB4MCA8PCA0OwoJLyogU2V0IHRoZSBUTURTIGxldmVsIGZvciBub3JtYWwgSS9PIG9mIDMuM1YgKi8KCXRlbXAgfD0gMHgwIDw8IDM7CgkvKiBOb21pbmFsIGN1cnJlbnQgb2YgMTBtYSB1c2VkIGZvciBzaWduYWxsaW5nICovCgl0ZW1wIHw9IDB4MCA8PCAxOwojZW5kaWYKCV9fcmF3X3dyaXRlbCh0ZW1wLCBwaHlfYmFzZSArIEhETUlfUEhZX1RYX0NUUkxfT0ZGKTsKCgkvKiBBY2NvcmRpbmcgdG8gT01BUDQgKi8KCS8qIFBvd2VyIENvbnRyb2wgKi8KCXRlbXAgPSBfX3Jhd19yZWFkbChwaHlfYmFzZSArIEhETUlfUEhZX1BXUl9DVFJMX09GRik7CgkvKiBzZXR1cCBtYXggTERPIHZvbHRhZ2UgKi8KCXRlbXAgfD0gSERNSV9QSFlfREVGX0xET19WT0xUQUdFX1ZBTCA8PCAwOwoJX19yYXdfd3JpdGVsKHRlbXAsIHBoeV9iYXNlICsgSERNSV9QSFlfUFdSX0NUUkxfT0ZGKTsKCgkvKiBQYWQgY29uZmlndXJhdGlvbiBDb250cm9sICovCgl0ZW1wID0gX19yYXdfcmVhZGwocGh5X2Jhc2UgKyBIRE1JX1BIWV9QQURfQ0ZHX0NUUkxfT0ZGKTsKCS8qIE5vcm1hbCBwb2xhcml0eSBmb3IgYWxsIHRoZSBsaW5rcyAqLwoJdGVtcCB8PSAweDEgPDwgMzE7Cgl0ZW1wIHw9IDB4MCA8PCAzMDsKCXRlbXAgfD0gMHgwIDw8IDI5OwoJdGVtcCB8PSAweDAgPDwgMjg7Cgl0ZW1wIHw9IDB4MCA8PCAyNzsKCgkvKiBDaGFubmVsIGFzc2lnbmVtZW50IGlzIDEwMTAxIJYgRDItIEQxIJZEMC1DTEsgKi8KCXRlbXAgfD0gIDB4MjEgPDwgMjI7CglfX3Jhd193cml0ZWwodGVtcCwgcGh5X2Jhc2UgKyBIRE1JX1BIWV9QQURfQ0ZHX0NUUkxfT0ZGKTsKCgkvKiBEaWdpdGFsIGNvbnRyb2wgKi8KCXRlbXAgPSBfX3Jhd19yZWFkbChwaHlfYmFzZSArIEhETUlfUEhZX0RJR0lUQUxfQ1RSTF9PRkYpOzsKCS8qIFVzZSBiaXQgMzAgZnJvbSB0aGlzIHJlZ2lzdGVyIGFzIHRoZSBlbmFibGUgc2lnbmFsIGZvciB0aGUgVE1EUyAqLwoJdGVtcCB8PSAxIDw8IDMxOwoJLyogRW5hYmxlIFRNRFMgc2lnbmFsLiBUT0RPKi8KCXRlbXAgfD0gMSA8PCAzMDsKCS8qIFVzZSAyOCBwaW4gYXMgdGhlIFRYIHZhbGlkIGZyb20gdGhpcyByZWdpc3RlciAqLwoJdGVtcCB8PSAxICA8PCAyOTsKCS8qIFR4IFZhbGlkIGVuYWJsZSBUT0RPKi8KCXRlbXAgfD0gMSA8PCAyODsKCV9fcmF3X3dyaXRlbCh0ZW1wLCBwaHlfYmFzZSArIEhETUlfUEhZX0RJR0lUQUxfQ1RSTF9PRkYpOwojaWYgMAoJLyogVHJpbSBhbmQgVGVzdCBDb250cm9sICovCgkvKiBUT0RPIERvbid0IHVzZSB0aGUgQmFuZGdhcCB2YWx1ZXMgKi8KCXRlbXAgfD0gMHgwIDw8IDMxOwoJLyogVE9ETyBEb250IHVzZSBjYXAgdHJpbSBzZXR0aW5ncyAqLwoJdGVtcCB8PSAweDAgPDwgMTU7CgkvKiBUT0RPIERvbnQgZW5hYmxlIHRoZSBiYW5kZ2FwIGFuZCBzd2l0Y2hlZCBjYXAgY3VycmVudCAqLwoJdGVtcCB8PSAweDAgPDwgNzsKCXRlbXAgfD0gMHgwIDw8IDY7CglfX3Jhd193cml0ZWwodGVtcCwgcGh5X2Jhc2UgKyBIRE1JX1BIWV9UUklNX1RFU1RfQ1RSTF9PRkYpOwoKCS8qIEFuYWxvZyBJbnRlcmZhY2UgY29udHJvbCAqLwoJdGVtcCA9IDA7CgkvKiBUT0RPOiBEb24ndCBwdXQgQUZFIGluIGRlYnVnIG1vZGUgKi8KCXRlbXAgfD0gMHgwIDw8IDE2OwoJLyogVE9ETzogRG9uJ3QgdXNlIHRoZSBMRE8gcHJvZyByZWdpc3RlciAqLwoJdGVtcCB8PSAweDAgPDwgMTU7CgkvKiBUT0RPOiBEb24ndCBvdmVycmlkZSB0aGUgdmFsdWUgb2YgdGhlIGFuYWxvZyBzaWduYWwgTERPUEdEKi8KCXRlbXAgfD0gMHgwIDw8IDE0OwoJLyogVE9ETzogRG9uJ3Qgb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgc2lnbmFsIEJHT04gKi8KCXRlbXAgfD0gMHgwIDw8IDEzOwoJLyogVE9ETzogRG9uJ3Qgb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgc2lnbmFsIFRYT04gKi8KCXRlbXAgfD0gMHgwIDw8IDEyOwoJLyogVE9ETzogRG9udCB1c2UgdGhlIHJlZ2lzdGVyIHRvIG92ZXJyaWRlIHRoZSBjbG9jayBsYW5lIHBvcyAqLwoJdGVtcCB8PSAweDAgPDwgMTA7CgkvKiBUT0RPOiBBbmFsb2cgY2hhcmFjdGVyaXphdGlvbiBGb3Igbm93IHB1dHRpbmcgaXQgdG8gMCovCgl0ZW1wIHw9IDB4MCA8PCAwOwoJX19yYXdfd3JpdGVsKHRlbXAsIHBoeV9iYXNlICsgSERNSV9QSFlfQU5HX0lOVF9DVFJMX09GRik7CgoJLyogRGlnaXRhbCBJbnRlcmZhY2UgQ29udHJvbCAqLwoJdGVtcCA9IDA7CgkvKiBUT0RPOiBEb24ndCB1c2UgdGhpcyByZWdpc3RlciBmb3IgZGF0YSBvdXRwdXQgKi8KCXRlbXAgfD0gMHgwIDw8IDMxOwoJX19yYXdfd3JpdGVsKHRlbXAsIHBoeV9iYXNlICsgSERNSV9QSFlfREFUQV9JTlRfQ1RSTF9PRkYpOwoKCS8qIEJJU1QgcmVnaXN0ZXIgKi8KCXRlbXAgPSAwOwoJLyogVE9ETzogRG9uJ3QgdXNlIHRoZSBMRE8gYmlzdCBjb25ydG9sICovCgl0ZW1wIHw9IDB4MCA8PCAzMTsKCS8qIFRPRE86IERvbid0IHVzZSBMQiBtb2RlICovCgl0ZW1wIHw9IDB4MCA8PCAyNzsKCS8qIFRPRE86IERvbid0IHVzZSAgdGhlIExCIExBTkUgU0VMICovCgl0ZW1wIHw9IDB4MCA8PCAyNDsKCV9fcmF3X3dyaXRlbCh0ZW1wLCBwaHlfYmFzZSArIEhETUlfUEhZX0JJU1RfT0ZGKTsKI2VuZGlmCmV4aXQ6Cgljb3VudCA9IDA7Cgl3aGlsZSAoY291bnQrKyA8IDEwMDApCgkJOwoJcmV0dXJuIHJ0bl92YWx1ZTsKfQoKI2VuZGlmCgovKgogKiBDb25maWd1cmUgdGhlIHdyYXBwZXIgd2l0aCBkZWJvdWNlIGRhdGEgcGFja2luZyBtb2RlcywgdGltbWluZwogKglwYXJhbWV0ZXJzIGlmIG9wZXJhdGluZyBhcyBhIG1hc3RlciByZXF1aXJlIHRpbW1pbmcgZ2VuZXJhdG9yIGFsc28KICovCnN0YXRpYyBpbnQgY29uZmlndXJlX3dyYXBwZXIoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0KQp7Cgl2b2xhdGlsZSB1MzIgdGVtcDsKCXUzMiB3cF9iYXNlX2FkZHIgPSAweDA7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoKCVRIREJHKCI+Pj4+Y29uZmlndXJlX3dyYXBwZXIiKTsKCUhETUlfQVJHU19DSEVDSygoaW5zdF9jb250ZXh0ICE9IE5VTEwpKTsKCgl3cF9iYXNlX2FkZHIgPSBpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkcjsKCS8qIFN0ZXAgMCAtIFR3ZWFrIGlmIHJlcXVpcmVkICovCgl0ZW1wID0gKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuZGVib3VuY2VfcmN2X2RldGVjdCA8PAoJCQkJSERNSV9XUF9ERUJPVU5DRV9SWERFVF9TSElGVCkgJgoJCQlIRE1JX1dQX0RFQk9VTkNFX1JYREVUX01BU0spOwoKCXRlbXAgfD0gKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuZGVib3VuY2VfcmN2X3NlbnMgPDwKCQkJCUhETUlfV1BfREVCT1VOQ0VfTElORTVWU0hPUlRfU0hJRlQpICYKCQkJSERNSV9XUF9ERUJPVU5DRV9MSU5FNVZTSE9SVF9NQVNLKTsKCglfX3Jhd193cml0ZWwodGVtcCwgKHdwX2Jhc2VfYWRkciArIEhETUlfV1BfREVCT1VOQ0VfT0ZGU0VUKSk7CgoJLyogRGl2aWRpbmcgdGhlIDQ4TUh6IGNsb2NrIHRvIDIgTUh6IGZvciBDRUMgYW5kIE9DUCBkaWZmZXJlbnQgZGl2aWRvciAqLwoJdGVtcCA9IF9fcmF3X3JlYWRsKHdwX2Jhc2VfYWRkciArIEhETUlfV1BfQ0xLX09GRlNFVCk7Cgl0ZW1wIHw9IDB4MDAwMDAyMTh1OwoJX19yYXdfd3JpdGVsKHRlbXAsICh3cF9iYXNlX2FkZHIgKyBIRE1JX1dQX0NMS19PRkZTRVQpKTsKCgkvKiBGb2xsb3dpbmcgc3RlcHMgb25seSBhcHBsaWNhYmxlIGZvciBhIG1hc3RlciBnZW5lcmF0aW5nIHRoZSB0aW1taW5ncwoJICAgc2lnbmFsIHRvIGNvcmUgKi8KCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuaXNfc2xhdmVfbW9kZSA9PSAweDApIHsKCQlUSERCRygiQ29uZmlndXJpbmcgYXMgTWFzdGVyIik7CgkJdGVtcCA9CgkJCSgoaW5zdF9jb250ZXh0LT5jb25maWcud3BfY29uZmlnLgoJCQkgIGhicCA8PCBIRE1JX1dQX1ZJREVPX1RJTUlOR19IX0hCUF9TSElGVCkgJgoJCQkgSERNSV9XUF9WSURFT19USU1JTkdfSF9IQlBfTUFTSyk7CgkJdGVtcCB8PQoJCQkoKGluc3RfY29udGV4dC0+Y29uZmlnLndwX2NvbmZpZy4KCQkJICBoZnAgPDwgSERNSV9XUF9WSURFT19USU1JTkdfSF9IRlBfU0hJRlQpICYKCQkJIEhETUlfV1BfVklERU9fVElNSU5HX0hfSEZQX01BU0spOwoJCXRlbXAgfD0KCQkJKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuCgkJCSAgaHN3IDw8IEhETUlfV1BfVklERU9fVElNSU5HX0hfSFNXX1NISUZUKSAmCgkJCSBIRE1JX1dQX1ZJREVPX1RJTUlOR19IX0hTV19NQVNLKTsKCgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkod3BfYmFzZV9hZGRyICsKCQkJCSBIRE1JX1dQX1ZJREVPX1RJTUlOR19IX09GRlNFVCkpOwoKCQl0ZW1wID0gKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcudmJwIDw8CgkJCQkJSERNSV9XUF9WSURFT19USU1JTkdfVl9WQlBfU0hJRlQpICYKCQkJCUhETUlfV1BfVklERU9fVElNSU5HX1ZfVkJQX01BU0spOwoJCXRlbXAgfD0gKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcudmZwIDw8CgkJCQkJSERNSV9XUF9WSURFT19USU1JTkdfVl9WRlBfU0hJRlQpICYKCQkJCUhETUlfV1BfVklERU9fVElNSU5HX1ZfVkZQX01BU0spOwoJCXRlbXAgfD0gKChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcudnN3IDw8CgkJCQkJSERNSV9XUF9WSURFT19USU1JTkdfVl9WU1dfU0hJRlQpICYKCQkJCUhETUlfV1BfVklERU9fVElNSU5HX1ZfVlNXX01BU0spOwoJCV9fcmF3X3dyaXRlbCh0ZW1wLAoJCQkJKHdwX2Jhc2VfYWRkciArCgkJCQkgSERNSV9XUF9WSURFT19USU1JTkdfVl9PRkZTRVQpKTsKCgkJdGVtcCA9IF9fcmF3X3JlYWRsCgkJCSh3cF9iYXNlX2FkZHIgKyBIRE1JX1dQX1ZJREVPX0NGR19PRkZTRVQpOwoJCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcudlN5bmNfcG9sICE9IDB4MCkgewoJCQl0ZW1wIHw9IEhETUlfV1BfVklERU9fQ0ZHX1ZTWU5DX1BPTF9NQVNLOwoJCX0gZWxzZSB7CgkJCXRlbXAgJj0gfihIRE1JX1dQX1ZJREVPX0NGR19WU1lOQ19QT0xfTUFTSyk7CgkJfQoJCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuaFN5bmNfcG9sICE9IDB4MCkgewoJCQl0ZW1wIHw9IEhETUlfV1BfVklERU9fQ0ZHX0hTWU5DX1BPTF9NQVNLOwoJCX0gZWxzZSB7CgkJCXRlbXAgJj0gfihIRE1JX1dQX1ZJREVPX0NGR19IU1lOQ19QT0xfTUFTSyk7CgkJfQoJCV9fcmF3X3dyaXRlbCh0ZW1wLAoJCQkJKHdwX2Jhc2VfYWRkciArIEhETUlfV1BfVklERU9fQ0ZHX09GRlNFVCkpOwoJfQoKCXRlbXAgPSBfX3Jhd19yZWFkbCh3cF9iYXNlX2FkZHIgKyBIRE1JX1dQX1ZJREVPX0NGR19PRkZTRVQpOwoJdGVtcCAmPSAofihIRE1JX1dQX1ZJREVPX0NGR19QQUNLSU5HX01PREVfTUFTSykpOwoJdGVtcCB8PSAoKGluc3RfY29udGV4dC0+Y29uZmlnLndwX2NvbmZpZy5wYWNrX21vZGUgPDwKCQkJCUhETUlfV1BfVklERU9fQ0ZHX1BBQ0tJTkdfTU9ERV9TSElGVCkgJgoJCQlIRE1JX1dQX1ZJREVPX0NGR19QQUNLSU5HX01PREVfTUFTSyk7CgoJLyogSW52ZXJ0IGlmIHJlcXVpcmVkIC0gZm9sbG93cyBpbnB1dCBvdGhlcndpc2UgKi8KCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuaXNfdlN5bmNfcG9sX2ludiAhPSAweDApIHsKCQl0ZW1wIHw9IEhETUlfV1BfVklERU9fQ0ZHX0NPUkVfVlNZTkNfSU5WX01BU0s7Cgl9IGVsc2UgewoJCXRlbXAgJj0gKH4oSERNSV9XUF9WSURFT19DRkdfQ09SRV9WU1lOQ19JTlZfTUFTSykpOwoJfQoJaWYgKGluc3RfY29udGV4dC0+Y29uZmlnLndwX2NvbmZpZy5pc19oU3luY19wb2xfaW52ICE9IDB4MCkgewoJCXRlbXAgfD0gSERNSV9XUF9WSURFT19DRkdfQ09SRV9IU1lOQ19JTlZfTUFTSzsKCX0gZWxzZSB7CgkJdGVtcCAmPSAofihIRE1JX1dQX1ZJREVPX0NGR19DT1JFX0hTWU5DX0lOVl9NQVNLKSk7Cgl9CgoJaWYgKGluc3RfY29udGV4dC0+aXNfaW50ZXJsYWNlZCA9PSBUUlVFKSB7CgkJdGVtcCB8PSBIRE1JX1dQX1ZJREVPX0NGR19QUk9HUkVTU0lWRV9JTlRFUkxBQ0VfTUFTSzsKCX0gZWxzZSB7CgkJdGVtcCAmPSAofihIRE1JX1dQX1ZJREVPX0NGR19QUk9HUkVTU0lWRV9JTlRFUkxBQ0VfTUFTSykpOwoJfQoKCWlmIChpbnN0X2NvbnRleHQtPmNvbmZpZy53cF9jb25maWcuaXNfc2xhdmVfbW9kZSA9PSAweDApIHsKCQl0ZW1wIHw9IChIRE1JX1dQX1ZJREVPX0NGR19NT0RFX01BU0spOwoJCXRlbXAgfD0gaW5zdF9jb250ZXh0LT5jb25maWcud3BfY29uZmlnLndpZHRoOwoJfSBlbHNlIHsKCQl0ZW1wICY9ICh+KEhETUlfV1BfVklERU9fQ0ZHX01PREVfTUFTSykpOwoJCVRIREJHKCJPcGVyYXRpbmcgYXMgc2xhdmUiKTsKCX0KCV9fcmF3X3dyaXRlbCh0ZW1wLCAod3BfYmFzZV9hZGRyICsgSERNSV9XUF9WSURFT19DRkdfT0ZGU0VUKSk7CgoJVEhEQkcoImNvbmZpZ3VyZV93cmFwcGVyPDw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgoKLyoKICogQ29uZmlndXJlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHdyYXBwZXIgYW5kIGNvcmUuCiAqCiAqIFRoZSBudW1iZXIgb2YgbGluZXMvY2hhbm5lbCBiZXR3ZWVuIGluIHRoZSBjb3JlIGFuZCB0aGUgd3JhcHBlciBpcyBub3QKICogY29uZmlndXJlYWJsZSBvcHRpb24uCiAqLwpzdGF0aWMgaW50IGNvbmZpZ3VyZV9jb3JlX2lucHV0KHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCkKewoJdm9sYXRpbGUgdTMyIHRlbXA7Cgl2b2xhdGlsZSB1MzIgY29yZV9hZGRyOwoJc3RydWN0IGhkbWlfY29yZV9pbnB1dF9jZmcgKmNmZyA9IE5VTEw7CgoJVEhEQkcoIj4+Pj5jb25maWd1cmVfY29yZV9pbnB1dCIpOwoJSERNSV9BUkdTX0NIRUNLKChpbnN0X2NvbnRleHQgIT0gTlVMTCkpOwoJY2ZnID0gJihpbnN0X2NvbnRleHQtPmNvbmZpZy5jb3JlX2NvbmZpZyk7Cgljb3JlX2FkZHIgPSBpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyOwoJLyoKCSAqIFN0ZXAgMS4gQ29uZmlndXJlIHRoZSB3aWR0aCBvZiB0aGUgaW5wdXQgYnVzLgoJICogU3RlcCAyLiBDb25maWd1cmUgdGhlIHNvdXJjZXMgZm9yIHN5bmMgc2lnbmFscwoJICoJCSAgIGlmIGhkbWlfZXh0cmFjdF9zeW5jcyAtIFZJRF9NT0RFLlNZTkNFWCA9IDEKCSAqCQkgICBpZiBoZG1pX2dlbmVyYXRlX2RlIC0gREVfQ1RSTC5ERV9HRU4gPSAxIGFuZCBkZV90b3AKCSAqCQkgICBkZV9kbHksIGV0Yy4uLgoJICoJCSAgIGlmIGhkbWlfc291cmNlX3N5bmNzIC0gU1lTX0NUUkwxLlZFTi9IRU4gPSAxCgkgKiBTdGVwIDMuIENvbmZpZ3VyZSB0aGUgZWRnZSB0byBsYXRjaCBvbi4KCSAqLwoJdGVtcCA9IF9fcmF3X3JlYWRsKGNvcmVfYWRkciArIEhETUlfQ09SRV9WSURfQUNFTl9PRkZTRVQpOwoJdGVtcCAmPSAofihIRE1JX1ZJRF9BQ0VOX1dJREVfQlVTX01BU0spKTsKCXRlbXAgfD0gKChjZmctPmRhdGFfYnVzX3dpZHRoIDw8IEhETUlfVklEX0FDRU5fV0lERV9CVVNfU0hJRlQpICYKCQkJSERNSV9WSURfQUNFTl9XSURFX0JVU19NQVNLKTsKCV9fcmF3X3dyaXRlbCh0ZW1wLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9BQ0VOX09GRlNFVCkpOwoKCXRlbXAgPSBfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfU1lTX0NUUkwxX09GRlNFVCk7Cgl0ZW1wICY9ICh+KEhETUlfU1lTX0NUUkwxX0JTRUxfTUFTSyB8IEhETUlfU1lTX0NUUkwxX0VER0VfTUFTSykpOwoJaWYgKGNmZy0+ZWRnZV9wb2wgIT0gMHgwKQoJCXRlbXAgfD0gSERNSV9TWVNfQ1RSTDFfRURHRV9NQVNLOwoKCXRlbXAgfD0gSERNSV9TWVNfQ1RSTDFfQlNFTF9NQVNLOwoJX19yYXdfd3JpdGVsKHRlbXAsIChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfU1lTX0NUUkwxX09GRlNFVCkpOwoKCWlmIChjZmctPnN5bmNfZ2VuX2NmZyA9PSBoZG1pX2V4dHJhY3Rfc3luY3MpIHsKCQl0ZW1wID0gX19yYXdfcmVhZGwoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9NT0RFX09GRlNFVCk7CgkJdGVtcCAmPSAofihIRE1JX1ZJRF9NT0RFX1NZTkNFWF9NQVNLKSk7CgkJdGVtcCB8PSBIRE1JX1ZJRF9NT0RFX1NZTkNFWF9NQVNLOwoJCV9fcmF3X3dyaXRlbCh0ZW1wLAoJCQkJKGNvcmVfYWRkciArIEhETUlfQ09SRV9WSURfTU9ERV9PRkZTRVQpKTsKCQlUSERCRygiRW1iZWRkZWQgc3luY3MgXG4iKTsKCX0gZWxzZSBpZiAoY2ZnLT5zeW5jX2dlbl9jZmcgPT0gaGRtaV9nZW5lcmF0ZV9kZSkgewoJCXRlbXAgPSBfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfREVfQ1RSTF9PRkZTRVQpOwoJCXRlbXAgJj0gKH4oSERNSV9ERV9DVFJMX0RFX0dFTl9NQVNLKSk7CgkJdGVtcCB8PSBIRE1JX0RFX0NUUkxfREVfR0VOX01BU0s7CgkJX19yYXdfd3JpdGVsKHRlbXAsIChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfREVfQ1RSTF9PRkZTRVQpKTsKCgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9ETFkgJiBIRE1JX0RFX0RMWV9ERV9ETFlfTUFTSykKCQkJCSwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9ERV9ETFlfT0ZGU0VUKSk7CgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9UT1AgJiBIRE1JX0RFX1RPUF9ERV9UT1BfTUFTSykKCQkJCSwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9ERV9UT1BfT0ZGU0VUKSk7CgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9DTlRMICYgSERNSV9ERV9DTlRMX0RFX0NOVF9NQVNLKQoJCQkJLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0RFX0NOVExfT0ZGU0VUKSk7CgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9DTlRIICYgSERNSV9ERV9DTlRIX0RFX0NOVF9NQVNLKQoJCQkJLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0RFX0NOVEhfT0ZGU0VUKSk7CgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9MSU5MICYgSERNSV9ERV9MSU5MX0RFX0xJTl9NQVNLKQoJCQkJLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0RFX0xJTkxfT0ZGU0VUKSk7CgkJX19yYXdfd3JpdGVsKChjZmctPmRlX2RlbGF5X2NmZy4KCQkJCQlERV9MSU5IICYgSERNSV9ERV9MSU5IX0RFX0xJTl9NQVNLKQoJCQkJLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0RFX0xJTkhfT0ZGU0VUKSk7CgkJVEhEQkcoIlN5bmMgYmVpbmcgZ2VuZXJhdGVkIik7Cgl9IGVsc2UgewoJCV9fcmF3X3dyaXRlbCgweDF1LCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0RFX0NUUkxfT0ZGU0VUKSk7CgkJdGVtcCA9IF9fcmF3X3JlYWRsKGNvcmVfYWRkciArIEhETUlfQ09SRV9TWVNfQ1RSTDFfT0ZGU0VUKTsKCQl0ZW1wIHw9IEhETUlfU1lTX0NUUkwxX1ZFTl9NQVNLOwoJCXRlbXAgfD0gSERNSV9TWVNfQ1RSTDFfSEVOX01BU0s7CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoY29yZV9hZGRyICsgSERNSV9DT1JFX1NZU19DVFJMMV9PRkZTRVQpKTsKCQlUSERCRygiRGVzY3JldGUgc3luY3MgYW5kIGJlaW5nIHNvdXJjZWQiKTsKCX0KCV9fcmF3X3dyaXRlbCgweDB1LCAoY29yZV9hZGRyICsgSERNSV9DT1JFX0lBREpVU1RfT0ZGU0VUKSk7CgoJVEhEQkcoImNvbmZpZ3VyZV9jb3JlX2lucHV0PDw8PCIpOwoJcmV0dXJuICgweDApOwp9CgovKgogKglDb25maWd1cmUgc3ViLWJsb2NrcwogKi8Kc3RhdGljIGludCBjb25maWd1cmVfY29yZV9kYXRhX3BhdGgoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0KQp7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJdm9sYXRpbGUgdTMyIHRlbXBWaWRBY2VuOwoJdm9sYXRpbGUgdTMyIHRlbXBWaWRNb2RlOwoJdm9sYXRpbGUgdTMyIHRlbXBWaWREaXRoZXI7Cgl2b2xhdGlsZSB1MzIgdGVtcDsKCXZvbGF0aWxlIHUzMiBjb3JlX2FkZHI7CglzdHJ1Y3QgaGRtaV9jb3JlX2RhdGFfcGF0aCAqcGF0aENmZyA9IE5VTEw7CgoJVEhEQkcoIj4+Pj5jb25maWd1cmVfY29yZV9kYXRhX3BhdGgiKTsKCUhETUlfQVJHU19DSEVDSygoaW5zdF9jb250ZXh0ICE9IE5VTEwpKTsKCWNvcmVfYWRkciA9IGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHI7CgoJdGVtcFZpZEFjZW4gPSBfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVklEX0FDRU5fT0ZGU0VUKTsKCXRlbXBWaWRNb2RlID0gX19yYXdfcmVhZGwoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9NT0RFX09GRlNFVCk7CgoJcGF0aENmZyA9ICYoaW5zdF9jb250ZXh0LT5jb25maWcuY29yZV9wYXRoX2NvbmZpZyk7Cgl0ZW1wVmlkTW9kZSAmPSAofihIRE1JX1ZJRF9NT0RFX1VQU01QX01BU0sgfAoJCQkJSERNSV9WSURfTU9ERV9DU0NfTUFTSyB8CgkJCQlIRE1JX1ZJRF9NT0RFX1JBTkdFX01BU0sgfAoJCQkJSERNSV9WSURfTU9ERV9ESVRIRVJfTUFTSykpOwoKCXRlbXBWaWRBY2VuICY9ICh+KEhETUlfVklEX0FDRU5fUkdCXzJfWUNCQ1JfTUFTSyB8CgkJCQlIRE1JX1ZJRF9BQ0VOX1JBTkdFX0NNUFNfTUFTSyB8CgkJCQlIRE1JX1ZJRF9BQ0VOX0RPV05fU01QTF9NQVNLIHwKCQkJCUhETUlfVklEX0FDRU5fUkFOR0VfQ0xJUF9NQVNLIHwKCQkJCUhETUlfVklEX0FDRU5fQ0xJUF9DU19JRF9NQVNLKSk7CglpZiAocGF0aENmZy0+dXBfc2FtcGxlcl9lbmFibGUgIT0gMHgwKQoJCXRlbXBWaWRNb2RlIHw9IEhETUlfVklEX01PREVfVVBTTVBfTUFTSzsKCglpZiAocGF0aENmZy0+Y3NjX1lDYkNyXzJfUkdCX2VuYWJsZSAhPSAweDApIHsKCQl0ZW1wVmlkTW9kZSB8PSBIRE1JX1ZJRF9NT0RFX0NTQ19NQVNLOwoJCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9jc2NfeWNiY3JfcmdiKGluc3RfY29udGV4dCk7CgkJaWYgKHJ0bl92YWx1ZSAhPSAweDApCgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9Cgl0ZW1wID0gX19yYXdfcmVhZGwoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9DVFJMX09GRlNFVCk7CglpZiAocGF0aENmZy0+Y3NjX2NvbnZlcnRfc3RhbmRhcmQgIT0gMHgwKQoJCXRlbXAgfD0gSERNSV9WSURfQ1RSTF9DU0NTRUxfTUFTSzsKCWVsc2UKCQl0ZW1wICY9ICh+KEhETUlfVklEX0NUUkxfQ1NDU0VMX01BU0spKTsKCV9fcmF3X3dyaXRlbCh0ZW1wLCAoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9DVFJMX09GRlNFVCkpOwoKCWlmIChwYXRoQ2ZnLT5yYW5nZV9leHBfUkdCX2VuYWJsZSAhPSAweDApCgkJdGVtcFZpZE1vZGUgfD0gSERNSV9WSURfTU9ERV9SQU5HRV9NQVNLOwoKCWlmIChwYXRoQ2ZnLT5kaXRoZXJfZW5hYmxlICE9IDB4MCkgewoJCXRlbXBWaWREaXRoZXIgPQoJCQlfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVklEX0RJVEhFUl9PRkZTRVQpOwoJCXRlbXBWaWRNb2RlIHw9IEhETUlfVklEX01PREVfRElUSEVSX01BU0s7CgkJdGVtcFZpZERpdGhlciAmPSAofihIRE1JX1ZJRF9ESVRIRVJfTV9EMl9NQVNLIHwKCQkJCQlIRE1JX1ZJRF9ESVRIRVJfVVAyX01BU0sgfAoJCQkJCUhETUlfVklEX0RJVEhFUl9TVFJfNDIyX0VOX01BU0sgfAoJCQkJCUhETUlfVklEX0RJVEhFUl9EX0JDX0VOX01BU0sgfAoJCQkJCUhETUlfVklEX0RJVEhFUl9EX0dDX0VOX01BU0sgfAoJCQkJCUhETUlfVklEX0RJVEhFUl9EX1JDX0VOX01BU0sgfAoJCQkJCUhETUlfVklEX0RJVEhFUl9EUkRfTUFTSykpOwoJCS8qIENvbmZpZ3VyZSBkaXRoZXJpbmcgcGFyYW1ldGVycyAqLwoJCWlmIChwYXRoQ2ZnLT5kaXRoZXJfY29uZmlnLk1fRDIgIT0gMHgwKQoJCQl0ZW1wVmlkRGl0aGVyIHw9IEhETUlfVklEX0RJVEhFUl9NX0QyX01BU0s7CgkJaWYgKHBhdGhDZmctPmRpdGhlcl9jb25maWcuVVAyICE9IDB4MCkKCQkJdGVtcFZpZERpdGhlciB8PSBIRE1JX1ZJRF9ESVRIRVJfVVAyX01BU0s7CgkJaWYgKHBhdGhDZmctPmRpdGhlcl9jb25maWcuU1RSXzQyMl9FTiAhPSAweDApCgkJCXRlbXBWaWREaXRoZXIgfD0gSERNSV9WSURfRElUSEVSX1NUUl80MjJfRU5fTUFTSzsKCQlpZiAocGF0aENmZy0+ZGl0aGVyX2NvbmZpZy5EX0JDX0VOICE9IDB4MCkKCQkJdGVtcFZpZERpdGhlciB8PSBIRE1JX1ZJRF9ESVRIRVJfRF9CQ19FTl9NQVNLOwoJCWlmIChwYXRoQ2ZnLT5kaXRoZXJfY29uZmlnLkRfR0NfRU4gIT0gMHgwKQoJCQl0ZW1wVmlkRGl0aGVyIHw9IEhETUlfVklEX0RJVEhFUl9EX0dDX0VOX01BU0s7CgkJaWYgKHBhdGhDZmctPmRpdGhlcl9jb25maWcuRF9SQ19FTiAhPSAweDApCgkJCXRlbXBWaWREaXRoZXIgfD0gSERNSV9WSURfRElUSEVSX0RfUkNfRU5fTUFTSzsKCQlpZiAocGF0aENmZy0+ZGl0aGVyX2NvbmZpZy5EUkQgIT0gMHgwKQoJCQl0ZW1wVmlkRGl0aGVyIHw9IEhETUlfVklEX0RJVEhFUl9EUkRfTUFTSzsKCQlfX3Jhd193cml0ZWwodGVtcFZpZERpdGhlciwKCQkJCShjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVklEX0RJVEhFUl9PRkZTRVQpKTsKCX0KCgl0ZW1wVmlkTW9kZSB8PQoJCSgocGF0aENmZy0+b3V0cHV0X3dpZHRoIDw8IEhETUlfVklEX01PREVfRElUSEVSX01PREVfU0hJRlQpICYKCQkgSERNSV9WSURfTU9ERV9ESVRIRVJfTU9ERV9NQVNLKTsKCV9fcmF3X3dyaXRlbCh0ZW1wVmlkTW9kZSwKCQkJKGNvcmVfYWRkciArIEhETUlfQ09SRV9WSURfTU9ERV9PRkZTRVQpKTsKCglpZiAocGF0aENmZy0+Y3NjUkdCXzJfWUNiQ3JfZW5hYmxlICE9IDB4MCkKCQl0ZW1wVmlkQWNlbiB8PSBIRE1JX1ZJRF9BQ0VOX1JHQl8yX1lDQkNSX01BU0s7CgoJaWYgKHBhdGhDZmctPnJhbmdlX2NvbXBfZW5hYmxlICE9IDB4MCkKCQl0ZW1wVmlkQWNlbiB8PSBIRE1JX1ZJRF9BQ0VOX1JBTkdFX0NNUFNfTUFTSzsKCglpZiAocGF0aENmZy0+ZG93bl9zYW1wbGVyX2VuYWJsZSAhPSAweDApCgkJdGVtcFZpZEFjZW4gfD0gSERNSV9WSURfQUNFTl9ET1dOX1NNUExfTUFTSzsKCglpZiAocGF0aENmZy0+cmFuZ2VfY2xpcF9lbmFibGUgIT0gMHgwKSB7CgkJdGVtcFZpZEFjZW4gfD0gSERNSV9WSURfQUNFTl9SQU5HRV9DTElQX01BU0s7CgkJaWYgKHBhdGhDZmctPmNsaXBfY29sb3Jfc3BhY2UgIT0gMHgwKSB7CgkJCXRlbXBWaWRBY2VuIHw9IEhETUlfVklEX0FDRU5fQ0xJUF9DU19JRF9NQVNLOwoJCX0KCX0KCV9fcmF3X3dyaXRlbCh0ZW1wVmlkQWNlbiwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9WSURfQUNFTl9PRkZTRVQpKTsKCmV4aXRfdGhpc19mdW5jOgoJVEhEQkcoImNvbmZpZ3VyZV9jb3JlX2RhdGFfcGF0aDw8PDwiKTsKCXJldHVybiAocnRuX3ZhbHVlKTsKfQoKc3RhdGljIGludCBjb25maWd1cmVfY29yZShzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpCnsKCWludCBydG5fdmFsdWUgPSAweDA7Cgl2b2xhdGlsZSB1MzIgdGVtcDsKCXZvbGF0aWxlIHUzMiBjb3JlX2FkZHI7CglUSERCRygiPj4+PmNvbmZpZ3VyZV9jb3JlIik7CglIRE1JX0FSR1NfQ0hFQ0soKGluc3RfY29udGV4dCAhPSBOVUxMKSk7Cgljb3JlX2FkZHIgPSBpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyOwoKCXRlbXAgPSBfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVEVTVF9UWENUUkxfT0ZGU0VUKTsKCXRlbXAgJj0gKH4oSERNSV9URVNUX1RYQ1RSTF9ESVZfRU5DX0JZUF9NQVNLKSk7CglfX3Jhd193cml0ZWwodGVtcCwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9URVNUX1RYQ1RSTF9PRkZTRVQpKTsKCglpZiAoaW5zdF9jb250ZXh0LT5jb25maWcudXNlX2NvcmVfY29uZmlnICE9IDB4MCkgewoJCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9jb3JlX2lucHV0KGluc3RfY29udGV4dCk7CgkJaWYgKHJ0bl92YWx1ZSAhPSAweDApCgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoaW5zdF9jb250ZXh0LT5jb25maWcudXNlX2NvcmVfcGF0aF9jb25maWcgIT0gMHgwKSB7CgkJcnRuX3ZhbHVlID0gY29uZmlndXJlX2NvcmVfZGF0YV9wYXRoKGluc3RfY29udGV4dCk7CgkJaWYgKHJ0bl92YWx1ZSAhPSAweDApCgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglydG5fdmFsdWUgPSBjb25maWd1cmVfcG9saWNpZXMoaW5zdF9jb250ZXh0KTsKCWlmIChydG5fdmFsdWUgIT0gMHgwKQoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgoJX19yYXdfd3JpdGVsKDB4MCwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9BQ1JfQ1RSTF9PRkZTRVQpKTsKCmV4aXRfdGhpc19mdW5jOgoJVEhEQkcoImNvbmZpZ3VyZV9jb3JlPDw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgpzdGF0aWMgaW50IGNvbmZpZ3VyZV9wb2xpY2llcyhzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpCnsKCWludCBydG5fdmFsdWUgPSAweDA7Cgl2b2xhdGlsZSB1MzIgdGVtcDsKCXZvbGF0aWxlIHUzMiBkaXRoZXJfbW9kZV92YWw7Cgl2b2xhdGlsZSB1MzIgY29yZV9hZGRyOwoKCVRIREJHKCI+Pj4+Y29uZmlndXJlX3BvbGljaWVzIik7CglIRE1JX0FSR1NfQ0hFQ0soKGluc3RfY29udGV4dCAhPSBOVUxMKSk7Cgljb3JlX2FkZHIgPSBpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyOwoKCXRlbXAgPSBfX3Jhd19yZWFkbChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVklEX0NUUkxfT0ZGU0VUKTsKCgkvKiBObyBwaXhlbCByZXBlYXRhdGlvbiBieSBkZWZhdWx0ICovCgl0ZW1wICY9ICh+KEhETUlfVklEX0NUUkxfSUNMS19NQVNLKSk7CgoJcnRuX3ZhbHVlID0gZGV0ZXJtaW5lX3BpeGVsX3JlcGVhdGF0aW9uKGluc3RfY29udGV4dCk7CglpZiAocnRuX3ZhbHVlID09IEhETUlfUElYRUxfUkVQTEVDQVRFRF9PTkNFKSB7CgkJdGVtcCB8PSAoKCgweDAxdSkgPDwgSERNSV9WSURfQ1RSTF9JQ0xLX1NISUZUKSAmCgkJCQlIRE1JX1ZJRF9DVFJMX0lDTEtfTUFTSyk7Cgl9IGVsc2UgaWYgKHJ0bl92YWx1ZSA9PSBIRE1JX1BJWEVMX1JFUExFQ0FURURfRk9VUl9USU1FUykgewoJCXRlbXAgfD0gSERNSV9WSURfQ1RSTF9JQ0xLX01BU0s7Cgl9IGVsc2UgaWYgKHJ0bl92YWx1ZSA9PSAweDApIHsKCQlUSERCRygiTm8gUGl4ZWwgcmVwZWF0YXRpb24gcmVxdWlyZWQiKTsKCX0gZWxzZSB7CgkJVEhEQkcoIkNvdWxkIG5vdCBkZXRlcm1pbmUgcGl4ZWwgdGhhdCB3b3VsZCBiZSByZXF1aXJlZCIpOwoJCXJ0bl92YWx1ZSA9IC1FSU5WQUwgOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglfX3Jhd193cml0ZWwodGVtcCwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9WSURfQ1RSTF9PRkZTRVQpKTsKCgoJdGVtcCA9IF9fcmF3X3JlYWRsKGNvcmVfYWRkciArIEhETUlfQ09SRV9IRE1JX0NUUkxfT0ZGU0VUKTsKCgl0ZW1wICY9CgkJKH4KCQkgKEhETUlfSERNSV9DVFJMX0RDX0VOX01BU0sgfAoJCSAgSERNSV9IRE1JX0NUUkxfUEFDS0VUX01PREVfTUFTSykpOwoKCWRpdGhlcl9tb2RlX3ZhbCA9CgkJX19yYXdfcmVhZGwoY29yZV9hZGRyICsgSERNSV9DT1JFX1ZJRF9NT0RFX09GRlNFVCk7CglkaXRoZXJfbW9kZV92YWwgPQoJCSgoZGl0aGVyX21vZGVfdmFsICYgSERNSV9WSURfTU9ERV9ESVRIRVJfTU9ERV9NQVNLKQoJCSA+PiBIRE1JX1ZJRF9NT0RFX0RJVEhFUl9NT0RFX1NISUZUKTsKCglpZiAoZGl0aGVyX21vZGVfdmFsICE9IEhETUlfVklEX01PREVfRElUSEVSX1RPXzI0X0JJVFNfTU9ERSkgewoJCXRlbXAgfD0gSERNSV9IRE1JX0NUUkxfRENfRU5fTUFTSzsKCQlUSERCRygiRGVlcCBjb2xvciBtb2RlIik7Cgl9Cgl0ZW1wIHw9ICgoSERNSV9DVFJMX1BBQ0tFVF9NT0RFXzI0QklUU19QSVhFTCkgPDwKCQkJSERNSV9IRE1JX0NUUkxfUEFDS0VUX01PREVfU0hJRlQpOwoJaWYgKGRpdGhlcl9tb2RlX3ZhbCA9PSBIRE1JX1ZJRF9NT0RFX0RJVEhFUl9UT18zMF9CSVRTX01PREUpIHsKCQl0ZW1wIHw9ICgoSERNSV9DVFJMX1BBQ0tFVF9NT0RFXzMwQklUU19QSVhFTCkgPDwKCQkJCUhETUlfSERNSV9DVFJMX1BBQ0tFVF9NT0RFX1NISUZUKTsKCX0KCWlmIChkaXRoZXJfbW9kZV92YWwgPT0gSERNSV9WSURfTU9ERV9ESVRIRVJfVE9fMzZfQklUU19NT0RFKSB7CgkJdGVtcCB8PSAoKEhETUlfQ1RSTF9QQUNLRVRfTU9ERV8zNkJJVFNfUElYRUwpIDw8CgkJCQlIRE1JX0hETUlfQ1RSTF9QQUNLRVRfTU9ERV9TSElGVCk7Cgl9CgkvKiBUT0RPIERWSSBtb2RlIGlzIHJlcXVpcmVkIC0gbWFrZSB0aGlzIGNvbmZpZ3VyZWFibGUgYWxzbyAqLwoJdGVtcCB8PSBIRE1JX0hETUlfQ1RSTF9IRE1JX01PREVfTUFTSzsKCglfX3Jhd193cml0ZWwodGVtcCwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9IRE1JX0NUUkxfT0ZGU0VUKSk7CgoJdGVtcCA9IF9fcmF3X3JlYWRsKGNvcmVfYWRkciArIEhETUlfQ09SRV9UTURTX0NUUkxfT0ZGU0VUKTsKCgl0ZW1wIHw9IChIRE1JX1RNRFNfQ1RSTF9UQ0xLU0VMX01BU0sgJgoJCQkoSERNSV9UTURTX0NUUkxfSVBfQ0xPQ0tfTVVMVElQTElFUl9BVURJTyA8PAoJCQkgSERNSV9UTURTX0NUUkxfVENMS1NFTF9TSElGVCkpOwoJX19yYXdfd3JpdGVsKHRlbXAsIChjb3JlX2FkZHIgKyBIRE1JX0NPUkVfVE1EU19DVFJMX09GRlNFVCkpOwoKZXhpdF90aGlzX2Z1bmM6CglUSERCRygiY29uZmlndXJlX3BvbGljaWVzPDw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgoKc3RhdGljIGludCBjb25maWd1cmVfY3RybF9wYWNrZXRzKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCkKewoJdm9sYXRpbGUgdTMyIHRlbXA7CgoJdGVtcCA9IF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyKSArCgkJCUhETUlfQ09SRV9EQ19IRUFERVJfT0ZGU0VUKTsKCXRlbXAgPSAweDAzOwoJX19yYXdfd3JpdGVsKHRlbXAsCgkJCSgoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkcikgKwoJCQkgSERNSV9DT1JFX0RDX0hFQURFUl9PRkZTRVQpKTsKCglfX3Jhd193cml0ZWwoSERNSV9DUF9CWVRFMV9TRVRBVk1fTUFTSywKCQkJKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyKSArCgkJCSBIRE1JX0NPUkVfQ1BfQllURTFfT0ZGU0VUKSk7CgoJcmV0dXJuICgweDApOwp9CgoKc3RhdGljIGludCBjb25maWd1cmVfYXZpX2luZm9fZnJhbWUoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0KQp7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJdTggY2hlY2tfc3VtID0gMHgwOwoJdTggYnl0ZV9pbmRleCA9IDB4MDsKCXZvbGF0aWxlIHU4IGRhdGFfYnl0ZSA9IDB4MDsKCXZvbGF0aWxlIHUzMiBkYnl0ZV9iYXNlOwoJc3RydWN0IGhkbWlfYXZpX2ZyYW1lX2NmZyAqaW5mb1BrdCA9IE5VTEw7CglUSERCRygiPj4+PmNvbmZpZ3VyZV9hdmlfaW5mb19mcmFtZVxuIik7CglIRE1JX0FSR1NfQ0hFQ0soKGluc3RfY29udGV4dCAhPSBOVUxMKSk7CgoJaW5mb1BrdCA9ICYoaW5zdF9jb250ZXh0LT5jb25maWcuaW5mb19mcmFtZV9jb25maWcuYXZpRGF0YSk7CglkYnl0ZV9iYXNlID0gKHUzMikgKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQlIRE1JX0NPUkVfQVZJX0RCWVRFX0JBU0VfT0ZGU0VUKTsKCWRhdGFfYnl0ZSA9ICh1OCkKCQkoSERNSV9BVklfVFlQRV9BVklfVFlQRV9NQVNLICYgSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9UWVBFKTsKCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsCgkJCSgoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkcikgKwoJCQkgSERNSV9DT1JFX0FWSV9UWVBFX09GRlNFVCkpOwoJY2hlY2tfc3VtID0gSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9UWVBFOwoKCWRhdGFfYnl0ZSA9ICh1OCkKCQkoSERNSV9BVklfVkVSU19BVklfVkVSU19NQVNLICYgSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9WRVIpOwoJX19yYXdfd3JpdGVsKGRhdGFfYnl0ZSwKCQkJKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyKSArCgkJCSBIRE1JX0NPUkVfQVZJX1ZFUlNfT0ZGU0VUKSk7CgljaGVja19zdW0gKz0gSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9WRVI7CgoJZGF0YV9ieXRlID0gKHU4KQoJCShIRE1JX0FWSV9MRU5fQVZJX0xFTl9NQVNLICYgSERNSV9BVklfSU5GT0ZSQU1FX1BLVF9MRU4pOwoJX19yYXdfd3JpdGVsKGRhdGFfYnl0ZSwKCQkJKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyKSArCgkJCSBIRE1JX0NPUkVfQVZJX0xFTl9PRkZTRVQpKTsKCWNoZWNrX3N1bSArPSBIRE1JX0FWSV9JTkZPRlJBTUVfUEtUX0xFTjsKCgoJZGF0YV9ieXRlID0gKCgodTgpIGluZm9Qa3QtPm91dHB1dF9jcyA8PCA1KSAmCgkJCUhETUlfQVZJX0lORk9GUkFNRV9ZMF9ZMV9NQVNLKTsKCWlmIChpbmZvUGt0LT51c2VfYWN0aXZlX2FzcGVjdF9yYXRpbyA9PSBUUlVFKSB7CgkJZGF0YV9ieXRlIHw9IEhETUlfQVZJX0lORk9GUkFNRV9BMF9NQVNLOwoJfQoJLyogQmFyIGluZm9ybWF0aW9uIEIwIGFuZCBCMSAtIGlmIHNvIHJlcXVpcmUgdG8gdXBkYXRlIGJ5dGUgNi0xMyAqLwoJaWYgKGluZm9Qa3QtPmJhcl9pbmZvLmJhckluZm9WYWxpZCAhPSAweDApIHsKCQlkYXRhX2J5dGUgfD0gKCgoKHU4KSBpbmZvUGt0LT5iYXJfaW5mby5iYXJJbmZvVmFsaWQpIDw8CgkJCQkJMikgJiBIRE1JX0FWSV9JTkZPRlJBTUVfQjBfQjFfTUFTSyk7Cgl9CglkYXRhX2J5dGUgfD0gKCgodTgpIGluZm9Qa3QtPnNjYW5faW5mbykgJgoJCQlIRE1JX0FWSV9JTkZPRlJBTUVfUzBfUzFfTUFTSyk7CgoJLyogRmlyc3QgZGF0YSBieXRlIG9mIHRoZSBwYWNrZXQgKi8KCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJYnl0ZV9pbmRleCArPSAweDQ7CgljaGVja19zdW0gKz0gZGF0YV9ieXRlOwoKCWRhdGFfYnl0ZSA9ICgoKHU4KSBpbmZvUGt0LT5jb2xvcmltZXRyeV9pbmZvIDw8IDYpICYKCQkJSERNSV9BVklfSU5GT0ZSQU1FX0MwX0MxX01BU0spOwoKCWRhdGFfYnl0ZSB8PSAoKCh1OCkgaW5mb1BrdC0+YXNwZWN0X3JhdGlvIDw8IDQpICYKCQkJSERNSV9BVklfSU5GT0ZSQU1FX00wX00xX01BU0spOwoJaWYgKGluZm9Qa3QtPnVzZV9hY3RpdmVfYXNwZWN0X3JhdGlvID09IFRSVUUpIHsKCQlkYXRhX2J5dGUgfD0gKCgodTgpIGluZm9Qa3QtPmFjdGl2ZV9hc3BlY3RfcmF0aW8pICYKCQkJCUhETUlfQVZJX0lORk9GUkFNRV9SMF9SM19NQVNLKTsKCX0KCgkvKiBTZWNvbmQgZGF0YSBieXRlIG9mIHRoZSBwYWNrZXQgKi8KCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJYnl0ZV9pbmRleCArPSAweDQ7CgljaGVja19zdW0gKz0gZGF0YV9ieXRlOwoKCWRhdGFfYnl0ZSA9IDB4MDsKCWlmIChpbmZvUGt0LT5pdF9jb250ZW50X3ByZXNlbnQgIT0gMHgwKSB7CgkJZGF0YV9ieXRlID0gSERNSV9BVklfSU5GT0ZSQU1FX0lUQ19NQVNLOwoJfQoJLyogRXh0ZW5kZWQgY29sb3JpbWV0cnkgcmFuZ2UgRUMzIHRvIEVDMCAqLwoJZGF0YV9ieXRlIHw9ICgoKHU4KSBpbmZvUGt0LT5leHRfY29sb3JpbWV0cnkgPDwgNCkgJgoJCQlIRE1JX0FWSV9JTkZPRlJBTUVfRUMyX0VDMF9NQVNLKTsKCS8qIFF1YW50aXphdGlvbiByYW5nZSByYW5nZSBRMSB0byBRMCAqLwoJZGF0YV9ieXRlIHw9ICgoKHU4KSBpbmZvUGt0LT5xdWFudGl6YXRpb25fcmFuZ2UgPDwgMikKCQkJJiBIRE1JX0FWSV9JTkZPRlJBTUVfUTFfUTBfTUFTSyk7CgkvKiBOb24tVW5pZm9ybSBzY2FsaW5nIFMwIGFuZCBTMSAqLwoJZGF0YV9ieXRlIHw9ICgodTgpIGluZm9Qa3QtPm5vbl91bmlmb3JtX3NjICYKCQkJSERNSV9BVklfSU5GT0ZSQU1FX1NDMV9TQzBfTUFTSyk7CgkvKiBUaGlyZCBkYXRhIGJ5dGUgb2YgdGhlIHBhY2tldCAqLwoJX19yYXdfd3JpdGVsKGRhdGFfYnl0ZSwgKGRieXRlX2Jhc2UgKyBieXRlX2luZGV4KSk7CglieXRlX2luZGV4ICs9IDB4NDsKCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7CgkvKiBGb3VydGggZGF0YSBieXRlIG9mIHRoZSBwYWNrZXQgKi8KCXN3aXRjaCAoaW5zdF9jb250ZXh0LT5jb25maWcuZGlzcGxheV9tb2RlKSB7CgkJY2FzZSBoZG1pXzcyMFBfNjBfbW9kZToKCQkJaW5mb1BrdC0+Zm9ybWF0X2lkZW50aWVyID0gNHU7CgkJCWJyZWFrOwoJCWNhc2UgaGRtaV8xMDgwUF8zMF9tb2RlOgoJCQlpbmZvUGt0LT5mb3JtYXRfaWRlbnRpZXIgPSAzNHU7CgkJCWJyZWFrOwoJCWNhc2UgaGRtaV8xMDgwSV82MF9tb2RlOgoJCQlpbmZvUGt0LT5mb3JtYXRfaWRlbnRpZXIgPSA1dTsKCQkJYnJlYWs7CgkJY2FzZSBoZG1pXzEwODBQXzYwX21vZGU6CgkJCWluZm9Qa3QtPmZvcm1hdF9pZGVudGllciA9IDE2dTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CgoJZGF0YV9ieXRlID0gKHU4KSBpbmZvUGt0LT5mb3JtYXRfaWRlbnRpZXI7CgoJX19yYXdfd3JpdGVsKCgodTgpIGRhdGFfYnl0ZSAmCgkJCQlIRE1JX0FWSV9JTkZPRlJBTUVfVklDNl9WSUMwX01BU0spLAoJCQkoZGJ5dGVfYmFzZSArIGJ5dGVfaW5kZXgpKTsKCWJ5dGVfaW5kZXggKz0gMHg0OwoJY2hlY2tfc3VtICs9IGRhdGFfYnl0ZTsKCgkvKiBQaXhlbCBSZXBlYXRhdGlvbiAqLwoJZGF0YV9ieXRlID0gKHU4KSAoSERNSV9WSURfQ1RSTF9JQ0xLX01BU0sgJgoJCQlfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCUhETUlfQ09SRV9WSURfQ1RSTF9PRkZTRVQpKTsKCgkvKiBUT0RPIC0gV2h5IGRvIHdlIHJlcXVpcmUgdG8gdXAgdGhlIHBpeGVsIHJlcGVhdGF0aW9uIHdoZW4gZGVtdXggaXMKCSAgIGlzIHVzZWQuICovCglpZiAoKF9fcmF3X3JlYWRsKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJCUhETUlfQ09SRV9WSURfTU9ERV9PRkZTRVQpICYKCQkJCUhETUlfVklEX01PREVfREVNVVhfTUFTSykgPT0gSERNSV9WSURfTU9ERV9ERU1VWF9NQVNLKXsKCQkvKiBEbyBub3Qgd29ycnkgYWJvdXQgZXhjZWVkaW5nIHRoZSB1cHBlciBsaW1pdC4KCQkgICBQaXhlbCBjb3VsZCBiZSByZXBlYXRlZCBhIG1heGltdW0gb2YgNCB0aW1lcyAodmFsdWUgMHgwMykuCgkJICAgVGhlIHBpeGVsIHJlcGVhdGF0aW9uIGhhcyA0IGJpdCBzcGFjZSBpbiBpbmZvIHBhY2tldCB3aGljaCBjb3VsZAoJCSAgIGJlIGEgbWF4aW11bSBvZiAweDBGLCBidXQgbGltaXRlZCB0byAweDA5ICovCgkJZGF0YV9ieXRlKys7Cgl9CglfX3Jhd193cml0ZWwoKEhETUlfQVZJX0lORk9GUkFNRV9QUjNfUFIwX01BU0sgJiBkYXRhX2J5dGUpLAoJCQkoZGJ5dGVfYmFzZSArIGJ5dGVfaW5kZXgpKTsKCWJ5dGVfaW5kZXggKz0gMHg0OwoJY2hlY2tfc3VtICs9IGRhdGFfYnl0ZTsKCglpZiAoaW5mb1BrdC0+YmFyX2luZm8uYmFySW5mb1ZhbGlkICE9IDB4MCkgewoJCWRhdGFfYnl0ZSA9ICh1OCkgKGluZm9Qa3QtPmJhcl9pbmZvLnRvcEJhciAmIDB4RkYpOwoJCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJCWJ5dGVfaW5kZXggKz0gMHg0OwoJCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7CgkJZGF0YV9ieXRlID0KCQkJKHU4KSAoKGluZm9Qa3QtPmJhcl9pbmZvLnRvcEJhciA+PiA4KSAmIDB4RkYpOwoJCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJCWJ5dGVfaW5kZXggKz0gMHg0OwoJCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7CgoJCWRhdGFfYnl0ZSA9ICh1OCkgKGluZm9Qa3QtPmJhcl9pbmZvLmJvdHRvbUJhciAmIDB4RkYpOwoJCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJCWJ5dGVfaW5kZXggKz0gMHg0OwoJCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7CgkJZGF0YV9ieXRlID0KCQkJKHU4KSAoKGluZm9Qa3QtPmJhcl9pbmZvLmJvdHRvbUJhciA+PiA4KSAmIDB4RkYpOwoJCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJCWJ5dGVfaW5kZXggKz0gMHg0OwoJCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7CgoJCWRhdGFfYnl0ZSA9ICh1OCkgKGluZm9Qa3QtPmJhcl9pbmZvLmxlZnRCYXIgJiAweEZGKTsKCQlfX3Jhd193cml0ZWwoZGF0YV9ieXRlLCAoZGJ5dGVfYmFzZSArIGJ5dGVfaW5kZXgpKTsKCQlieXRlX2luZGV4ICs9IDB4NDsKCQljaGVja19zdW0gKz0gZGF0YV9ieXRlOwoJCWRhdGFfYnl0ZSA9CgkJCSh1OCkgKChpbmZvUGt0LT5iYXJfaW5mby5sZWZ0QmFyID4+IDgpICYgMHhGRik7CgkJX19yYXdfd3JpdGVsKGRhdGFfYnl0ZSwgKGRieXRlX2Jhc2UgKyBieXRlX2luZGV4KSk7CgkJYnl0ZV9pbmRleCArPSAweDQ7CgkJY2hlY2tfc3VtICs9IGRhdGFfYnl0ZTsKCgkJZGF0YV9ieXRlID0gKHU4KSAoaW5mb1BrdC0+YmFyX2luZm8ucmlnaHRCYXIgJiAweEZGKTsKCQlfX3Jhd193cml0ZWwoZGF0YV9ieXRlLCAoZGJ5dGVfYmFzZSArIGJ5dGVfaW5kZXgpKTsKCQlieXRlX2luZGV4ICs9IDB4NDsKCQljaGVja19zdW0gKz0gZGF0YV9ieXRlOwoJCWRhdGFfYnl0ZSA9CgkJCSh1OCkgKChpbmZvUGt0LT5iYXJfaW5mby5yaWdodEJhciA+PiA4KSAmIDB4RkYpOwoJCV9fcmF3X3dyaXRlbChkYXRhX2J5dGUsIChkYnl0ZV9iYXNlICsgYnl0ZV9pbmRleCkpOwoJCWJ5dGVfaW5kZXggKz0gMHg0OwoJCWNoZWNrX3N1bSArPSBkYXRhX2J5dGU7Cgl9CgoJX19yYXdfd3JpdGViKCh1OCkgKEhETUlfQVZJX0lORk9GUkFNRV9DT05TVF8weDEwMCAtICh1MTYpIGNoZWNrX3N1bSksCgkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX0FWSV9DSFNVTV9PRkZTRVQpKTsKCglUSERCRygiQVZJIC0gQ29tcHV0ZWQgY2hlY2sgc3VtICVkIiwgY2hlY2tfc3VtKTsKCVRIREJHKCJDaGVjayBzdW0gc2VudCAlZCIsCgkJCV9fcmF3X3JlYWRsKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJSERNSV9DT1JFX0FWSV9DSFNVTV9PRkZTRVQpKTsKCVRIREJHKCJTZW50IGNoZWNrIHN1bSArIGFsbCBieXRlcyBzaG91bGQgMHgwIik7CmV4aXRfdGhpc19mdW5jOgoJVEhEQkcoImNvbmZpZ3VyZV9hdmlfaW5mb19mcmFtZTw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgpzdGF0aWMgaW50IGNvbmZpZ3VyZV9jc2NfeWNiY3JfcmdiKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCkKewoJc3RydWN0IGhkbWlfY3NjX1lDYkNyXzJfUkdCX2N0cmwgKmN0cmwgPSBOVUxMOwoJdm9sYXRpbGUgdTMyIHRlbXA7Cgl2b2xhdGlsZSB1MzIgY29yZV9hZGRyOwoKCVRIREJHKCI+Pj4+Y29uZmlndXJlX2NzY195Y2Jjcl9yZ2IiKTsKCUhETUlfQVJHU19DSEVDSygoaW5zdF9jb250ZXh0ICE9IE5VTEwpKTsKCgljb3JlX2FkZHIgPSBpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyOwoJY3RybCA9CgkJJihpbnN0X2NvbnRleHQtPmNvbmZpZy5jb3JlX3BhdGhfY29uZmlnLgoJCQkJY3NjX1lDYkNyXzJfUkdCX2NvbmZpZyk7CgoJdGVtcCA9IF9fcmF3X3JlYWRsKGNvcmVfYWRkciArIEhETUlfQ09SRV9YVllDQzJSR0JfQ1RMX09GRlNFVCk7Cgl0ZW1wICY9ICh+KEhETUlfWFZZQ0MyUkdCX0NUTF9FWFBfT05MWV9NQVNLIHwKCQkJCUhETUlfWFZZQ0MyUkdCX0NUTF9CWVBfQUxMX01BU0sgfAoJCQkJSERNSV9YVllDQzJSR0JfQ1RMX1NXX09WUl9NQVNLIHwKCQkJCUhETUlfWFZZQ0MyUkdCX0NUTF9GVUxMUkFOR0VfTUFTSyB8CgkJCQlIRE1JX1hWWUNDMlJHQl9DVExfWFZZQ0NTRUxfTUFTSykpOwoJaWYgKGN0cmwtPmVuYWJsZVJuZ0V4cCAhPSAweDApCgkJdGVtcCB8PSBIRE1JX1hWWUNDMlJHQl9DVExfRVhQX09OTFlfTUFTSzsKCglpZiAoY3RybC0+ZW5hYmxlRnVsbFJuZ0V4cCAhPSAweDApCgkJdGVtcCB8PSBIRE1JX1hWWUNDMlJHQl9DVExfRlVMTFJBTkdFX01BU0s7CgoJaWYgKGN0cmwtPnNyY0NzU2VsICE9IDB4MCkKCQl0ZW1wIHw9IEhETUlfWFZZQ0MyUkdCX0NUTF9YVllDQ1NFTF9NQVNLOwoKCWlmIChjdHJsLT5jdXN0b21Db0VmZiAhPSAweDApIHsKCQkvKiBMb2FkIHRoZSBjdXN0b20gY29lZmZpY2l0ZW50cyAtIHVzaW5nIG1lbWNvcHkgdG8gbG9hZCBhcyB0aGUKCQkgICBzdHJ1Y3R1cmVzIG1hcHMgdG8gcmVnaXN0ZXIgKi8KCQltZW1jcHkoKHZvaWQgKikgKGNvcmVfYWRkciArCgkJCQkJSERNSV9DT1JFX1kyUl9DT0VGRl9MT1dfT0ZGU0VUKSwKCQkJCSgoY29uc3Qgdm9pZCAqKSAmKGN0cmwtPmNvRWZmKSksCgkJCQlzaXplb2Yoc3RydWN0IGhkbWlfY3NjX1lDYkNyXzJfUkdCX2NvZWZmKSk7CgkJVEhEQkcoIlVzaW5nIGN1c3RvbSBjby1lZmZzIik7Cgl9CglfX3Jhd193cml0ZWwodGVtcCwgKGNvcmVfYWRkciArIEhETUlfQ09SRV9YVllDQzJSR0JfQ1RMX09GRlNFVCkpOwoKCVRIREJHKCJjb25maWd1cmVfY3NjX3ljYmNyX3JnYjw8PDwiKTsKCXJldHVybiAoMHgwKTsKfQoKc3RhdGljIGludCB2YWxpZGF0ZV9pbmZvX2ZyYW1lX2NmZyhzdHJ1Y3QgaGRtaV9pbmZvX2ZyYW1lX2NmZyAqY29uZmlnKQp7CglpbnQgcnRuX3ZhbHVlID0gLUVGQVVMVCA7CglzdHJ1Y3QgaGRtaV9hdmlfZnJhbWVfY2ZnICphdmlEYXRhID0gTlVMTDsKCVRIREJHKCI+Pj4+dmFsaWRhdGVfaW5mb19mcmFtZV9jZmciKTsKCglpZiAoY29uZmlnID09IE5VTEwpCgkJZ290byBleGl0X3RoaXNfZnVuYzsKCglhdmlEYXRhID0gJihjb25maWctPmF2aURhdGEpOwoJaWYgKGF2aURhdGEtPm91dHB1dF9jcyA+PSBoZG1pX2F2aV9tYXhfb3BfY3MpIHsKCQlUSERCRygiSW4gY29ycmVjdCBjb2xvciBzcGFjZSIpOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoKGF2aURhdGEtPnVzZV9hY3RpdmVfYXNwZWN0X3JhdGlvICE9IGhkbWlfYXZpX25vX2FzcGVjdF9yYXRpbykKCQkJJiYgKGF2aURhdGEtPnVzZV9hY3RpdmVfYXNwZWN0X3JhdGlvICE9CgkJCQloZG1pX2F2aV9hY3RpdmVfYXNwZWN0X3JhdGlvKSkgewoJCVRIREJHKCJXcm9uZyBhc3BlY3QgcmF0aW8iKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaWYgKGF2aURhdGEtPnNjYW5faW5mbyA+PSBoZG1pX2F2aV9tYXhfc2NhbikgewoJCVRIREJHKCJJbiBjb3JyZWN0IHNjYW4gaW5mbyIpOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoYXZpRGF0YS0+Y29sb3JpbWV0cnlfaW5mbyA+PSBoZG1pX2F2aV9tYXhfY29sb3JpbWV0cnkpIHsKCQlUSERCRygiV3JvbmcgY29sb3JpbWV0cnkgaW5mbyIpOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoYXZpRGF0YS0+YXNwZWN0X3JhdGlvID49IGhkbWlfYXZpX2FzcGVjdF9yYXRpb19tYXgpIHsKCQlUSERCRygiV3JvbmcgYXNwZWN0IHJhdGlvIGluZm8iKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaWYgKChhdmlEYXRhLT5hY3RpdmVfYXNwZWN0X3JhdGlvIDwKCQkJCWhkbWlfYXZpX2FjdGl2ZV9hc3BlY3RfcmF0aW9fc2FtZSkKCQkJJiYgKGF2aURhdGEtPmFjdGl2ZV9hc3BlY3RfcmF0aW8gPj0gaGRtaV9hdmlfYXNwZWN0X3JhdGlvX21heCkpIHsKCQlUSERCRygiV3JvbmcgYWN0aXZlIGFzcGVjdCByYXRpbyBpbmZvIik7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCWlmIChhdmlEYXRhLT5ub25fdW5pZm9ybV9zYyA+PSBoZG1pX2F2aV9ub25fdW5pZm9ybV9zY2FsaW5nX21heCkgewoJCVRIREJHKCJJbiBjb3JyZWN0IG5vbi11bmlmb3JtIHNjYWxpbmcgaW5mbyIpOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglydG5fdmFsdWUgPSAweDA7CgpleGl0X3RoaXNfZnVuYzoKCVRIREJHKCJ2YWxpZGF0ZV9pbmZvX2ZyYW1lX2NmZzw8PDwiKTsKCXJldHVybiAocnRuX3ZhbHVlKTsKfQoKc3RhdGljIGludCB2YWxpZGF0ZV9jb3JlX2NvbmZpZyhzdHJ1Y3QgaGRtaV9jb3JlX2lucHV0X2NmZyAqY29uZmlnKQp7CglUSERCRygiPj4+PnZhbGlkYXRlX2NvcmVfY29uZmlnIik7CglIRE1JX0FSR1NfQ0hFQ0soKGNvbmZpZyAhPSBOVUxMKSk7CgoJaWYgKGNvbmZpZy0+ZGF0YV9idXNfd2lkdGggPiBoZG1pXzEwX2JpdHNfY2hhbl93aWR0aCkgewoJCVRIREJHKCJCdXMgd2lkdGggc2hvdWxkIGJlIDw9MzAgYml0cy9waXhlbCIpOwoJCXJldHVybiAoLUVGQVVMVCApOwoJfQoKCWlmIChjb25maWctPnN5bmNfZ2VuX2NmZyA+PSBoZG1pX21heF9zeW5jcykgewoJCVRIREJHKCJJbmNvcnJlY3QgbWVhdGhvZHMgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uIik7CgkJcmV0dXJuICgtRUZBVUxUICk7Cgl9CgoJVEhEQkcoInZhbGlkYXRlX2NvcmVfY29uZmlnPDw8PCIpOwoJcmV0dXJuICgweDApOwp9CgpzdGF0aWMgaW50IHZhbGlkYXRlX3dwX2NmZyhzdHJ1Y3QgaGRtaV93cF9jb25maWcgKmNvbmZpZykKewoJaW50IHJ0bl92YWx1ZSA9IC1FRkFVTFQgOwoJVEhEQkcoIj4+Pj52YWxpZGF0ZV93cF9jZmciKTsKCglpZiAoKGNvbmZpZy0+ZGVib3VuY2VfcmN2X2RldGVjdCA8IDB4MDEpIHx8CgkJCShjb25maWctPmRlYm91bmNlX3Jjdl9kZXRlY3QgPiAweDE0KSkgewoJCVRIREJHKCJEZWJvdW5jZSByZWNlaXZlciBkZXRlY3QgaW5jb3JyZWN0Iik7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCWlmICgoY29uZmlnLT5kZWJvdW5jZV9yY3Zfc2VucyA8IDB4MDEpIHx8CgkJCShjb25maWctPmRlYm91bmNlX3Jjdl9zZW5zID4gMHgxNCkpIHsKCQlUSERCRygiRGVib3VuY2UgcmVjZWl2ZXIgc2VucyBpbmNvcnJlY3QiKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaWYgKGNvbmZpZy0+aXNfc2xhdmVfbW9kZSA9PSAweDApIHsKCQlUSERCRygiV2FycHBlciBpcyBub3QgaW4gU0xBVkUgbW9kZSAiKTsKCQlUSERCRygiIC0gTWFzdGVyIG1vZGUgY2Fubm90IGJlIHN1cHBvcnRlZCIpOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoY29uZmlnLT53aWR0aCA+PSBoZG1pXzEyX2JpdHNfY2hhbl93aWR0aCkgewoJCVRIREJHKCJCdXMgd2lkdGggc2hvdWxkIGJlIDwgMzYgYml0cy9waXhlbCIpOwoJCVRIREJHKCIgLSA4ICYgMTAgYml0cy9jaGFubmVsIGlzIHZhbGlkIik7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCWlmIChjb25maWctPnBhY2tfbW9kZSA+PSBoZG1pX3dwX25vX3BhY2spIHsKCQlUSERCRygiSW5jb3JyZWN0IGRhdGEgcGFja2luZyBtb2RlIik7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCXJ0bl92YWx1ZSA9IDB4MDsKCVRIREJHKCJ2YWxpZGF0ZV93cF9jZmc8PDw8Iik7CgpleGl0X3RoaXNfZnVuYzoKCXJldHVybiAocnRuX3ZhbHVlKTsKfQoKc3RhdGljIGludCB2YWxpZGF0ZV9wYXRoX2NvbmZpZyhzdHJ1Y3QgaGRtaV9jb3JlX2RhdGFfcGF0aCAqY29uZmlnKQp7CglUSERCRygiPj4+PnZhbGlkYXRlX3BhdGhfY29uZmlnIik7CglIRE1JX0FSR1NfQ0hFQ0soKGNvbmZpZyAhPSBOVUxMKSk7CglpZiAoY29uZmlnLT5vdXRwdXRfd2lkdGggPj0gaGRtaV9tYXhfYml0c19jaGFuX3dpZHRoKSB7CgkJVEhEQkcoIkluIHZhbGlkIG91dHB1dCBjaGFubmVsIHdpZHRoIiwKCQkJCWNvbmZpZy0+b3V0cHV0X3dpZHRoKTsKCQlyZXR1cm4gKC1FRkFVTFQgKTsKCX0KCVRIREJHKCJ2YWxpZGF0ZV9wYXRoX2NvbmZpZzw8PDwiKTsKCXJldHVybiAoMHgwKTsKfQoKCnN0YXRpYyBpbnQgY2hlY2tfY29weV9jb25maWcoc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jbnR4dCwKCQlzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zICpjb25maWcpCnsKCWludCBydG5fdmFsdWUgPSAweDA7CglUSERCRygiPj4+PmNoZWNrX2NvcHlfY29uZmlnIik7CgoJaWYgKGNvbmZpZy0+dXNlX2Rpc3BsYXlfbW9kZSAhPSAweDApIHsKCQlpZiAoY29uZmlnLT5kaXNwbGF5X21vZGUgPj0gaGRtaV9tYXhfbW9kZSkgewoJCQlUSERCRygiSW5jb3JyZWN0IG1vZGUgaWQiKTsKCQkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJCWluc3RfY250eHQtPmNvbmZpZy5kaXNwbGF5X21vZGUgPSBjb25maWctPmRpc3BsYXlfbW9kZTsKCX0KCWlmIChjb25maWctPnVzZV93cF9jb25maWcgIT0gMHgwKSB7CgkJcnRuX3ZhbHVlID0gdmFsaWRhdGVfd3BfY2ZnKCYoY29uZmlnLT53cF9jb25maWcpKTsKCQlpZiAocnRuX3ZhbHVlICE9IDB4MCkgewoJCQlUSERCRygiV3JhcHBlciBjb25maWcgaW5jb3JyZWN0Iik7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJCW1lbWNweSgodm9pZCAqKSAoJihpbnN0X2NudHh0LT5jb25maWcud3BfY29uZmlnKSksCgkJCQkoKGNvbnN0IHZvaWQgKikgJihjb25maWctPndwX2NvbmZpZykpLAoJCQkJc2l6ZW9mKHN0cnVjdCBoZG1pX3dwX2NvbmZpZykpOwoJfQoJaWYgKGNvbmZpZy0+dXNlX2NvcmVfY29uZmlnICE9IDB4MCkgewoJCXJ0bl92YWx1ZSA9IHZhbGlkYXRlX2NvcmVfY29uZmlnKCYoY29uZmlnLT5jb3JlX2NvbmZpZykpOwoJCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJCVRIREJHKCJDb3JlIGNvbmZpZyBpbmNvcnJlY3QiKTsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9CgkJbWVtY3B5KCh2b2lkICopICgmKGluc3RfY250eHQtPmNvbmZpZy5jb3JlX2NvbmZpZykpLAoJCQkJKChjb25zdCB2b2lkICopICYoY29uZmlnLT5jb3JlX2NvbmZpZykpLAoJCQkJc2l6ZW9mKHN0cnVjdCBoZG1pX2NvcmVfaW5wdXRfY2ZnKSk7Cgl9CglpZiAoY29uZmlnLT51c2VfY29yZV9wYXRoX2NvbmZpZyAhPSAweDApIHsKCQlydG5fdmFsdWUgPQoJCQl2YWxpZGF0ZV9wYXRoX2NvbmZpZygmKGNvbmZpZy0+Y29yZV9wYXRoX2NvbmZpZykpOwoJCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJCVRIREJHKCJDb3JlIGRhdGEgcGF0aCBjb25maWcgaW5jb3JyZWN0Iik7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJCW1lbWNweSgodm9pZCAqKSAoJihpbnN0X2NudHh0LT5jb25maWcuY29yZV9wYXRoX2NvbmZpZykpLAoJCQkJKChjb25zdCB2b2lkICopICYoY29uZmlnLT5jb3JlX3BhdGhfY29uZmlnKSksCgkJCQlzaXplb2Yoc3RydWN0IGhkbWlfY29yZV9kYXRhX3BhdGgpKTsKCX0KCWlmIChjb25maWctPnVzZV9pbmZvX2ZyYW1lX2NvbmZpZyAhPSAweDApIHsKCQlpZiAoY29uZmlnLT5pbmZvX2ZyYW1lX2NvbmZpZy51c2VfYXZpX2luZm9fZGF0YSAhPSAweDApIHsKCQkJcnRuX3ZhbHVlID0gdmFsaWRhdGVfaW5mb19mcmFtZV9jZmcKCQkJCSgmKGNvbmZpZy0+aW5mb19mcmFtZV9jb25maWcpKTsKCQkJaWYgKHJ0bl92YWx1ZSAhPSAweDApIHsKCQkJCVRIREJHKCJCYWQgQVZJIEluZm8gZnJhbWUgZGF0YSIpOwoJCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQkJfQoJCQltZW1jcHkoKHZvaWQKCQkJCQkJKikgKCYoaW5zdF9jbnR4dC0+Y29uZmlnLgoJCQkJCQkJCWluZm9fZnJhbWVfY29uZmlnKSksCgkJCQkJKChjb25zdCB2b2lkICopCgkJCQkJICYoY29uZmlnLT5pbmZvX2ZyYW1lX2NvbmZpZykpLAoJCQkJCXNpemVvZihzdHJ1Y3QgaGRtaV9pbmZvX2ZyYW1lX2NmZykpOwoJCX0KCX0KCVRIREJHKCJjaGVja19jb3B5X2NvbmZpZzw8PDwiKTsKCmV4aXRfdGhpc19mdW5jOgoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgpzdGF0aWMgaW50IGRldGVybWluZV9waXhlbF9yZXBlYXRhdGlvbihzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQpCnsKCWludCBydG5fdmFsdWUgPSAweDA7Cgl1MzIgbVBpeGVsUGVyU2VjID0gMHgwOwoJVEhEQkcoIj4+Pj5kZXRlcm1pbmVfcGl4ZWxfcmVwZWF0YXRpb24iKTsKCUhETUlfQVJHU19DSEVDSygoaW5zdF9jb250ZXh0ICE9IE5VTEwpKTsKCglzd2l0Y2ggKGluc3RfY29udGV4dC0+Y29uZmlnLmRpc3BsYXlfbW9kZSkgewoJCWNhc2UgaGRtaV9udHNjX21vZGU6CgkJCW1QaXhlbFBlclNlYyA9IEhETUlfVklERU9fU1RBTkRfTlRTQzsKCQkJaW5zdF9jb250ZXh0LT5pc19pbnRlcmxhY2VkID0gVFJVRTsKCQkJVEhEQkcoIk5UU0MgU3RhbmRhcmQiKTsKCQkJYnJlYWs7CgkJY2FzZSBoZG1pX3BhbF9tb2RlOgoJCQltUGl4ZWxQZXJTZWMgPSBIRE1JX1ZJREVPX1NUQU5EX1BBTDsKCQkJaW5zdF9jb250ZXh0LT5pc19pbnRlcmxhY2VkID0gVFJVRTsKCQkJVEhEQkcoIlBBTCBTdGFuZGFyZCIpOwoJCQlicmVhazsKCQljYXNlIGhkbWlfNzIwUF82MF9tb2RlOgoJCQltUGl4ZWxQZXJTZWMgPSBIRE1JX1ZJREVPX1NUQU5EXzcyMFA2MDsKCQkJaW5zdF9jb250ZXh0LT5pc19pbnRlcmxhY2VkID0gRkFMU0U7CgkJCVRIREJHKCI3MjBQNjAgZm9ybWF0Iik7CgkJCWJyZWFrOwoJCWNhc2UgaGRtaV8xMDgwUF82MF9tb2RlOgoJCQltUGl4ZWxQZXJTZWMgPSBIRE1JX1ZJREVPX1NUQU5EXzEwODBQNjA7CgkJCWluc3RfY29udGV4dC0+aXNfaW50ZXJsYWNlZCA9IEZBTFNFOwoJCQlUSERCRygiMTA4MFA2MCBmb3JtYXQiKTsKCQkJYnJlYWs7CgkJY2FzZSBoZG1pXzEwODBQXzMwX21vZGU6CgkJCW1QaXhlbFBlclNlYyA9IEhETUlfVklERU9fU1RBTkRfMTA4MFAzMDsKCQkJaW5zdF9jb250ZXh0LT5pc19pbnRlcmxhY2VkID0gRkFMU0U7CgkJCVRIREJHKCIxMDgwUDMwIGZvcm1hdCIpOwoJCQlicmVhazsKCQljYXNlIGhkbWlfMTA4MElfNjBfbW9kZToKCQkJbVBpeGVsUGVyU2VjID0gSERNSV9WSURFT19TVEFORF8xMDgwSTYwOwoJCQlpbnN0X2NvbnRleHQtPmlzX2ludGVybGFjZWQgPSBGQUxTRTsKCQkJVEhEQkcoIjEwODBJNjAgZm9ybWF0Iik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KCQkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJCVRIREJHKCJUaGUgZGlzcGxheSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIpOwoJCQlicmVhazsKCX0KCWlmIChydG5fdmFsdWUgPT0gMHgwKSB7CgkJaWYgKG1QaXhlbFBlclNlYyA8IEhETUlfTUlOSU1VTV9QSVhFTFNfU0VDKSB7CgkJCWlmICgobVBpeGVsUGVyU2VjICogSERNSV9QSVhFTF9SRVBMRUNBVEVEX09OQ0UpID49CgkJCQkJSERNSV9NSU5JTVVNX1BJWEVMU19TRUMpIHsKCQkJCXJ0bl92YWx1ZSA9IEhETUlfUElYRUxfUkVQTEVDQVRFRF9PTkNFOwoJCQkJVEhEQkcoIlBpeGVsIFJlcGVhdGluZyAxIHRpbWUiKTsKCQkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJCX0KCgkJCWlmICgobVBpeGVsUGVyU2VjICoKCQkJCQkJSERNSV9QSVhFTF9SRVBMRUNBVEVEX0ZPVVJfVElNRVMpID49CgkJCQkJSERNSV9NSU5JTVVNX1BJWEVMU19TRUMpIHsKCQkJCXJ0bl92YWx1ZSA9CgkJCQkJSERNSV9QSVhFTF9SRVBMRUNBVEVEX0ZPVVJfVElNRVM7CgkJCQlUSERCRygiUGl4ZWwgUmVwZWF0aW5nIDQgdGltZSIpOwoJCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQkJfQoJCQkvKiBXZSBjb3VsZCBub3Qgc3RpbGwgbWVldCB0aGUgSERNSSBuZWVkcyAtIGxldCB0aGUKCQkJICAgY2FsbGVyIGtub3cgKi8KCQkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJCVRIREJHKCJSZXNvbHV0aW9uIHRvbyBsb3cgQ291bGQgbm90IHJlYWNoIDI1IE1IeiIpOwoJCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJCX0KCX0KCmV4aXRfdGhpc19mdW5jOgoKCVRIREJHKCI+Pj4+ZGV0ZXJtaW5lX3BpeGVsX3JlcGVhdGF0aW9uIik7CglyZXR1cm4gKHJ0bl92YWx1ZSk7Cn0KI2lmbmRlZiBDT05GSUdfQVJDSF9USTgxNlgKaW50IGdldF9waHlfc3RhdHVzKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCwKCQlzdHJ1Y3QgdGk4MXh4aGRtaV9waHlfc3RhdHVzICpzdGF0KQp7CglpbnQgcnRuX3ZhbHVlID0gMDsKCWludCBwaHlfYmFzZTsKCXUzMiB0ZW1wOwoKCVRIREJHKCI+Pj4+Z2V0X3BoeV9zdGF0dXNcbiIpOwoJcGh5X2Jhc2UgPSBpbnN0X2NvbnRleHQtPnBoeV9iYXNlX2FkZHI7CglpZiAoIXN0YXQpCgl7CgkJcnRuX3ZhbHVlID0gLUVGQVVMVDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoKCXRlbXAgPSBfX3Jhd19yZWFkbChwaHlfYmFzZSArIEhETUlfUEhZX1BXUl9DVFJMX09GRik7CglzdGF0LT5yc3RfZG9uZV9wY2xrID0gKHRlbXAgJiBIRE1JX1BIWV9SRVNFVERPTkVQSVhFTENMS19NQVNLKSA8PAoJCUhETUlfUEhZX1JFU0VURE9ORVBJWEVMQ0xLX1NISUZUOwoJc3RhdC0+cnN0X2RvbmVfcHdyY2xrID0gKHRlbXAgJiBIRE1JX1BIWV9SRVNFVERPTkVQV1JDTEtfTUFTSykgPDwKCQlIRE1JX1BIWV9SRVNFVERPTkVQV1JDTEtfU0hJRlQ7CglzdGF0LT5yc3RfZG9uZV9zY3BjbGsgPSAodGVtcCAmIEhETUlfUEhZX1JFU0VURE9ORVNDUENMS19NQVNLKSA8PAoJCUhETUlfUEhZX1JFU0VURE9ORVNDUENMS19TSElGVDsKCXN0YXQtPnJzdF9kb25lX3JlZmNsayA9ICh0ZW1wICYgSERNSV9QSFlfUkVTRVRET05FUkVGQ0xLX01BU0spIDw8CgkJSERNSV9QSFlfUkVTRVRET05FUkVGQ0xLX1NISUZUOwoJdGVtcCA9IF9fcmF3X3JlYWRsKHBoeV9iYXNlICsgSERNSV9QSFlfUEFEX0NGR19DVFJMX09GRik7CglzdGF0LT5kY3RfNXZfc2hvcnRfY2xrID0gKHRlbXAgJiBIRE1JX1BIWV9ERVQ1VlNIVF9DTEtfTUFTSykgPDwKCQlIRE1JX1BIWV9ERVQ1VlNIVF9DTEtfU0hJRlQ7CglzdGF0LT5yeF9kZXRlY3QgPSAodGVtcCAmIEhETUlfUEhZX1JYREVUX0xJTkVfTUFTSykgPj4KCQlIRE1JX1BIWV9SWERFVF9MSU5FX1NISUZUOwoJc3RhdC0+ZGN0XzV2X3Nob3J0X2RhdGEgPSAodGVtcCAmIEhETUlfUEhZX0RFVDVWU0hUX0RBVEFfTUFTSykgPj4KCQlIRE1JX1BIWV9ERVQ1VlNIVF9EQVRBX1NISUZUOwoJVEhEQkcoImdldF9waHlfc3RhdHVzPDw8PDxcbiIpOwpleGl0X3RoaXNfZnVuYzoKCXJldHVybiBydG5fdmFsdWU7Cn0KI2Vsc2UKaW50IGdldF9waHlfc3RhdHVzKHN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCwKCQlzdHJ1Y3QgdGk4MXh4aGRtaV9waHlfc3RhdHVzICpzdGF0KQp7CglyZXR1cm4gLUVJTlZBTDsKfQojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX1RJODE2WAp2b2lkIGVuYWJsZV9oZG1pX2Nsb2Nrcyh1MzIgcHJjbV9iYXNlKQp7Cgl1MzIgdGVtcCwgcmVwZWF0Q250OwoJVEhEQkcoIkhETUkgQ2xrIGVuYWJsZSBpbiBwcm9ncmVzc1xuIik7Cgl0ZW1wID0gMjsKCS8qRW5hYmxlIFBvd2VyIERvbWFpbiBUcmFuc2l0aW9uIGZvciBIRE1JICovCglfX3Jhd193cml0ZWwodGVtcCwgKHByY21fYmFzZSArIENNX0hETUlfQ0xLU1RDVFJMX09GRikpOwoJLypFbmFibGUgSERNSSBDbG9ja3MqLwoJX19yYXdfd3JpdGVsKHRlbXAsIChwcmNtX2Jhc2UgKyBDTV9BQ1RJVkVfSERNSV9DTEtDVFJMX09GRikpOwoKCS8qQ2hlY2sgY2xvY2tzIGFyZSBhY3RpdmUqLwoJcmVwZWF0Q250ID0gMDsKCWRvCgl7CgkJdGVtcCA9IChfX3Jhd19yZWFkbChwcmNtX2Jhc2UgKyBDTV9IRE1JX0NMS1NUQ1RSTF9PRkYpKSA+PiA4OwoJCXJlcGVhdENudCsrOwoJfQoJd2hpbGUoKHRlbXAgIT0gMHgzKSAmJihyZXBlYXRDbnQgPCBWUFNfUFJDTV9NQVhfUkVQX0NOVCkpOwoKCS8qIENoZWNrIHRvIHNlZSBtb2R1bGUgaXMgZnVuY3Rpb25hbCAqLwoJcmVwZWF0Q250ID0gMDsKCWRvCgl7CgkJdGVtcCA9ICgoX19yYXdfcmVhZGwocHJjbV9iYXNlICsgQ01fQUNUSVZFX0hETUlfQ0xLQ1RSTF9PRkYpICYKCQkJCQkweDcwMDAwKSkgPj4gMTY7CgkJcmVwZWF0Q250Kys7Cgl9Cgl3aGlsZSgodGVtcCAhPSAwKSAmJiAocmVwZWF0Q250IDwgVlBTX1BSQ01fTUFYX1JFUF9DTlQpKTsKCVRIREJHKCJIRE1JIENsb2NrcyBlbmFibGVkIHN1Y2Nlc3NmdWxseVxuIik7Cn0KI2Vsc2UKdm9pZCBlbmFibGVfaGRtaV9jbG9ja3ModTMyIHByY21fYmFzZSkKewoJdTMyIHRlbXAsIHJlcGVhdENudDsKCglUSERCRygiSERNSSBDbGsgZW5hYmxlIGluIHByb2dyZXNzXG4iKTsKCXRlbXAgPSAyOwoJLypFbmFibGUgUG93ZXIgRG9tYWluIFRyYW5zaXRpb24gZm9yIEhETUkgKi8KCV9fcmF3X3dyaXRlbCh0ZW1wLCAocHJjbV9iYXNlICsgQ01fQUxXT05fU0RJT19DTEtDVFJMKSk7CgoJLypDaGVjayBjbG9ja3MgYXJlIGFjdGl2ZSovCglyZXBlYXRDbnQgPSAwOwoJZG8KCXsKCQl0ZW1wID0gKF9fcmF3X3JlYWRsKHByY21fYmFzZSArIENNX0FMV09OX1NESU9fQ0xLQ1RSTCkpID4+IDE2OwoJCXJlcGVhdENudCsrOwoJfQoJd2hpbGUoKHRlbXAgIT0gMCkgJiYgKHJlcGVhdENudCA8IFZQU19QUkNNX01BWF9SRVBfQ05UKSk7CgoJdGVtcCA9IDI7CglfX3Jhd193cml0ZWwodGVtcCwgKHByY21fYmFzZSArIENNX0hETUlfQ0xLQ1RSTF9PRkYpKTsKCXJlcGVhdENudCA9IDA7CglkbwoJewoJCXRlbXAgPSAoX19yYXdfcmVhZGwocHJjbV9iYXNlICsgQ01fSERNSV9DTEtDVFJMX09GRikpID4+IDE2OwoJCXJlcGVhdENudCsrOwoJfQoJd2hpbGUoKHRlbXAgIT0gMCkgJiYgKHJlcGVhdENudCA8IFZQU19QUkNNX01BWF9SRVBfQ05UKSk7CgoJVEhEQkcoIkhETUkgQ2xvY2tzIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKfQoKI2VuZGlmCgojaWZuZGVmIENPTkZJR19BUkNIX1RJODE2WApzdGF0aWMgdm9pZCBjb25maWd1cmVfaGRtaV9wbGwodm9sYXRpbGUgdTMyICBiX2FkZHIsCgkJdTMyIF9fbiwKCQl1MzIgX19tLAoJCXUzMiBfX20yLAoJCXUzMiBjbGtjdHJsX3ZhbCkKewoJdTMyIG0ybnZhbCwgbW4ydmFsLCByZWFkX2Nsa2N0cmw7Cgl1MzIgcmVhZF9tMm52YWwsIHJlYWRfbW4ydmFsOwoJdm9sYXRpbGUgdTMyIHJlcGVhdENudCA9IDA7CgkvKiBQdXQgUExMIGluIGlkbGUgYnlwYXNzIG1vZGUgKi8KCXJlYWRfY2xrY3RybCA9IF9fcmF3X3JlYWRsKGJfYWRkciArIEhETUlfUExMX0NMS0NUUkxfT0ZGKTsKCXJlYWRfY2xrY3RybCB8PSAweDEgPDwgMjM7CglfX3Jhd193cml0ZWwocmVhZF9jbGtjdHJsLCBiX2FkZHIgKyBIRE1JX1BMTF9DTEtDVFJMX09GRik7CgoJLyogcG9sbCBmb3IgdGhlIGJ5cGFzcyBhY2tub3dsZWRnZW1lbnQgKi8KCXJlcGVhdENudCA9IDB1OwoJd2hpbGUgKHJlcGVhdENudCA8IFZQU19QUkNNX01BWF9SRVBfQ05UKQoJewoJCWlmICgoKF9fcmF3X3JlYWRsKGJfYWRkcitIRE1JX1BMTF9TVEFUVVNfT0ZGKSkgJiAweDAwMDAwMTAxKSA9PSAweDAwMDAwMTAxKQoJCXsKCQkJYnJlYWs7CgkJfQoJCS8qIFdhaXQgZm9yIHRoZSAxMDAgY3ljbGVzICovCgkJdWRlbGF5KDEwMCk7CgkJcmVwZWF0Q250Kys7Cgl9CgoJaWYgKCgoX19yYXdfcmVhZGwoYl9hZGRyK0hETUlfUExMX1NUQVRVU19PRkYpKSAmIDB4MDAwMDAxMDEpID09IDB4MDAwMDAxMDEpCgl7CgkJOwoJfQoJZWxzZQoJewoJCXByaW50aygiTm90IGFibGUgdG8gS2VlcCBQTEwgaW4gYnlwYXNzIHN0YXRlISEhXG4iKTsKCX0KCW0ybnZhbCA9IChfX20yIDw8IDE2KSB8IF9fbjsKCW1uMnZhbCA9ICBfX207CgkvKnJlZl9jbGsgICAgID0gT1NDX0ZSRVEvKF9fbisxKTsKCSAgY2xrb3V0X2RjbyAgPSByZWZfY2xrKl9fbTsKCSAgY2xrX291dCAgICAgPSBjbGtvdXRfZGNvL19fbTI7CgkgKi8KCglfX3Jhd193cml0ZWwobTJudmFsLCAoYl9hZGRyK0hETUlfUExMX00yTkRJVl9PRkYpKTsKCXJlYWRfbTJudmFsID0gX19yYXdfcmVhZGwoKGJfYWRkcitIRE1JX1BMTF9NMk5ESVZfT0ZGKSk7CgoJX19yYXdfd3JpdGVsKG1uMnZhbCwgKGJfYWRkcitIRE1JX1BMTF9NTjJESVZfT0ZGKSk7CglyZWFkX21uMnZhbCA9IF9fcmF3X3JlYWRsKChiX2FkZHIrSERNSV9QTExfTU4yRElWX09GRikpOwoKCglfX3Jhd193cml0ZWwoMHgxLCAoYl9hZGRyK0hETUlfUExMX1RFTkFCTEVESVZfT0ZGKSk7CgoJX19yYXdfd3JpdGVsKDB4MCwgKGJfYWRkcitIRE1JX1BMTF9URU5BQkxFRElWX09GRikpOwoKCV9fcmF3X3dyaXRlbCgweDEsIChiX2FkZHIrSERNSV9QTExfVEVOQUJMRV9PRkYpKTsKCglfX3Jhd193cml0ZWwoMHgwLCAoYl9hZGRyK0hETUlfUExMX1RFTkFCTEVfT0ZGKSk7CgoJcmVhZF9jbGtjdHJsID0gX19yYXdfcmVhZGwoYl9hZGRyK0hETUlfUExMX0NMS0NUUkxfT0ZGKTsKCgkvKmNvbmZpZ3VyZSB0aGUgVElOSVRaKGJpdDApIGFuZCBDTEtEQ08gYml0cyBpZiByZXF1aXJlZCAqLwoJX19yYXdfd3JpdGVsKChyZWFkX2Nsa2N0cmwgJiAweGZmN2ZlM2ZmKSB8IGNsa2N0cmxfdmFsLCBiX2FkZHIrSERNSV9QTExfQ0xLQ1RSTF9PRkYpOwoKCXJlYWRfY2xrY3RybCA9IF9fcmF3X3JlYWRsKGJfYWRkcitIRE1JX1BMTF9DTEtDVFJMX09GRik7CgoKCS8qIHBvbGwgZm9yIHRoZSBmcmVxLHBoYXNlIGxvY2sgdG8gb2NjdXIgKi8KCXJlcGVhdENudCA9IDB1OwoJd2hpbGUgKHJlcGVhdENudCA8IFZQU19QUkNNX01BWF9SRVBfQ05UKQoJewoJCWlmICgoKF9fcmF3X3JlYWRsKGJfYWRkcitIRE1JX1BMTF9TVEFUVVNfT0ZGKSkgJiAweDAwMDAwNjAwKSA9PSAweDAwMDAwNjAwKQoJCXsKCQkJYnJlYWs7CgkJfQoJCS8qIFdhaXQgZm9yIHRoZSAxMDAgY3ljbGVzICovCgkJdWRlbGF5KDEwMCk7CgkJcmVwZWF0Q250Kys7Cgl9CgoJaWYgKCgoX19yYXdfcmVhZGwoYl9hZGRyK0hETUlfUExMX1NUQVRVU19PRkYpKSAmIDB4MDAwMDA2MDApID09IDB4MDAwMDA2MDApCgl7CgkJLypwcmludGsoIlBMTCBMb2NrZWRcbiIpOyovCgl9CgllbHNlCgl7CgkJcHJpbnRrKCJQTEwgTm90IEdldHRpbmcgTG9ja2VkISEhXG4iKTsKCX0KCgkvKndhaXQgZm90IHRoZSBjbG9ja3MgdG8gZ2V0IHN0YWJpemVkICovCgl1ZGVsYXkoMTAwKTsKfQoKI2VuZGlmCgovKiBJZGVhbGx5IHZlbmNzIHNob3VsZCBiZSBjb25maWd1cmVkIGZyb20gdGhlIEhEVlBTUyBkcml2ZXJzLglCdXQgaW4gY2FzZQogKiB3ZSB3YW50IHRvIHRlc3QgdGhlIEhETUkgdGhpcyBmdWN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0ZXN0CiAqIHBhdHRlcm4gb24gdmVuYyBhbmQgSERNSSBjYW4gYmUgdGVzdGVkIGluIGFic2VuY2Ugb2YgSERWUFNTIGRyaXZlcnMKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJVmVuYyBDb25maWd1cmF0aW9ucyAJCQkJICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmZGVmIEhETUlfVEVTVApzdGF0aWMgdm9pZCBjb25maWd1cmVfdmVuY18xMDgwcDMwKHUzMiAqdmVuY19iYXNlLCBpbnQgdXNlRW1iZWRkZWRTeW5jKQp7CglUSERCRygiJXMgJWRcbiIsICBfX2Z1bmNfXywgX19MSU5FX18pOwoJaWYgKHVzZUVtYmVkZGVkU3luYyAhPSAweDApCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwMkEwMzM7Cgl9CgllbHNlCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwM0EwMzM7Cgl9Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwM0YwMjc1OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxRUE1MDBCQjsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUY5OTAxQzI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFGRDcxRTY3OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDQwMDFDMjsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAyMDAyMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFCNkMwQzc3OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxQzBDMEMzMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUMwQzBDMzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDg0NDY1ODk4OwkvKiAweDI4ICovCgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDNGMDAwMDI4OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg1ODc4MDBCRjsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDA0NjA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMEMzOUU3OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg1ODc4MDExODsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMkE4NkQ7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwNDM4MDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwNTAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDMwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAwMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg1ODc4MDExMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMkE4NkQ7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwNDM4MDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwNTAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDMwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAwMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCn0KCnZvaWQgY29uZmlndXJlX3ZlbmNfMTA4MHA2MCh1MzIgKnZlbmNfYmFzZSwgaW50IHVzZUVtYmVkZGVkU3luYykKewoJVEhEQkcoIiVzICVkXG4iLCAgX19mdW5jX18sIF9fTElORV9fKTsKCWlmICh1c2VFbWJlZGRlZFN5bmMgIT0gMHgwKQoJewoJCSp2ZW5jX2Jhc2UgPSAweDQwMDJBMDMzOwoJfQoJZWxzZQoJewoJCSp2ZW5jX2Jhc2UgPSAweDQwMDNBMDMzOwoJfQoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDNGMDI3NTsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUVBNTAwQkI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFGOTkwMUMyOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxRkQ3MUU2NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDA0MDAxQzI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMjAwMjAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxQjZDMEM3NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUMwQzBDMzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFDMEMwQzMwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg4NDQ2NTg5ODsJLyogMHgyOCAqLwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgzRjAwMDAyODsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAwQkY7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAwNDYwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDBDMzlFNzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAxMTg7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDJBODZEOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDQzODAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAzMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAxMTA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDJBODZEOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDQzODAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAzMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDAwMDA7Cgp9CgoKdm9pZCBjb25maWd1cmVfdmVuY18xMDgwaTYwKHUzMiAqdmVuY19iYXNlLCBpbnQgdXNlRW1iZWRkZWRTeW5jKQp7CglUSERCRygiJXMgJWRcbiIsICBfX2Z1bmNfXywgX19MSU5FX18pOwoJaWYgKHVzZUVtYmVkZGVkU3luYyAhPSAweDApCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwMkEwMzM7Cgl9CgllbHNlCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwM0EwM0E7Cgl9CgoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDNGMDI3NTsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUVBNTAwQkI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFGOTkwMUMyOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxRkQ3MUU2NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDA0MDAxQzI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMjAwMjAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxQjZDMEM3NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUMwQzBDMzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFDMEMwQzMwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg4NDQ2NTg5ODsJLyogMHgyOCAqLwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgzRjI0NTAxMzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAwQzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAwMjMwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDBDMzlFNzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAwQzE7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDE1ODZEOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDIxQzI0NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAyMUM7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDA1MDAxMjMyOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDIzNDIzNDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTg3ODAwQzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDE1ODZEOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDIxQzI0NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAyMUM7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDA1MDAxMjMyOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDAwMDA7Cn0KCnZvaWQgY29uZmlndXJlX3ZlbmNfNzIwcDYwKHUzMiogdmVuY19iYXNlLCBpbnQgdXNlRW1iZWRkZWRTeW5jKQp7CglUSERCRygiJXMgJWRcbiIsICBfX2Z1bmNfXywgX19MSU5FX18pOwoJaWYgKHVzZUVtYmVkZGVkU3luYyAhPSAweDApCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwMkEwMzM7Cgl9CgllbHNlCgl7CgkJKnZlbmNfYmFzZSA9IDB4NDAwM0EwMzM7Cgl9CgoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxRkQwMUUyNDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDJEQzAyMEM7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwREEwMDRBOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMjBDMUU2QzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDIwMDFGODg7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMjAwMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgxQjZDMEM3NzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MUMwQzBDMzA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDFDMEMwQzMwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHg4NDJFRTY3MjsJLyogMHgyOCAqLwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgzRjAwMDAxODsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTA1MDAxMDM7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAwMkU4OwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDBDMzlFNzsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTA1MDAxNzI7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDFBNjRCOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDJEMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAzMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4NTA1MDAxNkE7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDFBNjRCOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDJEMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDUwMDAwMDA7Cgl2ZW5jX2Jhc2UrKzsKCSp2ZW5jX2Jhc2UgPSAweDAwMDAzMDAwOwoJdmVuY19iYXNlKys7CgkqdmVuY19iYXNlID0gMHgwMDAwMDAwMDsKCXZlbmNfYmFzZSsrOwoJKnZlbmNfYmFzZSA9IDB4MDAwMDAwMDA7Cn0KI2VuZGlmCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qCQkJICBHbG9iYWwgRnVuY3Rpb25zCQkJCSAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgppbnQgdGk4MXh4X2hkbWlfbGliX2luaXQoc3RydWN0IHRpODF4eF9oZG1pX2luaXRfcGFyYW1zICppbml0X3BhcmFtLAoJCWVudW0gdGk4MXh4aGRtaV9tb2RlIGhkbWlfbW9kZSkKewoJaW50IHJ0bl92YWx1ZSA9IDB4MDsKCWlmIChpbml0X3BhcmFtID09IE5VTEwpIHsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJVEhEQkcoImhkbWkgTW9kZSBwYXNzZWQgPSAlZFxuIiwgaGRtaV9tb2RlKTsKCWhkbWlfY29uZmlnLmlzX3JlY3ZyX3NlbnNlZCA9IEZBTFNFOwoJaGRtaV9jb25maWcuaXNfc3RyZWFtaW5nID0gRkFMU0U7CgloZG1pX2NvbmZpZy5pc19zY2xfY2xvY2tlZCA9IEZBTFNFOwoJaGRtaV9jb25maWcudlN5bmNfY291bnRlciA9IDB4MDsKCWhkbWlfY29uZmlnLmlzX2ludGVybGFjZWQgPSBGQUxTRTsKCgloZG1pX2NvbmZpZy5jb3JlX2Jhc2VfYWRkciA9IGluaXRfcGFyYW0tPmNvcmVfYmFzZV9hZGRyOwoJaGRtaV9jb25maWcud3BfYmFzZV9hZGRyID0gaW5pdF9wYXJhbS0+d3BfYmFzZV9hZGRyOwoJaGRtaV9jb25maWcucGh5X2Jhc2VfYWRkciA9IGluaXRfcGFyYW0tPnBoeV9iYXNlX2FkZHI7CgloZG1pX2NvbmZpZy5wcmNtX2Jhc2VfYWRkciA9IGluaXRfcGFyYW0tPnByY21fYmFzZV9hZGRyOwoJaGRtaV9jb25maWcudmVuY19iYXNlX2FkZHIgPSBpbml0X3BhcmFtLT52ZW5jX2Jhc2VfYWRkcjsKCWhkbWlfY29uZmlnLmhkbWlfcGxsX2Jhc2VfYWRkciA9IGluaXRfcGFyYW0tPmhkbWlfcGxsX2Jhc2VfYWRkcjsKCgllbmFibGVfaGRtaV9jbG9ja3MoaGRtaV9jb25maWcucHJjbV9iYXNlX2FkZHIpOwoKCWlmICgtMSAhPSBoZG1pX21vZGUpCgl7CgkJdGk4MXh4X2hkbWlfc2V0X21vZGUoaGRtaV9tb2RlLCAmaGRtaV9jb25maWcpOwoJCXRpODF4eF9oZG1pX2xpYl9jb25maWcoJmhkbWlfY29uZmlnLmNvbmZpZyk7CgkJdGk4MXh4X2hkbWlfbGliX3N0YXJ0KCZoZG1pX2NvbmZpZywgTlVMTCk7Cgl9CgllbHNlCgl7CgkJbWVtY3B5KCgodm9pZCAqKSAmKGhkbWlfY29uZmlnLmNvbmZpZykpLAoJCQkJKCh2b2lkICopICZkZWZhdWx0X2NvbmZpZyksCgkJCQlzaXplb2Yoc3RydWN0IGhkbWlfY2ZnX3BhcmFtcykpOwoJfQpleGl0X3RoaXNfZnVuYzoKCXJldHVybiAocnRuX3ZhbHVlKTsKfQoKCmludCB0aTgxeHhfaGRtaV9jb3B5X21vZGVfY29uZmlnKGVudW0gdGk4MXh4aGRtaV9tb2RlIGhkbWlfbW9kZSwKCQlzdHJ1Y3QgaW5zdGFuY2VfY2ZnICpjZmcpCnsKCWludCByZXRfdmFsID0gMDsKCglUSERCRygiJXMgJWQgaGRtaV9tb2RlID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaGRtaV9tb2RlKTsKCXN3aXRjaCAoaGRtaV9tb2RlKQoJewoJCWNhc2UgaGRtaV8xMDgwUF82MF9tb2RlOgoJCQltZW1jcHkoJmNmZy0+Y29uZmlnLCAmY29uZmlnXzEwODBwNjAsCgkJCQkJc2l6ZW9mKHN0cnVjdCBoZG1pX2NmZ19wYXJhbXMpKTsKI2lmZGVmIEhETUlfVEVTVAoJCQljb25maWd1cmVfdmVuY18xMDgwcDYwKAoJCQkJCSh1MzIgKiloZG1pX2NvbmZpZy52ZW5jX2Jhc2VfYWRkciwgMCk7CiNlbmRpZgoJCQlicmVhazsKCQljYXNlIGhkbWlfNzIwUF82MF9tb2RlOgoJCQltZW1jcHkoJmNmZy0+Y29uZmlnLCAmY29uZmlnXzcyMHA2MCwKCQkJCQlzaXplb2Yoc3RydWN0IGhkbWlfY2ZnX3BhcmFtcykpOwojaWZkZWYgSERNSV9URVNUCgkJCWNvbmZpZ3VyZV92ZW5jXzcyMHA2MCgKCQkJCQkodTMyICopaGRtaV9jb25maWcudmVuY19iYXNlX2FkZHIsIDApOwojZW5kaWYKCQkJYnJlYWs7CgkJY2FzZSBoZG1pXzEwODBJXzYwX21vZGU6CgkJCW1lbWNweSgmY2ZnLT5jb25maWcsICZjb25maWdfMTA4MGk2MCwKCQkJCQlzaXplb2Yoc3RydWN0IGhkbWlfY2ZnX3BhcmFtcykpOwojaWZkZWYgSERNSV9URVNUCgkJCWNvbmZpZ3VyZV92ZW5jXzEwODBpNjAoCgkJCQkJKHUzMiAqKWhkbWlfY29uZmlnLnZlbmNfYmFzZV9hZGRyLCAwKTsKI2VuZGlmCgkJCWJyZWFrOwoJCWNhc2UgaGRtaV8xMDgwUF8zMF9tb2RlOgoJCQltZW1jcHkoJmNmZy0+Y29uZmlnLCAmY29uZmlnXzEwODBwMzAsCgkJCQkJc2l6ZW9mKHN0cnVjdCBoZG1pX2NmZ19wYXJhbXMpKTsKI2lmZGVmIEhETUlfVEVTVAoJCQljb25maWd1cmVfdmVuY18xMDgwcDMwKAoJCQkJCSh1MzIgKiloZG1pX2NvbmZpZy52ZW5jX2Jhc2VfYWRkciwgMCk7CiNlbmRpZgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlyZXRfdmFsID0gLTE7OwoJfQoJaWYgKCFyZXRfdmFsKQoJCWNmZy0+aGRtaV9tb2RlID0gaGRtaV9tb2RlOwoJcmV0dXJuIHJldF92YWw7Cn0KCgppbnQgdGk4MXh4X2hkbWlfbGliX2RlaW5pdCh2b2lkICphcmdzKQp7Cgl0aTgxeHhfaGRtaV9saWJfc3RvcCgmaGRtaV9jb25maWcsIE5VTEwpOwoJaGRtaV9jb25maWcuaXNfcmVjdnJfc2Vuc2VkID0gRkFMU0U7CgloZG1pX2NvbmZpZy5pc19zdHJlYW1pbmcgPSBGQUxTRTsKCWhkbWlfY29uZmlnLmlzX3NjbF9jbG9ja2VkID0gRkFMU0U7CgloZG1pX2NvbmZpZy52U3luY19jb3VudGVyID0gMHgwOwoJaGRtaV9jb25maWcuaXNfaW50ZXJsYWNlZCA9IEZBTFNFOwoJaGRtaV9jb25maWcuY29yZV9iYXNlX2FkZHIgPSAwOwoJaGRtaV9jb25maWcud3BfYmFzZV9hZGRyID0gMDsKCWhkbWlfY29uZmlnLnBoeV9iYXNlX2FkZHIgPSAwOwoJaGRtaV9jb25maWcucHJjbV9iYXNlX2FkZHIgPSAwOwoJaGRtaV9jb25maWcudmVuY19iYXNlX2FkZHIgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qIE9wZW4gCS0gUG93ZXIgdXAgdGhlIGNsb2NrIGZvciB0aGUgRERDIGFuZCBrZWVwcyBpdCBPTi4KICoJCQktIFJlZ2lzdGVyIHRoZSBpbnQsIHVwZGF0ZSBIUEQgaWYgcmVxdWlyZWQKICovCnZvaWQgKnRpODF4eF9oZG1pX2xpYl9vcGVuKHUzMiBpbnN0YW5jZSwgaW50ICpzdGF0dXMsIHZvaWQgKmFyZ3MpCnsKCXN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCA9IE5VTEw7Cgkqc3RhdHVzID0gMDsKCWluc3RfY29udGV4dCA9ICYoaGRtaV9jb25maWcpOwoJcmV0dXJuIGluc3RfY29udGV4dDsKfQoKaW50IHRpODF4eF9oZG1pX2xpYl9jb25maWcoc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyAqY29uZmlnKQp7CglzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQgPSBOVUxMOwoJaW50IHJ0bl92YWx1ZSA9IDB4MDsKCXZvbGF0aWxlIHUzMiByZXNldF90aW1lX291dDsKCXZvbGF0aWxlIHUzMiB0ZW1wOwoKCWluc3RfY29udGV4dCA9ICYoaGRtaV9jb25maWcpOwoJaWYgKGNvbmZpZyAhPSBOVUxMKSB7CgkJaWYgKGNoZWNrX2NvcHlfY29uZmlnKCYoaGRtaV9jb25maWcpLCBjb25maWcpICE9IDB4MCkgewoJCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9Cgl9CglyZXNldF90aW1lX291dCA9IEhETUlfV1BfUkVTRVRfVElNRU9VVDsKCXRlbXAgPQoJCV9fcmF3X3JlYWRsKGluc3RfY29udGV4dC0+d3BfYmFzZV9hZGRyICsKCQkJCUhETUlfV1BfU1lTQ09ORklHX09GRlNFVCk7Cgl0ZW1wIHw9IEhETUlfV1BfU1lTQ09ORklHX1NPRlRSRVNFVF9NQVNLOwoJX19yYXdfd3JpdGVsKHRlbXAsCgkJCShpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCSBIRE1JX1dQX1NZU0NPTkZJR19PRkZTRVQpKTsKCgl3aGlsZSAoKChfX3Jhd19yZWFkbAoJCQkJCShpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCQkJIEhETUlfV1BfU1lTQ09ORklHX09GRlNFVCkpICYKCQkJCUhETUlfV1BfU1lTQ09ORklHX1NPRlRSRVNFVF9NQVNLKSA9PQoJCQlIRE1JX1dQX1NZU0NPTkZJR19TT0ZUUkVTRVRfTUFTSykgewoJCXJlc2V0X3RpbWVfb3V0LS07CgkJaWYgKHJlc2V0X3RpbWVfb3V0ID09IDB4MCkgewoJCQlUSERCRygiQ291bGQgbm90IHJlc2V0IHdyYXBwZXJcbiAiKTsKCQkJcnRuX3ZhbHVlID0gLUVGQVVMVCA7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJfQoKCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9waHkoaW5zdF9jb250ZXh0KTsKCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJVEhEQkcoIkNvdWxkIG5vdCBjb25maWd1cmUgUEhZXG4iKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoKCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV93cmFwcGVyKGluc3RfY29udGV4dCk7CglpZiAocnRuX3ZhbHVlICE9IDB4MCkgewoJCVRIREJHKCJDb3VsZCBub3QgY29uZmlndXJlIHdyYXBwZXJcbiIpOwoJCXJ0bl92YWx1ZSA9IC1FSU5WQUwgOwoJfQoKCXRlbXAgPSBfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCUhETUlfV1BfQVVESU9fQ1RSTF9PRkZTRVQpOwoJdGVtcCAmPSAofihIRE1JX1dQX0FVRElPX0NUUkxfRElTQUJMRV9NQVNLKSk7CglfX3Jhd193cml0ZWwodGVtcCwgKGluc3RfY29udGV4dC0+d3BfYmFzZV9hZGRyICsKCQkJCUhETUlfV1BfQVVESU9fQ1RSTF9PRkZTRVQpKTsKCV9fcmF3X3dyaXRlbCgweDAsIChpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCQlIRE1JX1dQX0FVRElPX0NGR19PRkZTRVQpKTsKCgl0ZW1wID0gX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCUhETUlfQ09SRV9TWVNfU1RBVF9PRkZTRVQpOwoJdGVtcCA9ICh0ZW1wICYgSERNSV9TWVNfU1RBVF9IUERfTUFTSykgPj4KCQlIRE1JX1NZU19TVEFUX0hQRF9TSElGVDsKCWlmICh0ZW1wKXsKCQkJaW5zdF9jb250ZXh0LT5pc19yZWN2cl9zZW5zZWQgPSBUUlVFOwoJCQlUSERCRygiRGV0ZWN0ZWQgYSBzaW5rIik7Cgl9IGVsc2UgewoJCQlUSERCRygiU2luayBub3QgZGV0ZWN0ZWRcbiIpOwoJfQoJdGVtcCA9IF9fcmF3X3JlYWRsKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQlIRE1JX0NPUkVfU1JTVF9PRkZTRVQpOwoJdGVtcCB8PSBIRE1JX1NSU1RfU1dSU1RfTUFTSzsKCV9fcmF3X3dyaXRlbCh0ZW1wLAoJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArIEhETUlfQ09SRV9TUlNUX09GRlNFVCkpOwoKCXRlbXAgPSBfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJSERNSV9DT1JFX1NZU19DVFJMMV9PRkZTRVQpOwoJdGVtcCB8PSBIRE1JX1NZU19DVFJMMV9QRF9NQVNLOwoJX19yYXdfd3JpdGVsKHRlbXAsCgkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX1NZU19DVFJMMV9PRkZTRVQpKTsKCglydG5fdmFsdWUgPSBjb25maWd1cmVfY29yZShpbnN0X2NvbnRleHQpOwoJaWYgKHJ0bl92YWx1ZSAhPSAweDApIHsKCQlUSERCRygiQ291bGQgbm90IGNmZyBjb3JlXG4iKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJX19yYXdfd3JpdGVsKDB4MCwKCQkJKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKyBIRE1JX0NPUkVfQVVEX01PREVfT0ZGU0VUKSk7CmV4aXRfdGhpc19mdW5jOgoJcmV0dXJuIChydG5fdmFsdWUpOwp9CmludCB0aTgxeHhfaGRtaV9zZXRfbW9kZShlbnVtIHRpODF4eGhkbWlfbW9kZSBoZG1pX21vZGUsCgkJc3RydWN0IGluc3RhbmNlX2NmZyAqY2ZnKQp7CglpbnQgcnRuX3ZhbHVlID0gMDsKI2lmbmRlZiBDT05GSUdfQVJDSF9USTgxNlgKCXN0cnVjdCBoZG1pX3BsbF9jdHJsICpwbGxfY3RybDsKI2VuZGlmCglpZiAoIWNmZykKCXsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaWYgKGhkbWlfbW9kZSA8IGhkbWlfbnRzY19tb2RlIHx8IGhkbWlfbW9kZSA+PSBoZG1pX21heF9tb2RlKQoJewoJCXJ0bl92YWx1ZSA9IC1FSU5WQUw7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCXRpODF4eF9oZG1pX2NvcHlfbW9kZV9jb25maWcoaGRtaV9tb2RlLCBjZmcpOwojaWZuZGVmIENPTkZJR19BUkNIX1RJODE2WAoJLyogU2V0IHRoZSBQTEwgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIHNlbGVjdGVkICovCglzd2l0Y2ggKGhkbWlfbW9kZSkKCXsKCQljYXNlIGhkbWlfMTA4MFBfMzBfbW9kZToKCQljYXNlIGhkbWlfMTA4MElfNjBfbW9kZToKCQljYXNlIGhkbWlfNzIwUF82MF9tb2RlOgoJCQlwbGxfY3RybCA9ICZncGxsX2N0cmxbMV07CgkJCWJyZWFrOwoJCWNhc2UgaGRtaV8xMDgwUF82MF9tb2RlOgoJCQlwbGxfY3RybCA9ICZncGxsX2N0cmxbMF07CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXByaW50aygiTW9kZSBwYXNzZWQgaXMgaW5jb3JyZWN0XG4iKTsKCQkJcGxsX2N0cmwgPSAmZ3BsbF9jdHJsWzFdOwoJfQoJY29uZmlndXJlX2hkbWlfcGxsKGNmZy0+aGRtaV9wbGxfYmFzZV9hZGRyLCBwbGxfY3RybC0+X19uLCBwbGxfY3RybC0+X19tLAoJCQlwbGxfY3RybC0+X19tMiwgcGxsX2N0cmwtPmNsa19jdHJsX3ZhbHVlKTsKI2VuZGlmCgoKCglydG5fdmFsdWUgPSB0aTgxeHhfaGRtaV9saWJfY29uZmlnKCZjZmctPmNvbmZpZyk7CmV4aXRfdGhpc19mdW5jOgoJcmV0dXJuIHJ0bl92YWx1ZTsKCn0KCmludCB0aTgxeHhfaGRtaV9saWJfY2xvc2Uodm9pZCAqaGFuZGxlLCB2b2lkICphcmdzKQp7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0ID0gTlVMTDsKCVRIREJHKCI+Pj4+dGk4MXh4X2hkbWlfbGliX2Nsb3NlXG4iKTsKCUhETUlfQVJHU19DSEVDSygoYXJncyA9PSBOVUxMKSk7CgoJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CgkJcnRuX3ZhbHVlID0gLUVGQVVMVCA7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCWluc3RfY29udGV4dCA9IChzdHJ1Y3QgaW5zdGFuY2VfY2ZnICopIGhhbmRsZTsKCWlmIChpbnN0X2NvbnRleHQtPmlzX3N0cmVhbWluZyA9PSBGQUxTRSkgewoJCXJ0bl92YWx1ZSA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJcnRuX3ZhbHVlID0gLUVGQVVMVCA7CmV4aXRfdGhpc19mdW5jOgoJVEhEQkcoInRpODF4eF9oZG1pX2xpYl9jbG9zZTw8PDxcbiIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgovKiBUT0RPIE5vdCBzdXBwb3J0ZWQgZm9yIG5vdyAqLwojaWYgMApzdGF0aWMgaW50IHRpODF4eF9oZG1pX2xpYl9nZXRfY2ZnKHZvaWQgKmhhbmRsZSwKCQlzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zICpjb25maWcsIHZvaWQgKmFyZ3MpCnsKCWludCBydG5fdmFsdWUgPSAweDA7CglzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQgPSBOVUxMOwoJVEhEQkcoIj4+Pj50aTgxeHhfaGRtaV9saWJfZ2V0X2NmZyIpOwoJSERNSV9BUkdTX0NIRUNLKChhcmdzID09IE5VTEwpKTsKCWlmICgoaGFuZGxlID09IE5VTEwpIHx8IChjb25maWcgPT0gTlVMTCkpIHsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlUSERCRygiSW52YWxpZCBoYW5kbGUvY29uZmlnIHBvaW50ZXIiKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaW5zdF9jb250ZXh0ID0gKHN0cnVjdCBpbnN0YW5jZV9jZmcgKikgaGFuZGxlOwoJLyogQ29weSB0aGUgY29uZmlndXJhdGlvbnMgKi8KCW1lbWNweSgodm9pZCAqKSBjb25maWcsCgkJCSgoY29uc3Qgdm9pZCAqKSAmKGluc3RfY29udGV4dC0+Y29uZmlnKSksCgkJCXNpemVvZihzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zKSk7CgkvKiBUdXJuIE9GRiB0aGUgY29uZmlnIHVwZGF0ZSBmbGFncyAqLwoJY29uZmlnLT51c2VfZGlzcGxheV9tb2RlID0gMHgwOwoJY29uZmlnLT51c2Vfd3BfY29uZmlnID0gMHgwOwoJY29uZmlnLT51c2VfY29yZV9jb25maWcgPSAweDA7Cgljb25maWctPnVzZV9jb3JlX3BhdGhfY29uZmlnID0gMHgwOwoJY29uZmlnLT51c2VfaW5mb19mcmFtZV9jb25maWcgPSAweDA7CgpleGl0X3RoaXNfZnVuYzoKCVRIREJHKCJ0aTgxeHhfaGRtaV9saWJfZ2V0X2NmZzw8PDwiKTsKCXJldHVybiAocnRuX3ZhbHVlKTsKfQpzdGF0aWMgaW50IHRpODF4eF9oZG1pX2xpYl9zZXRfY2ZnKHZvaWQgKmhhbmRsZSwKCQlzdHJ1Y3QgaGRtaV9jZmdfcGFyYW1zICpjb25maWcsIHZvaWQgKmFyZ3MpCnsKCXN0cnVjdCBpbnN0YW5jZV9jZmcgKmluc3RfY29udGV4dCA9IE5VTEw7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJdm9sYXRpbGUgdTMyIHRlbXA7CgoJVEhEQkcoIj4+Pj50aTgxeHhfaGRtaV9saWJfc2V0X2NmZyIpOwoJSERNSV9BUkdTX0NIRUNLKChhcmdzID09IE5VTEwpKTsKCglpbnN0X2NvbnRleHQgPSAoc3RydWN0IGluc3RhbmNlX2NmZyAqKSBoYW5kbGU7CglIRE1JX0FSR1NfQ0hFQ0soCgkJCShpbnN0X2NvbnRleHQtPmNvcmVSZWdPdnJsYXkgIT0gTlVMTCkpOwoJaWYgKGluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nID09IFRSVUUpIHsKCQlUSERCRygiU3RyZWFtaW5nIC0gY2Fubm90IHJlLWNvbmZpZ3VyZSIpOwoJCXJ0bl92YWx1ZSA9IC1FSU5WQUwgOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CglpZiAoY29uZmlnID09IE5VTEwpIHsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoKCXJ0bl92YWx1ZSA9IGNoZWNrX2NvcHlfY29uZmlnKGluc3RfY29udGV4dCwgY29uZmlnKTsKCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCglydG5fdmFsdWUgPSBjb25maWd1cmVfcGh5KGluc3RfY29udGV4dCk7CglpZiAocnRuX3ZhbHVlICE9IDB4MCkgewoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CgoJaWYgKGNvbmZpZy0+dXNlX3dwX2NvbmZpZyAhPSAweDApIHsKCQlydG5fdmFsdWUgPSBjb25maWd1cmVfd3JhcHBlcihpbnN0X2NvbnRleHQpOwoJCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJCVRIREJHKCJDb3VsZCBub3QgY29uZmlndXJlIHdyYXBwZXIiKTsKCQkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJfQoKCWluc3RfY29udGV4dC0+Y29yZVJlZ092cmxheS0+U1JTVCB8PQoJCUNTTF9IRE1JX1NSU1RfU1dSU1RfTUFTSzsKCWluc3RfY29udGV4dC0+Y29yZVJlZ092cmxheS0+U1lTX0NUUkwxICY9CgkJKH4oQ1NMX0hETUlfU1lTX0NUUkwxX1BEX01BU0spKTsKCglpZiAoKGNvbmZpZy0+dXNlX2NvcmVfY29uZmlnICE9IDB4MCkgfHwKCQkJKGNvbmZpZy0+dXNlX2NvcmVfcGF0aF9jb25maWcgIT0gMHgwKSkgewoJCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9jb3JlKGluc3RfY29udGV4dCk7CgkJaWYgKHJ0bl92YWx1ZSAhPSAweDApIHsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9Cgl9IGVsc2UgewoJCXJ0bl92YWx1ZSA9CgkJCWRldGVybWluZV9waXhlbF9yZXBlYXRhdGlvbihpbnN0X2NvbnRleHQpOwoJCS8qIE5vIHBpeGVsIHJlcGV0YXRpb24gLSBieSBkZWZhdWx0ICovCgkJaW5zdF9jb250ZXh0LT5jb3JlUmVnT3ZybGF5LT5WSURfQ1RSTCAmPQoJCQkofihDU0xfSERNSV9WSURfQ1RSTF9JQ0xLX01BU0spKTsKCQlpZiAocnRuX3ZhbHVlID09IEhETUlfUElYRUxfUkVQTEVDQVRFRF9PTkNFKSB7CgkJCS8qIFJlcGVhdCBvbmNlICovCgkJCWluc3RfY29udGV4dC0+Y29yZVJlZ092cmxheS0+VklEX0NUUkwgfD0KCQkJCSgoKDB4MDF1KSA8PAoJCQkJICBDU0xfSERNSV9WSURfQ1RSTF9JQ0xLX1NISUZUKSAmCgkJCQkgQ1NMX0hETUlfVklEX0NUUkxfSUNMS19NQVNLKTsKCQl9IGVsc2UgaWYgKHJ0bl92YWx1ZSA9PQoJCQkJSERNSV9QSVhFTF9SRVBMRUNBVEVEX0ZPVVJfVElNRVMpIHsKCQkJaW5zdF9jb250ZXh0LT5jb3JlUmVnT3ZybGF5LT5WSURfQ1RSTCB8PQoJCQkJQ1NMX0hETUlfVklEX0NUUkxfSUNMS19NQVNLOwoJCX0gZWxzZSBpZiAocnRuX3ZhbHVlID09IDB4MCkgewoJCQlUSERCRygiTm8gUGl4ZWwgcmVwZWF0YXRpb24gcmVxdWlyZWQiKTsKCQl9IGVsc2UgewoJCQkvKiBFcnJvciBsZXQgdGhlIGNhbGxlciBrbm93ICovCgkJCVRIREJHKCJDb3VsZCBub3QgZGV0ZXJtaW5lIHBpeGVsICIpOwoJCQlUSERCRygiIHJhdGUgdGhhdCB3b3VsZCBiZSByZXF1aXJlZC4iKTsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9CgkJLyogUG93ZXIgdXAgY29yZSBhbmQgYnJpbmcgaXQgb3V0IG9mIHJlc2V0LiAqLwoJCWluc3RfY29udGV4dC0+Y29yZVJlZ092cmxheS0+U1lTX0NUUkwxIHw9CgkJCUNTTF9IRE1JX1NZU19DVFJMMV9QRF9NQVNLOwoJCWluc3RfY29udGV4dC0+Y29yZVJlZ092cmxheS0+U1JTVCAmPQoJCQkofihDU0xfSERNSV9TUlNUX1NXUlNUX01BU0spKTsKCX0KCS8qCgkgKiBTdGVwIDQKCSAqIFJlLWNvbmZpZ3VyZSB0aGUgd3JhcHBlciB3aXRoIHRoZSBzY2FuIHR5cGUuIEl0IG1pZ2h0IGhhdmUgY2hhbmdlZC4KCSAqLwoJdGVtcCA9CgkJX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHIgKwoJCQkJSERNSV9XUF9WSURFT19DRkdfT0ZGU0VUKTsKCWlmIChpbnN0X2NvbnRleHQtPmlzX2ludGVybGFjZWQgPT0gVFJVRSkgewoJCXRlbXAgfD0KCQkJSERNSV9XUF9WSURFT19DRkdfUFJPR1JFU1NJVkVfSU5URVJMQUNFX01BU0s7Cgl9IGVsc2UgewoJCXRlbXAgJj0KCQkJKH4KCQkJIChIRE1JX1dQX1ZJREVPX0NGR19QUk9HUkVTU0lWRV9JTlRFUkxBQ0VfTUFTSykpOwoJfQoJX19yYXdfd3JpdGVsKHRlbXAsCgkJCShpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCSBIRE1JX1dQX1ZJREVPX0NGR19PRkZTRVQpKTsKCgkvKiBTdGVwIDQgLSBDb25maWd1cmUgQVZJIEluZm8gZnJhbWUgYW5kIGVuYWJsZSB0aGVtIHRvIGJlIHRyYW5zbWl0dGVkCgkgICBldmVyeSBmcmFtZSAqLwoJaWYgKGNvbmZpZy0+dXNlX2luZm9fZnJhbWVfY29uZmlnICE9IDB4MCkgewoJCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9hdmlfaW5mb19mcmFtZShpbnN0X2NvbnRleHQpOwoJCWlmIChydG5fdmFsdWUgIT0gMHgwKSB7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJCS8qCgkJICogUG9saWN5CgkJICogMS4gRW5hYmxpbmcgY29udGluaW91cyB0cmFuc21pc3Npb24gb2YgQVZJIEluZm9ybWF0aW9uIHBhY2tldHMKCQkgKi8KCQlpbnN0X2NvbnRleHQtPmNvcmVSZWdPdnJsYXktPlBCX0NUUkwxIHw9CgkJCShDU0xfSERNSV9QQl9DVFJMMV9BVklfRU5fTUFTSyB8CgkJCSBDU0xfSERNSV9QQl9DVFJMMV9BVklfUlBUX01BU0spOwoJfQpleGl0X3RoaXNfZnVuYzoKCVRIREJHKCJ0aTgxeHhfaGRtaV9saWJfc2V0X2NmZzw8PDwiKTsKCXJldHVybiAocnRuX3ZhbHVlKTsKfQojZW5kaWYKCmludCB0aTgxeHhfaGRtaV9saWJfc3RhcnQodm9pZCAqaGFuZGxlLCB2b2lkICphcmdzKQp7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0ID0gTlVMTDsKCXZvbGF0aWxlIHUzMiB0ZW1wOwoKCgoJVEhEQkcoIj4+Pj50aTgxeHhfaGRtaV9saWJfc3RhcnQiKTsKCglpZiAoaGFuZGxlID09IE5VTEwpIHsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlUSERCRygiSW52YWxpZCBoYW5kbGUvY29uZmlnIHBvaW50ZXIiKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaW5zdF9jb250ZXh0ID0gKHN0cnVjdCBpbnN0YW5jZV9jZmcgKikgaGFuZGxlOwoJaWYgKGluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nID09IEZBTFNFKXsKCgkJdGVtcCAgPSBfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyCgkJCQkrIEhETUlfQ09SRV9TWVNfU1RBVF9PRkZTRVQpOwoJCXRlbXAgJj0gSERNSV9TWVNfU1RBVF9IUERfTUFTSzsKCQlpZiAoIXRlbXApCgkJewoJCQlUSERCRygiU2luayBub3QgZGV0ZWN0ZWRcbiIpOwoJCX0KCgkJVEhEQkcoIlRyeWluZyB0byBzdGFydCB0aGUgcG9ydCIpOwoKCQl0ZW1wID0gX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQlIRE1JX0NPUkVfU1lTX0NUUkwxX09GRlNFVCk7CgkJdGVtcCB8PSBIRE1JX1NZU19DVFJMMV9QRF9NQVNLOwoJCV9fcmF3X3dyaXRlbCh0ZW1wLAoJCQkJKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKyBIRE1JX0NPUkVfU1lTX0NUUkwxX09GRlNFVCkpOwoKCQl0ZW1wID0gX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQlIRE1JX0NPUkVfU1JTVF9PRkZTRVQpOwoJCXRlbXAgJj0gKH4oSERNSV9TUlNUX1NXUlNUX01BU0spKTsKCQlfX3Jhd193cml0ZWwodGVtcCwKCQkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX1NSU1RfT0ZGU0VUKSk7CgoJCS8qCgkJICogQ29uZmlndXJlIGNvcmUgd291bGQgaGF2ZSB1cGRhdGVkIHRoZSBnbG9iYWwgbWVtYmVyIHRvCgkJICogc3BlY2lmeSB0aGUgc2NhbiB0eXBlIHVwZGF0ZSB0aGUgd3JhcHBlciB3aXRoIHNhbWUgaW5mbwoJCSAqLwoJCXRlbXAgPQoJCQlfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCQkJSERNSV9XUF9WSURFT19DRkdfT0ZGU0VUKTsKCgkJaWYgKGluc3RfY29udGV4dC0+aXNfaW50ZXJsYWNlZCA9PSBUUlVFKSB7CgkJCXRlbXAgfD0gSERNSV9XUF9WSURFT19DRkdfUFJPR1JFU1NJVkVfSU5URVJMQUNFX01BU0s7CgkJfSBlbHNlIHsKCQkJdGVtcCAmPQoJCQkJKH4oSERNSV9XUF9WSURFT19DRkdfUFJPR1JFU1NJVkVfSU5URVJMQUNFX01BU0spKTsKCQl9CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHIgKwoJCQkJIEhETUlfV1BfVklERU9fQ0ZHX09GRlNFVCkpOwoKCQlydG5fdmFsdWUgPSBjb25maWd1cmVfYXZpX2luZm9fZnJhbWUoaW5zdF9jb250ZXh0KTsKCQlpZiAocnRuX3ZhbHVlICE9IDB4MCkgewoJCQlUSERCRygiQ291bGQgbm90IGNvbmZpZ3VyZSBBVkkgSW5mbyBmcmFtZXMiKTsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9CgoJCXJ0bl92YWx1ZSA9IGNvbmZpZ3VyZV9jdHJsX3BhY2tldHMoaW5zdF9jb250ZXh0KTsKCQlpZiAocnRuX3ZhbHVlICE9IDB4MCkgewoJCQlUSERCRygiQ291bGQgbm90IGNmZyBjb250cm9sIHBhY2tldHMiKTsKCQkJZ290byBleGl0X3RoaXNfZnVuYzsKCQl9CgoJCXRlbXAgPSBfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCUhETUlfQ09SRV9QQl9DVFJMMV9PRkZTRVQpOwoJCXRlbXAgPSAoSERNSV9QQl9DVFJMMV9BVklfRU5fTUFTSwoJCQkJfCBIRE1JX1BCX0NUUkwxX0FWSV9SUFRfTUFTSyk7CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQkgSERNSV9DT1JFX1BCX0NUUkwxX09GRlNFVCkpOwoKCQl0ZW1wID0gX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQlIRE1JX0NPUkVfVklEX01PREVfT0ZGU0VUKTsKCQl0ZW1wID0gKCh0ZW1wICYgSERNSV9WSURfTU9ERV9ESVRIRVJfTU9ERV9NQVNLKSA+PgoJCQkJSERNSV9WSURfTU9ERV9ESVRIRVJfTU9ERV9TSElGVCk7CgkJLyogR2VuZXJhbCBjb250cm9sIHBhY2tldHMgYXJlIHJlcXVpcmVkIG9ubHkgaW4gZGVlcCBjb2xvciBtb2RlLAoJCSAqICBhcyBwYWNraW5nIHBoYXNlIHdvdWxkIHJlcXVpcmUgdG8gYmUgaW5kaWNhdGVkLAoJCSAqICBlbHNlIGJ5cGFzcyB0aGlzCgkJICovCgkJaWYgKHRlbXAgIT0gSERNSV9WSURfTU9ERV9ESVRIRVJfVE9fMjRfQklUU19NT0RFKSB7CgkJCV9fcmF3X3dyaXRlbCgoSERNSV9QQl9DVFJMMl9HRU5fRU5fTUFTSyB8CgkJCQkJCUhETUlfUEJfQ1RSTDJfR0VOX1JQVF9NQVNLKSwKCQkJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQkJIEhETUlfQ09SRV9QQl9DVFJMMl9PRkZTRVQpKTsKCQl9IGVsc2UgewoJCQlfX3Jhd193cml0ZWwoKEhETUlfUEJfQ1RSTDJfQ1BfRU5fTUFTSyB8CgkJCQkJCUhETUlfUEJfQ1RSTDJfQ1BfUlBUX01BU0sgfAoJCQkJCQlIRE1JX1BCX0NUUkwyX0dFTl9FTl9NQVNLIHwKCQkJCQkJSERNSV9QQl9DVFJMMl9HRU5fUlBUX01BU0spLAoJCQkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCQkgSERNSV9DT1JFX1BCX0NUUkwyX09GRlNFVCkpOwoJCX0KCgkJdGVtcCA9CgkJCV9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPndwX2Jhc2VfYWRkciArCgkJCQkJCUhETUlfV1BfVklERU9fQ0ZHX09GRlNFVCkpOwoJCXRlbXAgfD0gSERNSV9XUF9WSURFT19DRkdfRU5BQkxFX01BU0s7CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHIgKwoJCQkJIEhETUlfV1BfVklERU9fQ0ZHX09GRlNFVCkpOwoJCWluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nID0gVFJVRTsKCQlUSERCRygiU3RhcnRlZCB0aGUgcG9ydCIpOwoJfSBlbHNlIHsKCQlpZiAoaW5zdF9jb250ZXh0LT5pc19yZWN2cl9zZW5zZWQgPT0gVFJVRSl7CgkJCXJ0bl92YWx1ZSA9IC1FRkFVTFQgOwoJCQlUSERCRygiTm8gU2lua3MgZGVjdGVkLW5vdCBzdGFydGluZyIpOwoJCX0KCX0KZXhpdF90aGlzX2Z1bmM6CglUSERCRygidGk4MXh4X2hkbWlfbGliX3N0YXJ0PDw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CgppbnQgdGk4MXh4X2hkbWlfbGliX3N0b3Aodm9pZCAqaGFuZGxlLCB2b2lkICphcmdzKQp7CglpbnQgcnRuX3ZhbHVlID0gMHgwOwoJc3RydWN0IGluc3RhbmNlX2NmZyAqaW5zdF9jb250ZXh0ID0gTlVMTDsKCXZvbGF0aWxlIHUzMiB0ZW1wOwoKCVRIREJHKCI+Pj4+dGk4MXh4X2hkbWlfbGliX3N0b3AiKTsKCglpZiAoaGFuZGxlID09IE5VTEwpIHsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlUSERCRygiSW52YWxpZCBoYW5kbGUvY29uZmlnIHBvaW50ZXIiKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaW5zdF9jb250ZXh0ID0gKHN0cnVjdCBpbnN0YW5jZV9jZmcgKikgaGFuZGxlOwoJaWYgKGluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nID09IFRSVUUpIHsKCQlUSERCRygiVHJ5aW5nIHRvIHN0b3AgdGhlIHBvcnQiKTsKCQl0ZW1wID0gX19yYXdfcmVhZGwoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQlIRE1JX0NPUkVfU1JTVF9PRkZTRVQpOwoJCXRlbXAgfD0gSERNSV9TUlNUX1NXUlNUX01BU0s7CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArIEhETUlfQ09SRV9TUlNUX09GRlNFVCkpOwoJCXRlbXAgPQoJCQlfX3Jhd19yZWFkbCgoaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHIgKwoJCQkJCQlIRE1JX1dQX1ZJREVPX0NGR19PRkZTRVQpKTsKCQl0ZW1wICY9ICh+KEhETUlfV1BfVklERU9fQ0ZHX0VOQUJMRV9NQVNLKSk7CgkJX19yYXdfd3JpdGVsKHRlbXAsCgkJCQkoaW5zdF9jb250ZXh0LT53cF9iYXNlX2FkZHIgKwoJCQkJIEhETUlfV1BfVklERU9fQ0ZHX09GRlNFVCkpOwoJCWluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nID0gRkFMU0U7CgkJVEhEQkcoIlN0b3BwZWQgdGhlIHBvcnQiKTsKCX0KZXhpdF90aGlzX2Z1bmM6CglUSERCRygidGk4MXh4X2hkbWlfbGliX3N0b3A8PDw8Iik7CglyZXR1cm4gKHJ0bl92YWx1ZSk7Cn0KCmludCB0aTgxeHhfaGRtaV9saWJfY29udHJvbCh2b2lkICpoYW5kbGUsCgkJdTMyIGNtZCwgdm9pZCAqY21kQXJncywgdm9pZCAqYWRkaXRpb25hbEFyZ3MpCnsKCWludCBydG5fdmFsdWUgPSAweDA7CglzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQgPSBOVUxMOwoJdm9sYXRpbGUgdW5zaWduZWQgaW50IHRlbXA7CglzdHJ1Y3QgdGk4MXh4aGRtaV9zdGF0dXMgICpzdGF0dXM7CgoJVEhEQkcoIj4+Pj50aTgxeHhfaGRtaV9saWJfY29udHJvbCIpOwoJLyogVmFsaWRhdGUgdGhlIGhhbmRsZSBhbmQgZXhlY3V0ZSB0aGUgY29tbWFuZC4gKi8KCWlmIChoYW5kbGUgPT0gTlVMTCkgewoJCXJ0bl92YWx1ZSA9IC1FRkFVTFQgOwoJCVRIREJHKCJJbnZhbGlkIGhhbmRsZS9jbWRBcmdzIHBvaW50ZXIiKTsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaW5zdF9jb250ZXh0ID0gKHN0cnVjdCBpbnN0YW5jZV9jZmcgKikgaGFuZGxlOwoJc3dpdGNoIChjbWQpIHsKCQljYXNlIFRJODFYWEhETUlfU1RBUlQ6CgkJCXJ0bl92YWx1ZSA9IHRpODF4eF9oZG1pX2xpYl9zdGFydChoYW5kbGUsIE5VTEwpOwoJCQlicmVhazsKCgkJY2FzZSBUSTgxWFhIRE1JX1NUT1A6CgkJCXJ0bl92YWx1ZSA9IHRpODF4eF9oZG1pX2xpYl9zdG9wKGhhbmRsZSwgTlVMTCk7CgkJCWJyZWFrOwoJCWNhc2UgVEk4MVhYSERNSV9HRVRfU1RBVFVTOgoJCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQkJaWYgKGNtZEFyZ3MpIHsKCQkJCXN0YXR1cyA9IChzdHJ1Y3QgdGk4MXh4aGRtaV9zdGF0dXMgKiljbWRBcmdzOwoJCQkJc3RhdHVzLT5pc19oZG1pX3N0cmVhbWluZyA9CgkJCQkJCWluc3RfY29udGV4dC0+aXNfc3RyZWFtaW5nOwoJCQkJdGVtcCAgPSBfX3Jhd19yZWFkbChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyCgkJCQkJKyBIRE1JX0NPUkVfU1lTX1NUQVRfT0ZGU0VUKTsKCQkJCXRlbXAgJj0gSERNSV9TWVNfU1RBVF9IUERfTUFTSzsKCQkJCXN0YXR1cy0+aXNfaHBkX2RldGVjdGVkID0KCQkJCQl0ZW1wID4+IEhETUlfU1lTX1NUQVRfSFBEX1NISUZUOwoJCQkJcnRuX3ZhbHVlID0gMHgwOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgVEk4MVhYSERNSV9SRUFEX0VESUQ6CgkJCXJ0bl92YWx1ZSA9IHRpODF4eF9oZG1pX2xpYl9yZWFkX2VkaWQoaGFuZGxlLAoJCQkJCShzdHJ1Y3QgdGk4MXh4ZGhtaV9lZGlkX3BhcmFtcyAqKQoJCQkJCWNtZEFyZ3MsCgkJCQkJTlVMTCk7CgkJCWJyZWFrOwoJCQkvKiBUT0RPIE5vdCBzdXBwb3J0ZWQgZm9yIG5vdyAqLwojaWYgMAoJCWNhc2UgVEk4MVhYSERNSV9HRVRfQ09ORklHOgoJCQlydG5fdmFsdWUgPSB0aTgxeHhfaGRtaV9saWJfZ2V0X2NmZyhoYW5kbGUsCgkJCQkJKHN0cnVjdCBoZG1pX2NmZ19wYXJhbXMgKikKCQkJCQljbWRBcmdzLAoJCQkJCU5VTEwpOwoJCQlicmVhazsKCQljYXNlIFRJODFYWEhETUlfU0VUX0NPTkZJRzoKCQkJewoJCQkJaWYgKE5VTEwgIT0gY21kQXJncykKCQkJCXsKCQkJCQlydG5fdmFsdWUgPQoJCQkJCQkodGk4MXh4X2hkbWlfbGliX2NvbmZpZygoc3RydWN0IGhkbWlfY2ZnX3BhcmFtcyAqKWNtZEFyZ3MpKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQkJCX0KCgkJCX0KI2VuZGlmCgkJY2FzZSBUSTgxWFhIRE1JX1NFVF9NT0RFOgoJCQlydG5fdmFsdWUgPSAgKHRpODF4eF9oZG1pX3NldF9tb2RlKChlbnVtIHRpODF4eGhkbWlfbW9kZSljbWRBcmdzLAoJCQkJCQlpbnN0X2NvbnRleHQpKTsKCQkJYnJlYWs7CgkJY2FzZSBUSTgxWFhIRE1JX0dFVF9NT0RFOgoJCQlyZXR1cm4gKGluc3RfY29udGV4dC0+aGRtaV9tb2RlKTsKCQljYXNlIFRJODFYWEhETUlfVEVTVF9IRE1JOgoJCQlwcmludGsoIkluIEhETUkgVEVTVCB2ZW5jX2Jhc2UgPSAlZFxuIiwgaW5zdF9jb250ZXh0LT52ZW5jX2Jhc2VfYWRkcik7CiNpZmRlZiBIRE1JX1RFU1QKCQkJc3dpdGNoICgoZW51bSB0aTgxeHhoZG1pX21vZGUpY21kQXJncykKCQkJewoJCQkJY2FzZSBoZG1pXzEwODBQXzMwX21vZGU6CgkJCQkJY29uZmlndXJlX3ZlbmNfMTA4MHAzMCgodTMyICopaW5zdF9jb250ZXh0LT52ZW5jX2Jhc2VfYWRkciwgMCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGhkbWlfMTA4MFBfNjBfbW9kZToKCQkJCQljb25maWd1cmVfdmVuY18xMDgwcDYwKCh1MzIgKilpbnN0X2NvbnRleHQtPnZlbmNfYmFzZV9hZGRyLCAwKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgaGRtaV8xMDgwSV82MF9tb2RlOgoJCQkJCWNvbmZpZ3VyZV92ZW5jXzEwODBpNjAoKHUzMiAqKWluc3RfY29udGV4dC0+dmVuY19iYXNlX2FkZHIsIDApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBoZG1pXzcyMFBfNjBfbW9kZToKCQkJCQljb25maWd1cmVfdmVuY183MjBwNjAoKHUzMiAqKWluc3RfY29udGV4dC0+dmVuY19iYXNlX2FkZHIsIDApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdCA6CgkJCQkJcnRuX3ZhbHVlID0gLUVJTlZBTDsKCQkJfQojZW5kaWYKCQkJcnRuX3ZhbHVlID0gIHRpODF4eF9oZG1pX3NldF9tb2RlKChlbnVtIHRpODF4eGhkbWlfbW9kZSljbWRBcmdzLAoJCQkJCWluc3RfY29udGV4dCk7CgkJCWJyZWFrOwoJCWNhc2UgVEk4MVhYSERNSV9HRVRfUEhZX1NUQVQ6CgkJCWlmIChjbWRBcmdzKQoJCQl7CgkJCQlnZXRfcGh5X3N0YXR1cyhpbnN0X2NvbnRleHQsIGNtZEFyZ3MpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcnRuX3ZhbHVlID0gLUVGQVVMVDsKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlydG5fdmFsdWUgPSAtRUlOVkFMOwoJCQlUSERCRygiVW4tcmVjb2dhbml6ZWQgY29tbWFuZCIpOwoJCQlicmVhazsKCX0KZXhpdF90aGlzX2Z1bmM6CglUSERCRygidGk4MXh4X2hkbWlfbGliX2NvbnRyb2w8PDw8Iik7CglyZXR1cm4gKHJ0bl92YWx1ZSk7Cn0Kc3RhdGljIGludCB0aTgxeHhfaGRtaV9saWJfcmVhZF9lZGlkKHZvaWQgKmhhbmRsZSwKCQlzdHJ1Y3QgdGk4MXh4ZGhtaV9lZGlkX3BhcmFtcyAqcl9wYXJhbXMsCgkJdm9pZCAqYXJncykKewoJaW50IHJ0bl92YWx1ZSA9IDB4MDsKCXUzMiByX2J5dGVfY250ID0gMHgwOwoJdm9sYXRpbGUgdTMyIGlvX3RpbWVvdXQgPSAweDA7Cgl2b2xhdGlsZSB1MzIgdGltZW91dDsKCXZvbGF0aWxlIHUzMiBjbWRfc3RhdHVzOwoJdm9sYXRpbGUgdTMyIHRlbXA7Cgl1OCAqYnVmX3B0ciA9IE5VTEw7CglzdHJ1Y3QgaW5zdGFuY2VfY2ZnICppbnN0X2NvbnRleHQgPSBOVUxMOwoKCVRIREJHKCI+Pj4+dGk4MXh4X2hkbWlfbGliX3JlYWRfZWRpZCIpOwoKCWlmICgoaGFuZGxlID09IE5VTEwpIHx8IChyX3BhcmFtcyA9PSBOVUxMKSkgewoJCVRIREJHKCJJbnZhbGlkIHBhcmFtcyAiKTsKCQlydG5fdmFsdWUgPSAtRUZBVUxUIDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoJaW5zdF9jb250ZXh0ID0gaGFuZGxlOwoJYnVmX3B0ciA9ICh1OCAqKSByX3BhcmFtcy0+YnVmZmVyX3B0cjsKCWlmIChidWZfcHRyID09IE5VTEwpIHsKCQlUSERCRygiSW52YWxpZCBidWZmZXIgcG9pbnRlciIpOwoJCXJ0bl92YWx1ZSA9IC1FRkFVTFQgOwoJCWdvdG8gZXhpdF90aGlzX2Z1bmM7Cgl9CgkvKiAxMCBiaXRzIHRvIGhvbGQgdGhlIGNvdW50IC0gd2hpY2ggd291bGQgYmUgM0ZGICovCglpZiAoKHJfcGFyYW1zLT5ub19vZl9ieXRlcyA9PSAweDApCgkJCXx8IChyX3BhcmFtcy0+bm9fb2ZfYnl0ZXMgPiAweDNGRikpIHsKCQlUSERCRygiSW52YWxpZCBieXRlIGNvdW50Iik7CgkJcnRuX3ZhbHVlID0gLUVGQVVMVCA7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCXJfcGFyYW1zLT5ub19vZl9ieXRlc19yZWFkID0gMHgwOwoJaWYgKGluc3RfY29udGV4dC0+aXNfcmVjdnJfc2Vuc2VkICE9IFRSVUUpIHsKCQlUSERCRygiSFBEIG5vdCBkZXRlY3RlZCAtIEhBTCBub3Qgb3BlbmVkIik7CgkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCWlmIChyX3BhcmFtcy0+dGltZW91dCA9PSAweDApewoJCVRIREJHKCJDb3VsZCBub3QgcmVhZCBpbiBnaXZlbiB0aW1lIik7CgkJcnRuX3ZhbHVlID0gLUVUSU1FIDsKCQlnb3RvIGV4aXRfdGhpc19mdW5jOwoJfQoKCXRlbXAgPSBfX3Jhd19yZWFkbCgoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQlIRE1JX0NPUkVfUklfU1RBVF9PRkZTRVQpKTsKCWlmICgodGVtcCAmIEhETUlfUklfU1RBVF9SSV9TVEFSVEVEX01BU0spID09CgkJCUhETUlfUklfU1RBVF9SSV9TVEFSVEVEX01BU0spIHsKCQlUSERCRygiUkkgQ2hlY2sgZW5ibGVkIC0gRERDIGJ1cyBidXN5Iik7CgkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJZ290byBleGl0X3RoaXNfZnVuYzsKCX0KCglpZiAoaW5zdF9jb250ZXh0LT5pc19zY2xfY2xvY2tlZCA9PSBGQUxTRSkgewoJCV9fcmF3X3dyaXRlbChIRE1JX0REQ19DTURfQ0xPQ0tfU0NMLAoJCQkJKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKyBIRE1JX0NPUkVfRERDX0NNRF9PRkZTRVQpKTsKCgkJdGltZW91dCA9IEhETUlfRERDX0NNRF9USU1FT1VUOwoJCXRlbXAgPSBfX3Jhd19yZWFkbCgoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQkJSERNSV9DT1JFX0REQ19TVEFUVVNfT0ZGU0VUKSk7CgkJd2hpbGUgKCh0ZW1wICYgSERNSV9ERENfU1RBVFVTX0lOX1BST0dfTUFTSykKCQkJCT09IEhETUlfRERDX1NUQVRVU19JTl9QUk9HX01BU0spIHsKCQkJdGltZW91dC0tOwoJCQl0ZW1wID0gX19yYXdfcmVhZGwoKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJCQlIRE1JX0NPUkVfRERDX1NUQVRVU19PRkZTRVQpKTsKCQl9CgkJaWYgKHRpbWVvdXQgPT0gMHgwKSB7CgkJCVRIREJHKCJDb3VsZCBub3QgY2xvY2sgU0NMIGJlZm9yZSByZWFkIik7CgkJCXJ0bl92YWx1ZSA9IC1FVElNRSA7CgkJCWdvdG8gZXhpdF90aGlzX2Z1bmM7CgkJfQoJCWluc3RfY29udGV4dC0+aXNfc2NsX2Nsb2NrZWQgPSBUUlVFOwoJfQoKCV9fcmF3X3dyaXRlbCgoSERNSV9ERENfQUREUl9ERENfQUREUl9NQVNLICYgcl9wYXJhbXMtPnNsYXZlX2FkZHJlc3MpLAoJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArIEhETUlfQ09SRV9ERENfQUREUl9PRkZTRVQpKTsKCglfX3Jhd193cml0ZWwoKEhETUlfRERDX1NFR01fRERDX1NFR01fTUFTSyAmIHJfcGFyYW1zLT5zZWdtZW50X3B0ciksCgkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX0REQ19TRUdNX09GRlNFVCkpOwoKCV9fcmF3X3dyaXRlbCgoSERNSV9ERENfT0ZGU0VUX0REQ19PRkZTRVRfTUFTSyAmIHJfcGFyYW1zLT5vZmZzZXQpLAoJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArIEhETUlfQ09SRV9ERENfT0ZGU0VUX09GRlNFVCkpOwoKCV9fcmF3X3dyaXRlbCgoSERNSV9ERENfQ09VTlQxX0REQ19DT1VOVF9NQVNLICYgcl9wYXJhbXMtPm5vX29mX2J5dGVzKSwKCQkJKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKyBIRE1JX0NPUkVfRERDX0NPVU5UMV9PRkZTRVQpKTsKCglfX3Jhd193cml0ZWwoKEhETUlfRERDX0NPVU5UMl9ERENfQ09VTlRfTUFTSyAmCgkJCQkocl9wYXJhbXMtPm5vX29mX2J5dGVzID4+IDB4MDgpKSwKCQkJKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKyBIRE1JX0NPUkVfRERDX0NPVU5UMl9PRkZTRVQpKTsKCglfX3Jhd193cml0ZWwoSERNSV9ERENfQ01EX0NMRUFSX0ZJRk8sCgkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX0REQ19DTURfT0ZGU0VUKSk7CgoJdGltZW91dCA9IEhETUlfRERDX0NNRF9USU1FT1VUOwoJdGVtcCA9IF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCUhETUlfQ09SRV9ERENfU1RBVFVTX09GRlNFVCkpOwoJd2hpbGUgKCh0ZW1wICYgSERNSV9ERENfU1RBVFVTX0lOX1BST0dfTUFTSykKCQkJPT0gSERNSV9ERENfU1RBVFVTX0lOX1BST0dfTUFTSykgewoJCXRpbWVvdXQtLTsKCQl0ZW1wID0gX19yYXdfcmVhZGwoKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJCUhETUlfQ09SRV9ERENfU1RBVFVTX09GRlNFVCkpOwoJfQoJaWYgKHRpbWVvdXQgPT0gMHgwKSB7CgkJVEhEQkcoIkNvdWxkIG5vdCBjbGVhciBGSUZPcyIpOwoJCXJ0bl92YWx1ZSA9IC1FVElNRSA7CgkJZ290byBhYm9ydF9leGl0X3RoaXNfZnVuYzsKCX0KCglpb190aW1lb3V0ID0gcl9wYXJhbXMtPnRpbWVvdXQ7CglpZiAocl9wYXJhbXMtPnVzZV9lZGRjX3JlYWQgPT0gMHgwKXsKCQlfX3Jhd193cml0ZWwoSERNSV9ERENfQ01EX1NFUV9SX05PX0FDS19PTl9MQVNUX0JZVEUsCgkJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArIEhETUlfQ09SRV9ERENfQ01EX09GRlNFVCkpOwoJfWVsc2V7CgkJX19yYXdfd3JpdGVsKEhETUlfRERDX0NNRF9FRERDX1JfTk9fQUNLX09OX0xBU1RfQllURSwKCQkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX0REQ19DTURfT0ZGU0VUKSk7Cgl9Cgl0ZW1wID0gX19yYXdfcmVhZGwoKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJSERNSV9DT1JFX0REQ19GSUZPQ05UX09GRlNFVCkpOwoJd2hpbGUgKHRlbXAgPT0gMHgwKSB7CgkJaWYgKGlvX3RpbWVvdXQgPT0gMHgwKXsKCQkJcnRuX3ZhbHVlID0gLUVUSU1FIDsKCQkJZ290byBhYm9ydF9leGl0X3RoaXNfZnVuYzsKCQl9CgkJdGVtcCA9IF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCQlIRE1JX0NPUkVfRERDX0ZJRk9DTlRfT0ZGU0VUKSk7CgkJaW9fdGltZW91dC0tOwoJfQoJLyogQ2hlY2sgZm9yIGVycm9ycyAqLwoJY21kX3N0YXR1cyA9IF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCUhETUlfQ09SRV9ERENfU1RBVFVTX09GRlNFVCkpOwoKCWlmICgoY21kX3N0YXR1cyAmIEhETUlfRERDX1NUQVRVU19CVVNfTE9XX01BU0spID09CgkJCUhETUlfRERDX1NUQVRVU19CVVNfTE9XX01BU0spIHsKCQkvKiBCdXMgaXMgYmVpbmcgaGVsZCBieSB0aGUgc2xhdmUgLyBvdGhlcnMuLi4KCQkgICBVbHRyYSBTbG93IHNsYXZlcz8gKi8KCQlUSERCRygiQnVzIGJlaW5nIGhlbGQgbG93Iik7CgkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJZ290byBhYm9ydF9leGl0X3RoaXNfZnVuYzsKCX0KCWlmICgoY21kX3N0YXR1cyAmIEhETUlfRERDX1NUQVRVU19OT19BQ0tfTUFTSykgPT0KCQkJSERNSV9ERENfU1RBVFVTX05PX0FDS19NQVNLKSB7CgkJLyogVW5QbHVnZ2VkIFRWPyAqLwoJCVRIREJHKCJObyBBQ0sgZnJvbSB0aGUgZGV2aWNlIik7CgkJcnRuX3ZhbHVlID0gLUVJTlZBTCA7CgkJZ290byBhYm9ydF9leGl0X3RoaXNfZnVuYzsKCX0KCXdoaWxlIChyX2J5dGVfY250IDwgcl9wYXJhbXMtPm5vX29mX2J5dGVzKXsKCQlpZiAoaW5zdF9jb250ZXh0LT5pc19yZWN2cl9zZW5zZWQgIT0gVFJVRSkgewoJCQlydG5fdmFsdWUgPSAtRVRJTUUgOwoJCQlnb3RvIGFib3J0X2V4aXRfdGhpc19mdW5jOwoJCX0KCQl0ZW1wID0gX19yYXdfcmVhZGwoKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJCUhETUlfQ09SRV9ERENfRklGT0NOVF9PRkZTRVQpKTsKCQlpZiAodGVtcCA9PSAweDApewoJCQl3aGlsZSAodGVtcCA9PSAweDApCgkJCXsKCQkJCWlmIChpb190aW1lb3V0ID09IDB4MCl7CgkJCQkJcnRuX3ZhbHVlID0gLUVUSU1FIDsKCQkJCQlnb3RvIGFib3J0X2V4aXRfdGhpc19mdW5jOwoJCQkJfQoJCQkJaW9fdGltZW91dC0tOwoJCQkJdGVtcCA9IF9fcmF3X3JlYWRsKAoJCQkJCQkoaW5zdF9jb250ZXh0LT5jb3JlX2Jhc2VfYWRkciArCgkJCQkJCSBIRE1JX0NPUkVfRERDX0ZJRk9DTlRfT0ZGU0VUKSk7CgkJCX0KCQl9CgoJCSpidWZfcHRyID0gKHU4KSAoKF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyCgkJCQkJCQkrIEhETUlfQ09SRV9ERENfREFUQV9PRkZTRVQpKSkgJgoJCQkJSERNSV9ERENfREFUQV9ERENfREFUQV9NQVNLKTsKCQlidWZfcHRyKys7CgkJcl9ieXRlX2NudCsrOwoJfQoJLyoKCSAqIEFib3J0aW5nIHRoZSBSRUFEIGNvbW1hbmQuCgkgKiBJbiBjYXNlIHdlIGhhdmUgY29tcGxldGVkIGFzIGV4cGVjdGVkIC0gbm8gb2YgYnl0ZXMgdG8gcmVhZCBpcyByZWFkCgkgKgktIE5vIGlzc3VlcywgYWJvcnRpbmcgb24gY29tcGxldGlvbiBpcyBPSwoJICogSWYgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYmVmb3JlIHJlYWQgY291bGQgYmUgY29tcGxldGUsCgkgKgktIEFib3J0IHNob3VsZCBsZWF2ZSB0aGUgYnVzIGNsZWFuCgkgKiBJZiBhbnkgb3RoZXIgZXJyb3IKCSAqCS0gRW5zdXJlIGJ1cyBpcyBjbGVhbgoJICovCglyX3BhcmFtcy0+bm9fb2ZfYnl0ZXNfcmVhZCA9IHJfYnl0ZV9jbnQ7CgphYm9ydF9leGl0X3RoaXNfZnVuYzoKCV9fcmF3X3dyaXRlbChIRE1JX0REQ19DTURfQUJPUlQsCgkJCShpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsgSERNSV9DT1JFX0REQ19DTURfT0ZGU0VUKSk7CgoJdGVtcCA9IF9fcmF3X3JlYWRsKChpbnN0X2NvbnRleHQtPmNvcmVfYmFzZV9hZGRyICsKCQkJCUhETUlfQ09SRV9ERENfU1RBVFVTX09GRlNFVCkpOwoJd2hpbGUgKCh0ZW1wICYgSERNSV9ERENfU1RBVFVTX0lOX1BST0dfTUFTSykKCQkJPT0gSERNSV9ERENfU1RBVFVTX0lOX1BST0dfTUFTSykgewoJCXRpbWVvdXQtLTsKCQl0ZW1wID0gX19yYXdfcmVhZGwoKGluc3RfY29udGV4dC0+Y29yZV9iYXNlX2FkZHIgKwoJCQkJCUhETUlfQ09SRV9ERENfU1RBVFVTX09GRlNFVCkpOwoJfQpleGl0X3RoaXNfZnVuYzoKCVRIREJHKCJ0aTgxeHhfaGRtaV9saWJfcmVhZF9lZGlkPDw8PCIpOwoJcmV0dXJuIChydG5fdmFsdWUpOwp9CnN0YXRpYyB2b2lkIEhETUlfQVJHU19DSEVDSyh1MzIgY29uZGl0aW9uKQp7CglyZXR1cm47Cn0K